Dep/jemalloc: Update to 5.3.0
Closes #31684 (cherry picked from commit ec31dc8d3ce302e42c26359adc894bd736a45fb2)
This commit is contained in:
1 parent
44ed223456
commit
b17996419b
194 files changed
+28410
-12418
No files matched your search
@@ -39,9 +39,29 @@ void operator delete(void *ptr, std::size_t size) noexcept;
|
||||
void operator delete[](void *ptr, std::size_t size) noexcept;
|
||||
#endif
|
||||
|
||||
#if __cpp_aligned_new >= 201606
|
||||
/* C++17's over-aligned operators. */
|
||||
void *operator new(std::size_t size, std::align_val_t);
|
||||
void *operator new(std::size_t size, std::align_val_t, const std::nothrow_t &) noexcept;
|
||||
void *operator new[](std::size_t size, std::align_val_t);
|
||||
void *operator new[](std::size_t size, std::align_val_t, const std::nothrow_t &) noexcept;
|
||||
void operator delete(void* ptr, std::align_val_t) noexcept;
|
||||
void operator delete(void* ptr, std::align_val_t, const std::nothrow_t &) noexcept;
|
||||
void operator delete(void* ptr, std::size_t size, std::align_val_t al) noexcept;
|
||||
void operator delete[](void* ptr, std::align_val_t) noexcept;
|
||||
void operator delete[](void* ptr, std::align_val_t, const std::nothrow_t &) noexcept;
|
||||
void operator delete[](void* ptr, std::size_t size, std::align_val_t al) noexcept;
|
||||
#endif
|
||||
|
||||
JEMALLOC_NOINLINE
|
||||
static void *
|
||||
handleOOM(std::size_t size, bool nothrow) {
|
||||
if (opt_experimental_infallible_new) {
|
||||
safety_check_fail("<jemalloc>: Allocation failed and "
|
||||
"opt.experimental_infallible_new is true. Aborting.\n");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void *ptr = nullptr;
|
||||
|
||||
while (ptr == nullptr) {
|
||||
@@ -71,15 +91,22 @@ handleOOM(std::size_t size, bool nothrow) {
|
||||
return ptr;
|
||||
}
|
||||
|
||||
template <bool IsNoExcept>
|
||||
JEMALLOC_NOINLINE
|
||||
static void *
|
||||
fallback_impl(std::size_t size) noexcept(IsNoExcept) {
|
||||
void *ptr = malloc_default(size);
|
||||
if (likely(ptr != nullptr)) {
|
||||
return ptr;
|
||||
}
|
||||
return handleOOM(size, IsNoExcept);
|
||||
}
|
||||
|
||||
template <bool IsNoExcept>
|
||||
JEMALLOC_ALWAYS_INLINE
|
||||
void *
|
||||
newImpl(std::size_t size) noexcept(IsNoExcept) {
|
||||
void *ptr = je_malloc(size);
|
||||
if (likely(ptr != nullptr))
|
||||
return ptr;
|
||||
|
||||
return handleOOM(size, IsNoExcept);
|
||||
return imalloc_fastpath(size, &fallback_impl<IsNoExcept>);
|
||||
}
|
||||
|
||||
void *
|
||||
@@ -102,6 +129,42 @@ operator new[](std::size_t size, const std::nothrow_t &) noexcept {
|
||||
return newImpl<true>(size);
|
||||
}
|
||||
|
||||
#if __cpp_aligned_new >= 201606
|
||||
|
||||
template <bool IsNoExcept>
|
||||
JEMALLOC_ALWAYS_INLINE
|
||||
void *
|
||||
alignedNewImpl(std::size_t size, std::align_val_t alignment) noexcept(IsNoExcept) {
|
||||
void *ptr = je_aligned_alloc(static_cast<std::size_t>(alignment), size);
|
||||
if (likely(ptr != nullptr)) {
|
||||
return ptr;
|
||||
}
|
||||
|
||||
return handleOOM(size, IsNoExcept);
|
||||
}
|
||||
|
||||
void *
|
||||
operator new(std::size_t size, std::align_val_t alignment) {
|
||||
return alignedNewImpl<false>(size, alignment);
|
||||
}
|
||||
|
||||
void *
|
||||
operator new[](std::size_t size, std::align_val_t alignment) {
|
||||
return alignedNewImpl<false>(size, alignment);
|
||||
}
|
||||
|
||||
void *
|
||||
operator new(std::size_t size, std::align_val_t alignment, const std::nothrow_t &) noexcept {
|
||||
return alignedNewImpl<true>(size, alignment);
|
||||
}
|
||||
|
||||
void *
|
||||
operator new[](std::size_t size, std::align_val_t alignment, const std::nothrow_t &) noexcept {
|
||||
return alignedNewImpl<true>(size, alignment);
|
||||
}
|
||||
|
||||
#endif // __cpp_aligned_new
|
||||
|
||||
void
|
||||
operator delete(void *ptr) noexcept {
|
||||
je_free(ptr);
|
||||
@@ -123,19 +186,69 @@ void operator delete[](void *ptr, const std::nothrow_t &) noexcept {
|
||||
|
||||
#if __cpp_sized_deallocation >= 201309
|
||||
|
||||
JEMALLOC_ALWAYS_INLINE
|
||||
void
|
||||
operator delete(void *ptr, std::size_t size) noexcept {
|
||||
sizedDeleteImpl(void* ptr, std::size_t size) noexcept {
|
||||
if (unlikely(ptr == nullptr)) {
|
||||
return;
|
||||
}
|
||||
je_sdallocx_noflags(ptr, size);
|
||||
}
|
||||
|
||||
void operator delete[](void *ptr, std::size_t size) noexcept {
|
||||
if (unlikely(ptr == nullptr)) {
|
||||
return;
|
||||
}
|
||||
je_sdallocx_noflags(ptr, size);
|
||||
void
|
||||
operator delete(void *ptr, std::size_t size) noexcept {
|
||||
sizedDeleteImpl(ptr, size);
|
||||
}
|
||||
|
||||
void
|
||||
operator delete[](void *ptr, std::size_t size) noexcept {
|
||||
sizedDeleteImpl(ptr, size);
|
||||
}
|
||||
|
||||
#endif // __cpp_sized_deallocation
|
||||
|
||||
#if __cpp_aligned_new >= 201606
|
||||
|
||||
JEMALLOC_ALWAYS_INLINE
|
||||
void
|
||||
alignedSizedDeleteImpl(void* ptr, std::size_t size, std::align_val_t alignment) noexcept {
|
||||
if (config_debug) {
|
||||
assert(((size_t)alignment & ((size_t)alignment - 1)) == 0);
|
||||
}
|
||||
if (unlikely(ptr == nullptr)) {
|
||||
return;
|
||||
}
|
||||
je_sdallocx(ptr, size, MALLOCX_ALIGN(alignment));
|
||||
}
|
||||
|
||||
void
|
||||
operator delete(void* ptr, std::align_val_t) noexcept {
|
||||
je_free(ptr);
|
||||
}
|
||||
|
||||
void
|
||||
operator delete[](void* ptr, std::align_val_t) noexcept {
|
||||
je_free(ptr);
|
||||
}
|
||||
|
||||
void
|
||||
operator delete(void* ptr, std::align_val_t, const std::nothrow_t&) noexcept {
|
||||
je_free(ptr);
|
||||
}
|
||||
|
||||
void
|
||||
operator delete[](void* ptr, std::align_val_t, const std::nothrow_t&) noexcept {
|
||||
je_free(ptr);
|
||||
}
|
||||
|
||||
void
|
||||
operator delete(void* ptr, std::size_t size, std::align_val_t alignment) noexcept {
|
||||
alignedSizedDeleteImpl(ptr, size, alignment);
|
||||
}
|
||||
|
||||
void
|
||||
operator delete[](void* ptr, std::size_t size, std::align_val_t alignment) noexcept {
|
||||
alignedSizedDeleteImpl(ptr, size, alignment);
|
||||
}
|
||||
|
||||
#endif // __cpp_aligned_new
|
||||
Reference in new issue
Block a user