Blame memkind-1.10.1/jemalloc/src/jemalloc_cpp.cpp

Packit Service 7f3b24
#include <mutex>
Packit Service 7f3b24
#include <new>
Packit Service 7f3b24
Packit Service 7f3b24
#define JEMALLOC_CPP_CPP_
Packit Service 7f3b24
#ifdef __cplusplus
Packit Service 7f3b24
extern "C" {
Packit Service 7f3b24
#endif
Packit Service 7f3b24
Packit Service 7f3b24
#include "jemalloc/internal/jemalloc_preamble.h"
Packit Service 7f3b24
#include "jemalloc/internal/jemalloc_internal_includes.h"
Packit Service 7f3b24
Packit Service 7f3b24
#ifdef __cplusplus
Packit Service 7f3b24
}
Packit Service 7f3b24
#endif
Packit Service 7f3b24
Packit Service 7f3b24
// All operators in this file are exported.
Packit Service 7f3b24
Packit Service 7f3b24
// Possibly alias hidden versions of malloc and sdallocx to avoid an extra plt
Packit Service 7f3b24
// thunk?
Packit Service 7f3b24
//
Packit Service 7f3b24
// extern __typeof (sdallocx) sdallocx_int
Packit Service 7f3b24
//  __attribute ((alias ("sdallocx"),
Packit Service 7f3b24
//		visibility ("hidden")));
Packit Service 7f3b24
//
Packit Service 7f3b24
// ... but it needs to work with jemalloc namespaces.
Packit Service 7f3b24
Packit Service 7f3b24
void	*operator new(std::size_t size);
Packit Service 7f3b24
void	*operator new[](std::size_t size);
Packit Service 7f3b24
void	*operator new(std::size_t size, const std::nothrow_t &) noexcept;
Packit Service 7f3b24
void	*operator new[](std::size_t size, const std::nothrow_t &) noexcept;
Packit Service 7f3b24
void	operator delete(void *ptr) noexcept;
Packit Service 7f3b24
void	operator delete[](void *ptr) noexcept;
Packit Service 7f3b24
void	operator delete(void *ptr, const std::nothrow_t &) noexcept;
Packit Service 7f3b24
void	operator delete[](void *ptr, const std::nothrow_t &) noexcept;
Packit Service 7f3b24
Packit Service 7f3b24
#if __cpp_sized_deallocation >= 201309
Packit Service 7f3b24
/* C++14's sized-delete operators. */
Packit Service 7f3b24
void	operator delete(void *ptr, std::size_t size) noexcept;
Packit Service 7f3b24
void	operator delete[](void *ptr, std::size_t size) noexcept;
Packit Service 7f3b24
#endif
Packit Service 7f3b24
Packit Service 7f3b24
JEMALLOC_NOINLINE
Packit Service 7f3b24
static void *
Packit Service 7f3b24
handleOOM(std::size_t size, bool nothrow) {
Packit Service 7f3b24
	void *ptr = nullptr;
Packit Service 7f3b24
Packit Service 7f3b24
	while (ptr == nullptr) {
Packit Service 7f3b24
		std::new_handler handler;
Packit Service 7f3b24
		// GCC-4.8 and clang 4.0 do not have std::get_new_handler.
Packit Service 7f3b24
		{
Packit Service 7f3b24
			static std::mutex mtx;
Packit Service 7f3b24
			std::lock_guard<std::mutex> lock(mtx);
Packit Service 7f3b24
Packit Service 7f3b24
			handler = std::set_new_handler(nullptr);
Packit Service 7f3b24
			std::set_new_handler(handler);
Packit Service 7f3b24
		}
Packit Service 7f3b24
		if (handler == nullptr)
Packit Service 7f3b24
			break;
Packit Service 7f3b24
Packit Service 7f3b24
		try {
Packit Service 7f3b24
			handler();
Packit Service 7f3b24
		} catch (const std::bad_alloc &) {
Packit Service 7f3b24
			break;
Packit Service 7f3b24
		}
Packit Service 7f3b24
Packit Service 7f3b24
		ptr = je_malloc(size);
Packit Service 7f3b24
	}
Packit Service 7f3b24
Packit Service 7f3b24
	if (ptr == nullptr && !nothrow)
Packit Service 7f3b24
		std::__throw_bad_alloc();
Packit Service 7f3b24
	return ptr;
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
template <bool IsNoExcept>
Packit Service 7f3b24
JEMALLOC_ALWAYS_INLINE
Packit Service 7f3b24
void *
Packit Service 7f3b24
newImpl(std::size_t size) noexcept(IsNoExcept) {
Packit Service 7f3b24
	void *ptr = je_malloc(size);
Packit Service 7f3b24
	if (likely(ptr != nullptr))
Packit Service 7f3b24
		return ptr;
Packit Service 7f3b24
Packit Service 7f3b24
	return handleOOM(size, IsNoExcept);
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
void *
Packit Service 7f3b24
operator new(std::size_t size) {
Packit Service 7f3b24
	return newImpl<false>(size);
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
void *
Packit Service 7f3b24
operator new[](std::size_t size) {
Packit Service 7f3b24
	return newImpl<false>(size);
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
void *
Packit Service 7f3b24
operator new(std::size_t size, const std::nothrow_t &) noexcept {
Packit Service 7f3b24
	return newImpl<true>(size);
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
void *
Packit Service 7f3b24
operator new[](std::size_t size, const std::nothrow_t &) noexcept {
Packit Service 7f3b24
	return newImpl<true>(size);
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
void
Packit Service 7f3b24
operator delete(void *ptr) noexcept {
Packit Service 7f3b24
	je_free(ptr);
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
void
Packit Service 7f3b24
operator delete[](void *ptr) noexcept {
Packit Service 7f3b24
	je_free(ptr);
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
void
Packit Service 7f3b24
operator delete(void *ptr, const std::nothrow_t &) noexcept {
Packit Service 7f3b24
	je_free(ptr);
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
void operator delete[](void *ptr, const std::nothrow_t &) noexcept {
Packit Service 7f3b24
	je_free(ptr);
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
#if __cpp_sized_deallocation >= 201309
Packit Service 7f3b24
Packit Service 7f3b24
void
Packit Service 7f3b24
operator delete(void *ptr, std::size_t size) noexcept {
Packit Service 7f3b24
	if (unlikely(ptr == nullptr)) {
Packit Service 7f3b24
		return;
Packit Service 7f3b24
	}
Packit Service 7f3b24
	je_sdallocx_noflags(ptr, size);
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
void operator delete[](void *ptr, std::size_t size) noexcept {
Packit Service 7f3b24
	if (unlikely(ptr == nullptr)) {
Packit Service 7f3b24
		return;
Packit Service 7f3b24
	}
Packit Service 7f3b24
	je_sdallocx_noflags(ptr, size);
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
#endif  // __cpp_sized_deallocation