Skip to content

Commit 54c30c5

Browse files
committed
[CMake] Expand support for preinstalled jemalloc
Signed-off-by: Sarnie, Nick <[email protected]>
1 parent c765222 commit 54c30c5

File tree

3 files changed

+102
-68
lines changed

3 files changed

+102
-68
lines changed

CMakeLists.txt

Lines changed: 71 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -155,79 +155,83 @@ if(NOT UMF_BUILD_LIBUMF_POOL_JEMALLOC)
155155
set(UMF_POOL_JEMALLOC_ENABLED FALSE)
156156
set(JEMALLOC_FOUND FALSE)
157157
set(JEMALLOC_LIBRARIES FALSE)
158-
elseif(WINDOWS)
159-
pkg_check_modules(JEMALLOC jemalloc)
160-
if(NOT JEMALLOC_FOUND)
161-
find_package(JEMALLOC REQUIRED jemalloc)
162-
endif()
163158
else()
164-
if(NOT DEFINED UMF_JEMALLOC_REPO)
165-
set(UMF_JEMALLOC_REPO "https://github.com/jemalloc/jemalloc.git")
166-
endif()
159+
set(JEMALLOC_VER 5.3.0)
160+
pkg_check_modules(JEMALLOC QUIET jemalloc)
161+
if(NOT JEMALLOC_FOUND)
162+
find_package(JEMALLOC ${JEMALLOC_VER} QUIET)
163+
endif()
164+
if(JEMALLOC_FOUND)
165+
set(SYSTEM_JEMALLOC_FOUND TRUE)
166+
else()
167+
if(NOT DEFINED UMF_JEMALLOC_REPO)
168+
set(UMF_JEMALLOC_REPO "https://github.com/jemalloc/jemalloc.git")
169+
endif()
167170

168-
if(NOT DEFINED UMF_JEMALLOC_TAG)
169-
set(UMF_JEMALLOC_TAG 5.3.0)
170-
endif()
171+
if(NOT DEFINED UMF_JEMALLOC_TAG)
172+
set(UMF_JEMALLOC_TAG ${JEMALLOC_VER})
173+
endif()
171174

172-
message(
173-
STATUS
174-
"Will fetch jemalloc from ${UMF_JEMALLOC_REPO} (tag: ${UMF_JEMALLOC_TAG})"
175-
)
175+
message(
176+
STATUS
177+
"Will fetch jemalloc from ${UMF_JEMALLOC_REPO} (tag: ${UMF_JEMALLOC_TAG})"
178+
)
179+
180+
FetchContent_Declare(
181+
jemalloc_targ
182+
GIT_REPOSITORY ${UMF_JEMALLOC_REPO}
183+
GIT_TAG ${UMF_JEMALLOC_TAG})
184+
FetchContent_MakeAvailable(jemalloc_targ)
176185

177-
FetchContent_Declare(
178-
jemalloc_targ
179-
GIT_REPOSITORY ${UMF_JEMALLOC_REPO}
180-
GIT_TAG ${UMF_JEMALLOC_TAG})
181-
FetchContent_MakeAvailable(jemalloc_targ)
186+
add_custom_command(
187+
COMMAND ./autogen.sh
188+
WORKING_DIRECTORY ${jemalloc_targ_SOURCE_DIR}
189+
OUTPUT ${jemalloc_targ_SOURCE_DIR}/configure)
190+
add_custom_command(
191+
# Custom jemalloc build. Non-default options used:
192+
# --with-jemalloc-prefix=je_ - add je_ prefix to all public APIs
193+
# --disable-cxx - Disable C++ integration. This will cause new and
194+
# delete operators implementations to be omitted.
195+
# --disable-initial-exec-tls - Disable the initial-exec TLS model
196+
# for jemalloc's internal thread-local storage (on those platforms
197+
# that support explicit settings). This can allow jemalloc to be
198+
# dynamically loaded after program startup (e.g. using dlopen).
199+
# --disable-doc - Disable building and installing the documentation.
200+
COMMAND
201+
./configure --prefix=${jemalloc_targ_BINARY_DIR}
202+
--with-jemalloc-prefix=je_ --disable-cxx
203+
--disable-initial-exec-tls --disable-doc CFLAGS=-fPIC
204+
WORKING_DIRECTORY ${jemalloc_targ_SOURCE_DIR}
205+
OUTPUT ${jemalloc_targ_SOURCE_DIR}/Makefile
206+
DEPENDS ${jemalloc_targ_SOURCE_DIR}/configure)
207+
208+
if(NOT UMF_QEMU_BUILD)
209+
set(MAKE_ARGUMENTS "-j$(nproc)")
210+
endif()
182211

183-
add_custom_command(
184-
COMMAND ./autogen.sh
185-
WORKING_DIRECTORY ${jemalloc_targ_SOURCE_DIR}
186-
OUTPUT ${jemalloc_targ_SOURCE_DIR}/configure)
187-
add_custom_command(
188-
# Custom jemalloc build. Non-default options used:
189-
# --with-jemalloc-prefix=je_ - add je_ prefix to all public APIs
190-
# --disable-cxx - Disable C++ integration. This will cause new and
191-
# delete operators implementations to be omitted.
192-
# --disable-initial-exec-tls - Disable the initial-exec TLS model for
193-
# jemalloc's internal thread-local storage (on those platforms that
194-
# support explicit settings). This can allow jemalloc to be dynamically
195-
# loaded after program startup (e.g. using dlopen). --disable-doc -
196-
# Disable building and installing the documentation.
197-
COMMAND
198-
./configure --prefix=${jemalloc_targ_BINARY_DIR}
199-
--with-jemalloc-prefix=je_ --disable-cxx --disable-initial-exec-tls
200-
--disable-doc CFLAGS=-fPIC
201-
WORKING_DIRECTORY ${jemalloc_targ_SOURCE_DIR}
202-
OUTPUT ${jemalloc_targ_SOURCE_DIR}/Makefile
203-
DEPENDS ${jemalloc_targ_SOURCE_DIR}/configure)
204-
205-
if(NOT UMF_QEMU_BUILD)
206-
set(MAKE_ARGUMENTS "-j$(nproc)")
212+
add_custom_command(
213+
COMMAND make ${MAKE_ARGUMENTS}
214+
WORKING_DIRECTORY ${jemalloc_targ_SOURCE_DIR}
215+
OUTPUT ${jemalloc_targ_SOURCE_DIR}/lib/libjemalloc.a
216+
DEPENDS ${jemalloc_targ_SOURCE_DIR}/Makefile)
217+
add_custom_command(
218+
COMMAND make install
219+
WORKING_DIRECTORY ${jemalloc_targ_SOURCE_DIR}
220+
OUTPUT ${jemalloc_targ_BINARY_DIR}/lib/libjemalloc.a
221+
DEPENDS ${jemalloc_targ_SOURCE_DIR}/lib/libjemalloc.a)
222+
223+
add_custom_target(jemalloc_prod
224+
DEPENDS ${jemalloc_targ_BINARY_DIR}/lib/libjemalloc.a)
225+
add_library(jemalloc INTERFACE)
226+
target_link_libraries(
227+
jemalloc INTERFACE ${jemalloc_targ_BINARY_DIR}/lib/libjemalloc.a)
228+
add_dependencies(jemalloc jemalloc_prod)
229+
230+
set(JEMALLOC_FOUND TRUE)
231+
set(JEMALLOC_LIBRARY_DIRS ${jemalloc_targ_BINARY_DIR}/lib)
232+
set(JEMALLOC_INCLUDE_DIRS ${jemalloc_targ_BINARY_DIR}/include)
233+
set(JEMALLOC_LIBRARIES ${jemalloc_targ_BINARY_DIR}/lib/libjemalloc.a)
207234
endif()
208-
209-
add_custom_command(
210-
COMMAND make ${MAKE_ARGUMENTS}
211-
WORKING_DIRECTORY ${jemalloc_targ_SOURCE_DIR}
212-
OUTPUT ${jemalloc_targ_SOURCE_DIR}/lib/libjemalloc.a
213-
DEPENDS ${jemalloc_targ_SOURCE_DIR}/Makefile)
214-
add_custom_command(
215-
COMMAND make install
216-
WORKING_DIRECTORY ${jemalloc_targ_SOURCE_DIR}
217-
OUTPUT ${jemalloc_targ_BINARY_DIR}/lib/libjemalloc.a
218-
DEPENDS ${jemalloc_targ_SOURCE_DIR}/lib/libjemalloc.a)
219-
220-
add_custom_target(jemalloc_prod
221-
DEPENDS ${jemalloc_targ_BINARY_DIR}/lib/libjemalloc.a)
222-
add_library(jemalloc INTERFACE)
223-
target_link_libraries(
224-
jemalloc INTERFACE ${jemalloc_targ_BINARY_DIR}/lib/libjemalloc.a)
225-
add_dependencies(jemalloc jemalloc_prod)
226-
227-
set(JEMALLOC_FOUND TRUE)
228-
set(JEMALLOC_LIBRARY_DIRS ${jemalloc_targ_BINARY_DIR}/lib)
229-
set(JEMALLOC_INCLUDE_DIRS ${jemalloc_targ_BINARY_DIR}/include)
230-
set(JEMALLOC_LIBRARIES ${jemalloc_targ_BINARY_DIR}/lib/libjemalloc.a)
231235
endif()
232236

233237
if(JEMALLOC_FOUND)

src/CMakeLists.txt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,10 @@ if(UMF_POOL_JEMALLOC_ENABLED)
7676
${JEMALLOC_INCLUDE_DIRS})
7777
set(UMF_COMMON_COMPILE_DEFINITIONS ${UMF_COMMON_COMPILE_DEFINITIONS}
7878
"UMF_POOL_JEMALLOC_ENABLED=1")
79+
if(SYSTEM_JEMALLOC_FOUND)
80+
set(UMF_COMMON_COMPILE_DEFINITIONS ${UMF_COMMON_COMPILE_DEFINITIONS}
81+
"UMF_USING_PREBUILT_JEMALLOC=1")
82+
endif()
7983
endif()
8084

8185
set(UMF_PRIVATE_LIBRARY_DIRS ${UMF_PRIVATE_LIBRARY_DIRS}
@@ -166,7 +170,7 @@ if(UMF_LINK_HWLOC_STATICALLY)
166170
endif()
167171
endif()
168172

169-
if(NOT WINDOWS AND UMF_POOL_JEMALLOC_ENABLED)
173+
if(UMF_POOL_JEMALLOC_ENABLED AND TARGET jemalloc)
170174
add_dependencies(umf jemalloc)
171175
endif()
172176

src/pool/pool_jemalloc.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,24 @@ umfJemallocPoolParamsSetName(umf_jemalloc_pool_params_handle_t hParams,
5959
#define MALLOCX_ARENA_MAX (MALLCTL_ARENAS_ALL - 1)
6060
#define DEFAULT_NAME "jemalloc"
6161

62+
#ifdef UMF_USING_PREBUILT_JEMALLOC
63+
64+
// When jemalloc is built in-tree, it is configured such that
65+
// all symbols are prepended with the je_ prefix. This is not
66+
// the case for system-installed jemalloc.
67+
68+
#define je_mallctl(...) mallctl(__VA_ARGS__)
69+
70+
#define je_mallocx(...) mallocx(__VA_ARGS__)
71+
72+
#define je_dallocx(...) dallocx(__VA_ARGS__)
73+
74+
#define je_rallocx(...) rallocx(__VA_ARGS__)
75+
76+
#define je_malloc_usable_size(...) malloc_usable_size(__VA_ARGS__)
77+
78+
#endif
79+
6280
typedef struct umf_jemalloc_pool_params_t {
6381
size_t n_arenas;
6482
char name[64];
@@ -678,4 +696,12 @@ umfJemallocPoolParamsSetName(umf_jemalloc_pool_params_handle_t hParams,
678696
return UMF_RESULT_SUCCESS;
679697
}
680698

699+
#ifdef UMF_USING_PREBUILT_JEMALLOC
700+
#undef je_mallctl
701+
#undef je_mallocx
702+
#undef je_dallocx
703+
#undef je_rallocx
704+
#undef je_malloc_usable_size
705+
#endif
706+
681707
#endif /* UMF_POOL_JEMALLOC_ENABLED */

0 commit comments

Comments
 (0)