Skip to content

Commit c578540

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

File tree

7 files changed

+87
-35
lines changed

7 files changed

+87
-35
lines changed

.github/workflows/basic.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,8 @@ jobs:
270270
-DUMF_DEVELOPER_MODE=ON
271271
-DUMF_ENABLE_POOL_TRACKING=ON
272272
-DUMF_BUILD_LEVEL_ZERO_PROVIDER=OFF
273+
-DUMF_BUILD_OS_MEMORY_PROVIDER=OFF
274+
-DUMF_BUILD_LIBUMF_POOL_SCALABLE=OFF
273275
274276
- name: Build UMF
275277
run: cmake --build ${{env.BUILD_DIR}} -j $(sysctl -n hw.logicalcpu)

.github/workflows/codeql.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ jobs:
3131
# Windows doesn't recognize 'CMAKE_BUILD_TYPE', it uses '--config' param in build command
3232
extra_build_option: '-DCMAKE_BUILD_TYPE=Release'
3333
- os: windows-latest
34-
pool_scalable: 'OFF'
34+
pool_scalable: 'ON'
3535
runs-on: ${{matrix.os}}
3636

3737
steps:

.github/workflows/pr_push.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,12 @@ jobs:
1919
matrix:
2020
include:
2121
- os: windows-latest
22-
pool_scalable: 'OFF'
22+
pool_scalable: 'ON'
2323
disjoint: 'OFF'
2424
jemalloc: 'OFF'
2525
# pure C build (Windows)
2626
- os: windows-latest
27-
pool_scalable: 'OFF'
27+
pool_scalable: 'ON'
2828
disjoint: 'OFF'
2929
jemalloc: 'OFF'
3030
# Tests' building is off for a pure C build

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ The `UMF_BUILD_LIBUMF_POOL_JEMALLOC` option has to be turned `ON` to build this
169169
2) Required packages:
170170
- libjemalloc-dev
171171

172-
#### libumf_pool_scalable (Linux-only)
172+
#### libumf_pool_scalable
173173

174174
libumf_pool_scalable is a [oneTBB](https://github.com/oneapi-src/oneTBB)-based memory pool manager built as a separate static library.
175175
The `UMF_BUILD_LIBUMF_POOL_SCALABLE` option has to be turned `ON` to build this library.
@@ -178,7 +178,7 @@ The `UMF_BUILD_LIBUMF_POOL_SCALABLE` option has to be turned `ON` to build this
178178

179179
1) The `UMF_BUILD_LIBUMF_POOL_SCALABLE` option turned `ON`
180180
2) Required packages:
181-
- libtbb-dev (libraries: libtbbmalloc.so.2)
181+
- libtbb-dev (libtbbmalloc.so.2) on Linux or tbb (tbbmalloc.dll) on Windows
182182

183183
### Memspaces (Linux-only)
184184

src/pool/CMakeLists.txt

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,18 +53,25 @@ 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})
68+
target_include_directories(scalable_pool PRIVATE ${LIBTBB_INCLUDE_DIRS})
6269
target_compile_definitions(scalable_pool PUBLIC ${POOL_COMPILE_DEFINITIONS})
6370
add_library(${PROJECT_NAME}::scalable_pool ALIAS scalable_pool)
6471
install(TARGETS scalable_pool
6572
EXPORT ${PROJECT_NAME}-targets
6673
)
6774
else()
68-
message(FATAL_ERROR "libumf_pool_scalable is supported on Linux only")
75+
message(FATAL_ERROR "libumf_pool_scalable is supported on Linux and Windows only")
6976
endif()
7077
endif()

src/pool/pool_scalable.c

Lines changed: 67 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>
@@ -25,6 +23,7 @@
2523
#include "base_alloc_global.h"
2624
#include "utils_common.h"
2725
#include "utils_concurrency.h"
26+
#include "utils_load_library.h"
2827
#include "utils_sanitizers.h"
2928

3029
typedef void *(*raw_alloc_tbb_type)(intptr_t, size_t *);
@@ -51,7 +50,11 @@ typedef struct tbb_callbacks_t {
5150
bool (*pool_destroy)(void *);
5251
void *(*pool_identify)(void *object);
5352
size_t (*pool_msize)(void *, void *);
53+
#ifdef _WIN32
54+
HMODULE lib_handle;
55+
#else
5456
void *lib_handle;
57+
#endif
5558
} tbb_callbacks_t;
5659

5760
typedef struct tbb_memory_pool_t {
@@ -60,42 +63,79 @@ typedef struct tbb_memory_pool_t {
6063
tbb_callbacks_t tbb_callbacks;
6164
} tbb_memory_pool_t;
6265

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+
63106
static int init_tbb_callbacks(tbb_callbacks_t *tbb_callbacks) {
64107
assert(tbb_callbacks);
65108

66-
const char so_name[] = "libtbbmalloc.so.2";
67-
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);
68111
if (!tbb_callbacks->lib_handle) {
69-
fprintf(stderr, "%s not found.\n", so_name);
112+
fprintf(stderr, "%s not found.\n", lib_name);
70113
return -1;
71114
}
72115

73-
*(void **)&tbb_callbacks->pool_malloc = dlsym(
74-
tbb_callbacks->lib_handle, "_ZN3rml11pool_mallocEPNS_10MemoryPoolEm");
75-
*(void **)&tbb_callbacks->pool_realloc =
76-
dlsym(tbb_callbacks->lib_handle,
77-
"_ZN3rml12pool_reallocEPNS_10MemoryPoolEPvm");
78-
*(void **)&tbb_callbacks->pool_aligned_malloc =
79-
dlsym(tbb_callbacks->lib_handle,
80-
"_ZN3rml19pool_aligned_mallocEPNS_10MemoryPoolEmm");
81-
*(void **)&tbb_callbacks->pool_free = dlsym(
82-
tbb_callbacks->lib_handle, "_ZN3rml9pool_freeEPNS_10MemoryPoolEPv");
83-
*(void **)&tbb_callbacks->pool_create_v1 = dlsym(
84-
tbb_callbacks->lib_handle,
85-
"_ZN3rml14pool_create_v1ElPKNS_13MemPoolPolicyEPPNS_10MemoryPoolE");
86-
*(void **)&tbb_callbacks->pool_destroy = dlsym(
87-
tbb_callbacks->lib_handle, "_ZN3rml12pool_destroyEPNS_10MemoryPoolE");
88-
*(void **)&tbb_callbacks->pool_identify =
89-
dlsym(tbb_callbacks->lib_handle, "_ZN3rml13pool_identifyEPv");
90-
*(void **)&tbb_callbacks->pool_msize = dlsym(
91-
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]);
92132

93133
if (!tbb_callbacks->pool_malloc || !tbb_callbacks->pool_realloc ||
94134
!tbb_callbacks->pool_aligned_malloc || !tbb_callbacks->pool_free ||
95135
!tbb_callbacks->pool_create_v1 || !tbb_callbacks->pool_destroy ||
96136
!tbb_callbacks->pool_identify) {
97-
fprintf(stderr, "Could not find symbols in %s.\n", so_name);
98-
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);
99139
return -1;
100140
}
101141

@@ -168,7 +208,7 @@ static umf_result_t tbb_pool_initialize(umf_memory_provider_handle_t provider,
168208
static void tbb_pool_finalize(void *pool) {
169209
tbb_memory_pool_t *pool_data = (tbb_memory_pool_t *)pool;
170210
pool_data->tbb_callbacks.pool_destroy(pool_data->tbb_pool);
171-
dlclose(pool_data->tbb_callbacks.lib_handle);
211+
util_close_library(pool_data->tbb_callbacks.lib_handle);
172212
umf_ba_global_free(pool_data);
173213
}
174214

test/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ function(add_umf_test)
5555
if(LIBHWLOC_DLL_DIRS)
5656
set(PATH_LIST "${PATH_LIST};PATH=path_list_append:${LIBHWLOC_DLL_DIRS}")
5757
endif()
58+
if(LIBTBB_DLL_DIRS)
59+
set(PATH_LIST "${PATH_LIST};PATH=path_list_append:${LIBTBB_DLL_DIRS}")
60+
endif()
5861
set_property(TEST ${TEST_NAME} PROPERTY ENVIRONMENT_MODIFICATION "${PATH_LIST}")
5962
endif()
6063

0 commit comments

Comments
 (0)