|
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
|