Skip to content

Commit ff94160

Browse files
committed
Enable pool scalable on Windows
Signed-off-by: Lukasz Dorau <[email protected]>
1 parent 1b02384 commit ff94160

File tree

2 files changed

+75
-30
lines changed

2 files changed

+75
-30
lines changed

src/pool/CMakeLists.txt

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,18 +53,24 @@ if(UMF_BUILD_LIBUMF_POOL_JEMALLOC)
5353
endif()
5454

5555
# libumf_pool_scalable
56+
if(LINUX)
57+
set(LIBS_POOL_SCALABLE dl umf_utils)
58+
elseif(WINDOWS)
59+
set(LIBS_POOL_SCALABLE umf_utils)
60+
endif()
61+
5662
if(UMF_BUILD_LIBUMF_POOL_SCALABLE)
57-
if(LINUX)
63+
if(LINUX OR WINDOWS)
5864
add_umf_library(NAME scalable_pool
5965
TYPE STATIC
6066
SRCS pool_scalable.c ${POOL_EXTRA_SRCS}
61-
LIBS dl umf_utils)
67+
LIBS ${LIBS_POOL_SCALABLE})
6268
target_compile_definitions(scalable_pool PUBLIC ${POOL_COMPILE_DEFINITIONS})
6369
add_library(${PROJECT_NAME}::scalable_pool ALIAS scalable_pool)
6470
install(TARGETS scalable_pool
6571
EXPORT ${PROJECT_NAME}-targets
6672
)
6773
else()
68-
message(FATAL_ERROR "libumf_pool_scalable is supported on Linux only")
74+
message(FATAL_ERROR "libumf_pool_scalable is supported on Linux and Windows only")
6975
endif()
7076
endif()

src/pool/pool_scalable.c

Lines changed: 66 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@
88
*/
99

1010
#include <assert.h>
11-
#include <dlfcn.h>
12-
#include <pthread.h>
1311
#include <stdbool.h>
1412
#include <stdint.h>
1513
#include <stdio.h>
@@ -52,7 +50,11 @@ typedef struct tbb_callbacks_t {
5250
bool (*pool_destroy)(void *);
5351
void *(*pool_identify)(void *object);
5452
size_t (*pool_msize)(void *, void *);
53+
#ifdef _WIN32
54+
HMODULE lib_handle;
55+
#else
5556
void *lib_handle;
57+
#endif
5658
} tbb_callbacks_t;
5759

5860
typedef struct tbb_memory_pool_t {
@@ -61,42 +63,79 @@ typedef struct tbb_memory_pool_t {
6163
tbb_callbacks_t tbb_callbacks;
6264
} tbb_memory_pool_t;
6365

66+
typedef enum tbb_enums_t {
67+
TBB_LIB_NAME = 0,
68+
TBB_POOL_MALLOC,
69+
TBB_POOL_REALLOC,
70+
TBB_POOL_ALIGNED_MALLOC,
71+
TBB_POOL_FREE,
72+
TBB_POOL_CREATE_V1,
73+
TBB_POOL_DESTROY,
74+
TBB_POOL_IDENTIFY,
75+
TBB_POOL_MSIZE,
76+
TBB_POOL_SYMBOLS_MAX // it has to be the last one
77+
} tbb_enums_t;
78+
79+
static const char *tbb_symbol[TBB_POOL_SYMBOLS_MAX] = {
80+
#ifdef _WIN32
81+
// symbols copied from oneTBB/src/tbbmalloc/def/win64-tbbmalloc.def
82+
"tbbmalloc.dll",
83+
"?pool_malloc@rml@@YAPEAXPEAVMemoryPool@1@_K@Z",
84+
"?pool_realloc@rml@@YAPEAXPEAVMemoryPool@1@PEAX_K@Z",
85+
"?pool_aligned_malloc@rml@@YAPEAXPEAVMemoryPool@1@_K1@Z",
86+
"?pool_free@rml@@YA_NPEAVMemoryPool@1@PEAX@Z",
87+
"?pool_create_v1@rml@@YA?AW4MemPoolError@1@_JPEBUMemPoolPolicy@1@"
88+
"PEAPEAVMemoryPool@1@@Z",
89+
"?pool_destroy@rml@@YA_NPEAVMemoryPool@1@@Z",
90+
"?pool_identify@rml@@YAPEAVMemoryPool@1@PEAX@Z",
91+
"?pool_msize@rml@@YA_KPEAVMemoryPool@1@PEAX@Z"
92+
#else
93+
// symbols copied from oneTBB/src/tbbmalloc/def/lin64-tbbmalloc.def
94+
"libtbbmalloc.so.2",
95+
"_ZN3rml11pool_mallocEPNS_10MemoryPoolEm",
96+
"_ZN3rml12pool_reallocEPNS_10MemoryPoolEPvm",
97+
"_ZN3rml19pool_aligned_mallocEPNS_10MemoryPoolEmm",
98+
"_ZN3rml9pool_freeEPNS_10MemoryPoolEPv",
99+
"_ZN3rml14pool_create_v1ElPKNS_13MemPoolPolicyEPPNS_10MemoryPoolE",
100+
"_ZN3rml12pool_destroyEPNS_10MemoryPoolE",
101+
"_ZN3rml13pool_identifyEPv",
102+
"_ZN3rml10pool_msizeEPNS_10MemoryPoolEPv"
103+
#endif
104+
};
105+
64106
static int init_tbb_callbacks(tbb_callbacks_t *tbb_callbacks) {
65107
assert(tbb_callbacks);
66108

67-
const char so_name[] = "libtbbmalloc.so.2";
68-
tbb_callbacks->lib_handle = dlopen(so_name, RTLD_LAZY);
109+
const char *lib_name = tbb_symbol[TBB_LIB_NAME];
110+
tbb_callbacks->lib_handle = util_open_library(lib_name);
69111
if (!tbb_callbacks->lib_handle) {
70-
fprintf(stderr, "%s not found.\n", so_name);
112+
fprintf(stderr, "%s not found.\n", lib_name);
71113
return -1;
72114
}
73115

74-
*(void **)&tbb_callbacks->pool_malloc = dlsym(
75-
tbb_callbacks->lib_handle, "_ZN3rml11pool_mallocEPNS_10MemoryPoolEm");
76-
*(void **)&tbb_callbacks->pool_realloc =
77-
dlsym(tbb_callbacks->lib_handle,
78-
"_ZN3rml12pool_reallocEPNS_10MemoryPoolEPvm");
79-
*(void **)&tbb_callbacks->pool_aligned_malloc =
80-
dlsym(tbb_callbacks->lib_handle,
81-
"_ZN3rml19pool_aligned_mallocEPNS_10MemoryPoolEmm");
82-
*(void **)&tbb_callbacks->pool_free = dlsym(
83-
tbb_callbacks->lib_handle, "_ZN3rml9pool_freeEPNS_10MemoryPoolEPv");
84-
*(void **)&tbb_callbacks->pool_create_v1 = dlsym(
85-
tbb_callbacks->lib_handle,
86-
"_ZN3rml14pool_create_v1ElPKNS_13MemPoolPolicyEPPNS_10MemoryPoolE");
87-
*(void **)&tbb_callbacks->pool_destroy = dlsym(
88-
tbb_callbacks->lib_handle, "_ZN3rml12pool_destroyEPNS_10MemoryPoolE");
89-
*(void **)&tbb_callbacks->pool_identify =
90-
dlsym(tbb_callbacks->lib_handle, "_ZN3rml13pool_identifyEPv");
91-
*(void **)&tbb_callbacks->pool_msize = dlsym(
92-
tbb_callbacks->lib_handle, "_ZN3rml10pool_msizeEPNS_10MemoryPoolEPv");
116+
*(void **)&tbb_callbacks->pool_malloc = util_get_symbol_addr(
117+
tbb_callbacks->lib_handle, tbb_symbol[TBB_POOL_MALLOC]);
118+
*(void **)&tbb_callbacks->pool_realloc = util_get_symbol_addr(
119+
tbb_callbacks->lib_handle, tbb_symbol[TBB_POOL_REALLOC]);
120+
*(void **)&tbb_callbacks->pool_aligned_malloc = util_get_symbol_addr(
121+
tbb_callbacks->lib_handle, tbb_symbol[TBB_POOL_ALIGNED_MALLOC]);
122+
*(void **)&tbb_callbacks->pool_free = util_get_symbol_addr(
123+
tbb_callbacks->lib_handle, tbb_symbol[TBB_POOL_FREE]);
124+
*(void **)&tbb_callbacks->pool_create_v1 = util_get_symbol_addr(
125+
tbb_callbacks->lib_handle, tbb_symbol[TBB_POOL_CREATE_V1]);
126+
*(void **)&tbb_callbacks->pool_destroy = util_get_symbol_addr(
127+
tbb_callbacks->lib_handle, tbb_symbol[TBB_POOL_DESTROY]);
128+
*(void **)&tbb_callbacks->pool_identify = util_get_symbol_addr(
129+
tbb_callbacks->lib_handle, tbb_symbol[TBB_POOL_IDENTIFY]);
130+
*(void **)&tbb_callbacks->pool_msize = util_get_symbol_addr(
131+
tbb_callbacks->lib_handle, tbb_symbol[TBB_POOL_MSIZE]);
93132

94133
if (!tbb_callbacks->pool_malloc || !tbb_callbacks->pool_realloc ||
95134
!tbb_callbacks->pool_aligned_malloc || !tbb_callbacks->pool_free ||
96135
!tbb_callbacks->pool_create_v1 || !tbb_callbacks->pool_destroy ||
97136
!tbb_callbacks->pool_identify) {
98-
fprintf(stderr, "Could not find symbols in %s.\n", so_name);
99-
dlclose(tbb_callbacks->lib_handle);
137+
fprintf(stderr, "Could not find symbols in %s.\n", lib_name);
138+
util_close_library(tbb_callbacks->lib_handle);
100139
return -1;
101140
}
102141

@@ -169,7 +208,7 @@ static umf_result_t tbb_pool_initialize(umf_memory_provider_handle_t provider,
169208
static void tbb_pool_finalize(void *pool) {
170209
tbb_memory_pool_t *pool_data = (tbb_memory_pool_t *)pool;
171210
pool_data->tbb_callbacks.pool_destroy(pool_data->tbb_pool);
172-
dlclose(pool_data->tbb_callbacks.lib_handle);
211+
util_close_library(pool_data->tbb_callbacks.lib_handle);
173212
umf_ba_global_free(pool_data);
174213
}
175214

0 commit comments

Comments
 (0)