mirror of
https://github.com/openembedded/meta-openembedded.git
synced 2026-06-02 13:59:59 +00:00
jemalloc: add backport patch to fix build with gcc 16
This patch replaces std::__throw_bad_alloc call with standard C++ Signed-off-by: Markus Volk <f_l_k@t-online.de> Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
This commit is contained in:
+158
@@ -0,0 +1,158 @@
|
||||
From 1a15fe33a48c52bfe26ea83e49f0d317a47da3ea Mon Sep 17 00:00:00 2001
|
||||
From: lexprfuncall <cshapiro@meta.com>
|
||||
Date: Mon, 27 Apr 2026 11:50:27 -0700
|
||||
Subject: [PATCH] Replace std::__throw_bad_alloc call with standard C++ (#2900)
|
||||
|
||||
* Replace std::__throw_bad_alloc call with standard C++
|
||||
|
||||
Since December of 2025, std::__throw_bad_alloc is no longer visible
|
||||
through #include <new> causing jemalloc build failures with gcc 16.
|
||||
As far as I can tell, all std::__throw_bad_alloc did was arrange to
|
||||
raise a std::bad_alloc exception if exceptions are enabled. I am not
|
||||
sure whether its usage was truly meaningful in jemalloc since the call
|
||||
is wrapped in a try catch and any usage of try catch is considered an
|
||||
error when compiling with -fno-exceptions on gcc, at least.
|
||||
|
||||
This change adds a check to configure.ac that determines whether
|
||||
exceptions are enabled by compiling a simple try catch that raises a
|
||||
std::bad_alloc exception. If that test succeeds, the macro
|
||||
JEMALLOC_HAVE_CXX_EXCEPTIONS is defined, and jemalloc will raise an
|
||||
exception. Otherwise, we call std::terminate() to abort.
|
||||
|
||||
This was tested on FreeBSD with the gcc16 port with and without exceptions
|
||||
enabled.
|
||||
|
||||
* Replace std::set_new_handler calls with std::get_new_handler
|
||||
|
||||
Previously, std::set_new_handler was used as a workaround for
|
||||
compilers with only partial support for C++11. Now that C++14 is a
|
||||
requirement to enable C++ support, we can assume std::get_new_handler
|
||||
is available.
|
||||
|
||||
Upstream-Status: Backport [https://github.com/jemalloc/jemalloc/commit/1a15fe33a48c52bfe26ea83e49f0d317a47da3ea]
|
||||
---
|
||||
Makefile.in | 6 +++--
|
||||
configure.ac | 23 +++++++++++++++++
|
||||
.../internal/jemalloc_internal_defs.h.in | 3 +++
|
||||
src/jemalloc_cpp.cpp | 25 ++++++++++---------
|
||||
4 files changed, 43 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/Makefile.in b/Makefile.in
|
||||
index a93048d7b8..1f9d14f1f2 100644
|
||||
--- a/Makefile.in
|
||||
+++ b/Makefile.in
|
||||
@@ -337,9 +337,11 @@ TESTS_INTEGRATION += \
|
||||
endif
|
||||
ifeq (@enable_cxx@, 1)
|
||||
CPP_SRCS := $(srcroot)src/jemalloc_cpp.cpp
|
||||
-TESTS_INTEGRATION_CPP := $(srcroot)test/integration/cpp/basic.cpp \
|
||||
- $(srcroot)test/integration/cpp/infallible_new_true.cpp \
|
||||
+TESTS_INTEGRATION_CPP := $(srcroot)test/integration/cpp/basic.cpp
|
||||
+ifeq (@enable_cxx_exceptions@, 1)
|
||||
+TESTS_INTEGRATION_CPP += $(srcroot)test/integration/cpp/infallible_new_true.cpp \
|
||||
$(srcroot)test/integration/cpp/infallible_new_false.cpp
|
||||
+endif
|
||||
else
|
||||
CPP_SRCS :=
|
||||
TESTS_INTEGRATION_CPP :=
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index 321a729012..d151829832 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -374,7 +374,30 @@ fi
|
||||
if test "x$enable_cxx" = "x1"; then
|
||||
AC_DEFINE([JEMALLOC_ENABLE_CXX], [ ], [ ])
|
||||
fi
|
||||
+if test "x$enable_cxx" = "x1"; then
|
||||
+ dnl Now check whether the C++ compiler has exceptions enabled.
|
||||
+ AC_LANG_PUSH([C++])
|
||||
+ SAVED_CXXFLAGS="${CXXFLAGS}"
|
||||
+ CXXFLAGS="${CXXFLAGS} ${EXTRA_CXXFLAGS}"
|
||||
+ JE_COMPILABLE([C++ exception support], [
|
||||
+#include <new>
|
||||
+], [
|
||||
+ try {
|
||||
+ throw std::bad_alloc();
|
||||
+ } catch (const std::bad_alloc &) {
|
||||
+ }
|
||||
+], [je_cv_cxx_exceptions])
|
||||
+ CXXFLAGS="${SAVED_CXXFLAGS}"
|
||||
+ AC_LANG_POP([C++])
|
||||
+ if test "x${je_cv_cxx_exceptions}" = "xyes" ; then
|
||||
+ AC_DEFINE([JEMALLOC_HAVE_CXX_EXCEPTIONS], [ ], [ ])
|
||||
+ enable_cxx_exceptions="1"
|
||||
+ else
|
||||
+ enable_cxx_exceptions="0"
|
||||
+ fi
|
||||
+fi
|
||||
AC_SUBST([enable_cxx])
|
||||
+AC_SUBST([enable_cxx_exceptions])
|
||||
AC_SUBST([CONFIGURE_CXXFLAGS])
|
||||
AC_SUBST([SPECIFIED_CXXFLAGS])
|
||||
AC_SUBST([EXTRA_CXXFLAGS])
|
||||
diff --git a/include/jemalloc/internal/jemalloc_internal_defs.h.in b/include/jemalloc/internal/jemalloc_internal_defs.h.in
|
||||
index 31ae2e8ed2..54d4da2032 100644
|
||||
--- a/include/jemalloc/internal/jemalloc_internal_defs.h.in
|
||||
+++ b/include/jemalloc/internal/jemalloc_internal_defs.h.in
|
||||
@@ -465,6 +465,9 @@
|
||||
/* Is C++ support being built? */
|
||||
#undef JEMALLOC_ENABLE_CXX
|
||||
|
||||
+/* Are C++ exceptions enabled? */
|
||||
+#undef JEMALLOC_HAVE_CXX_EXCEPTIONS
|
||||
+
|
||||
/* Performs additional size checks when defined. */
|
||||
#undef JEMALLOC_OPT_SIZE_CHECKS
|
||||
|
||||
diff --git a/src/jemalloc_cpp.cpp b/src/jemalloc_cpp.cpp
|
||||
index 4e838d3b51..ac109bb28e 100644
|
||||
--- a/src/jemalloc_cpp.cpp
|
||||
+++ b/src/jemalloc_cpp.cpp
|
||||
@@ -1,4 +1,4 @@
|
||||
-#include <mutex>
|
||||
+#include <exception>
|
||||
#include <new>
|
||||
// NOLINTBEGIN(misc-use-anonymous-namespace)
|
||||
|
||||
@@ -78,29 +78,30 @@ handleOOM(std::size_t size, bool nothrow) {
|
||||
void *ptr = nullptr;
|
||||
|
||||
while (ptr == nullptr) {
|
||||
- std::new_handler handler;
|
||||
- // GCC-4.8 and clang 4.0 do not have std::get_new_handler.
|
||||
- {
|
||||
- static std::mutex mtx;
|
||||
- std::lock_guard<std::mutex> lock(mtx);
|
||||
-
|
||||
- handler = std::set_new_handler(nullptr);
|
||||
- std::set_new_handler(handler);
|
||||
- }
|
||||
+ std::new_handler handler = std::get_new_handler();
|
||||
if (handler == nullptr)
|
||||
break;
|
||||
|
||||
+#ifdef JEMALLOC_HAVE_CXX_EXCEPTIONS
|
||||
try {
|
||||
handler();
|
||||
} catch (const std::bad_alloc &) {
|
||||
break;
|
||||
}
|
||||
+#else
|
||||
+ handler();
|
||||
+#endif
|
||||
|
||||
ptr = je_malloc(size);
|
||||
}
|
||||
|
||||
- if (ptr == nullptr && !nothrow)
|
||||
- std::__throw_bad_alloc();
|
||||
+ if (ptr == nullptr && !nothrow) {
|
||||
+#ifdef JEMALLOC_HAVE_CXX_EXCEPTIONS
|
||||
+ throw std::bad_alloc();
|
||||
+#else
|
||||
+ std::terminate();
|
||||
+#endif
|
||||
+ }
|
||||
return ptr;
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@ SECTION = "libs"
|
||||
LIC_FILES_CHKSUM = "file://COPYING;md5=ea061f8731d5e6a5761dfad951ef5f5f"
|
||||
|
||||
SRC_URI = "git://github.com/jemalloc/jemalloc.git;branch=master;protocol=https;tag=${PV} \
|
||||
file://1a15fe33a48c52bfe26ea83e49f0d317a47da3ea.patch \
|
||||
file://run-ptest \
|
||||
"
|
||||
SRCREV = "81034ce1f1373e37dc865038e1bc8eeecf559ce8"
|
||||
|
||||
Reference in New Issue
Block a user