Skip to content

Commit 8da67f0

Browse files
authored
Merge pull request #202 from igchor/move_rutime_init
Move global state init/deinit to libumf_.c file
2 parents b1068dc + 768c3d1 commit 8da67f0

11 files changed

+105
-94
lines changed

src/CMakeLists.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,17 @@ set(UMF_SOURCES
2222

2323
set(UMF_SOURCES_LINUX
2424
base_alloc/base_alloc_linux.c
25-
provider/provider_tracking_linux.c
25+
libumf_linux.c
2626
)
2727

2828
set(UMF_SOURCES_WINDOWS
2929
base_alloc/base_alloc_windows.c
30-
provider/provider_tracking_windows.c
30+
libumf_windows.c
3131
)
3232

3333
set(UMF_SOURCES_MACOSX
3434
base_alloc/base_alloc_linux.c
35-
provider/provider_tracking_linux.c
35+
libumf_linux.c
3636
)
3737

3838
if(UMF_BUILD_OS_MEMORY_PROVIDER)

src/libumf.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/*
2+
*
3+
* Copyright (C) 2023 Intel Corporation
4+
*
5+
* Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT.
6+
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7+
*
8+
*/
9+
10+
#ifndef UMF_LIBUMF_H
11+
#define UMF_LIBUMF_H 1
12+
13+
#ifdef __cplusplus
14+
extern "C" {
15+
#endif
16+
17+
// initializes runtime state needed by the library (needed mostly for static libaries on windows)
18+
void libumfInit(void);
19+
20+
#ifdef __cplusplus
21+
}
22+
#endif
23+
24+
#endif /* UMF_LIBUMF_H */

src/libumf_linux.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/*
2+
*
3+
* Copyright (C) 2024 Intel Corporation
4+
*
5+
* Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT.
6+
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7+
*
8+
*/
9+
10+
#include "provider_tracking.h"
11+
12+
#include <stddef.h>
13+
14+
umf_memory_tracker_handle_t TRACKER = NULL;
15+
16+
void __attribute__((constructor)) umfCreate(void) {
17+
TRACKER = umfMemoryTrackerCreate();
18+
}
19+
void __attribute__((destructor)) umfDestroy(void) {
20+
umfMemoryTrackerDestroy(TRACKER);
21+
}
22+
23+
void libumfInit(void) {
24+
// do nothing, additional initialization not needed
25+
}

src/provider/provider_tracking_windows.c renamed to src/libumf_windows.c

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@
1212
#include <stdlib.h>
1313
#include <windows.h>
1414

15-
static umf_memory_tracker_handle_t TRACKER = NULL;
15+
umf_memory_tracker_handle_t TRACKER = NULL;
1616

17-
static void providerFini(void) { umfTrackingMemoryProviderFini(TRACKER); }
17+
static void providerFini(void) { umfMemoryTrackerDestroy(TRACKER); }
1818

1919
#if defined(UMF_SHARED_LIBRARY)
2020
BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
@@ -26,24 +26,20 @@ BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
2626
return TRUE;
2727
}
2828

29-
void umfTrackingMemoryProviderInit(void) {
29+
void libumfInit(void) {
3030
// do nothing, additional initialization not needed
3131
}
3232
#else
3333
INIT_ONCE init_once_flag = INIT_ONCE_STATIC_INIT;
3434

35-
BOOL CALLBACK providerInit(PINIT_ONCE InitOnce, PVOID Parameter,
36-
PVOID *lpContext) {
35+
BOOL CALLBACK initOnceCb(PINIT_ONCE InitOnce, PVOID Parameter,
36+
PVOID *lpContext) {
3737
TRACKER = umfMemoryTrackerCreate();
3838
atexit(providerFini);
3939
return TRACKER ? TRUE : FALSE;
4040
}
4141

42-
void umfTrackingMemoryProviderInit(void) {
43-
InitOnceExecuteOnce(&init_once_flag, providerInit, NULL, NULL);
42+
void libumfInit(void) {
43+
InitOnceExecuteOnce(&init_once_flag, initOnceCb, NULL, NULL);
4444
}
4545
#endif
46-
47-
umf_memory_tracker_handle_t umfMemoryTrackerGet(void) {
48-
return (umf_memory_tracker_handle_t)TRACKER;
49-
}

src/memory_pool.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
*
88
*/
99

10+
#include "libumf.h"
1011
#include "memory_pool_internal.h"
1112
#include "utils_common.h"
1213

@@ -20,6 +21,7 @@ umf_result_t umfPoolCreate(const umf_memory_pool_ops_t *ops,
2021
umf_memory_provider_handle_t provider, void *params,
2122
umf_pool_create_flags_t flags,
2223
umf_memory_pool_handle_t *hPool) {
24+
libumfInit();
2325
umf_result_t ret = umfPoolCreateInternal(ops, provider, params, hPool);
2426
if (ret != UMF_RESULT_SUCCESS) {
2527
return ret;

src/memory_pool_tracking.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ umf_result_t umfFree(void *ptr) {
7878
}
7979

8080
umf_memory_pool_handle_t umfPoolByPtr(const void *ptr) {
81-
return umfMemoryTrackerGetPool(umfMemoryTrackerGet(), ptr);
81+
return umfMemoryTrackerGetPool(ptr);
8282
}
8383

8484
umf_result_t umfPoolGetMemoryProvider(umf_memory_pool_handle_t hPool,

src/memory_provider.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
*
88
*/
99

10+
#include "libumf.h"
1011
#include "memory_provider_internal.h"
1112
#include "utils_common.h"
1213

@@ -24,6 +25,7 @@ typedef struct umf_memory_provider_t {
2425
umf_result_t umfMemoryProviderCreate(const umf_memory_provider_ops_t *ops,
2526
void *params,
2627
umf_memory_provider_handle_t *hProvider) {
28+
libumfInit();
2729
if (!ops || !hProvider) {
2830
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
2931
}

src/memory_target.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,14 @@
1010
#include <assert.h>
1111
#include <stdlib.h>
1212

13+
#include "libumf.h"
1314
#include "memory_target.h"
1415
#include "memory_target_ops.h"
1516

1617
umf_result_t umfMemoryTargetCreate(const umf_memory_target_ops_t *ops,
1718
void *params,
1819
umf_memory_target_handle_t *memoryTarget) {
20+
libumfInit();
1921
if (!ops || !memoryTarget) {
2022
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
2123
}

src/provider/provider_tracking.c

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -73,13 +73,12 @@ static umf_result_t umfMemoryTrackerRemove(umf_memory_tracker_handle_t hTracker,
7373
return UMF_RESULT_SUCCESS;
7474
}
7575

76-
umf_memory_pool_handle_t
77-
umfMemoryTrackerGetPool(umf_memory_tracker_handle_t hTracker, const void *ptr) {
76+
umf_memory_pool_handle_t umfMemoryTrackerGetPool(const void *ptr) {
7877
assert(ptr);
7978

8079
uintptr_t rkey;
8180
tracker_value_t *rvalue;
82-
int found = critnib_find(hTracker->map, (uintptr_t)ptr, FIND_LE,
81+
int found = critnib_find(TRACKER->map, (uintptr_t)ptr, FIND_LE,
8382
(void *)&rkey, (void **)&rvalue);
8483
if (!found) {
8584
return NULL;
@@ -425,11 +424,10 @@ umf_memory_provider_ops_t UMF_TRACKING_MEMORY_PROVIDER_OPS = {
425424
umf_result_t umfTrackingMemoryProviderCreate(
426425
umf_memory_provider_handle_t hUpstream, umf_memory_pool_handle_t hPool,
427426
umf_memory_provider_handle_t *hTrackingProvider) {
428-
umfTrackingMemoryProviderInit();
429427

430428
umf_tracking_memory_provider_t params;
431429
params.hUpstream = hUpstream;
432-
params.hTracker = umfMemoryTrackerGet();
430+
params.hTracker = TRACKER;
433431
if (!params.hTracker) {
434432
return UMF_RESULT_ERROR_UNKNOWN;
435433
}
@@ -448,11 +446,39 @@ void umfTrackingMemoryProviderGetUpstreamProvider(
448446
*hUpstream = p->hUpstream;
449447
}
450448

451-
void umfTrackingMemoryProviderFini(void *tracker) {
452-
umf_memory_tracker_handle_t hTracker = (umf_memory_tracker_handle_t)tracker;
449+
umf_memory_tracker_handle_t umfMemoryTrackerCreate(void) {
450+
umf_memory_tracker_handle_t handle = (umf_memory_tracker_handle_t)malloc(
451+
sizeof(struct umf_memory_tracker_t));
452+
if (!handle) {
453+
return NULL;
454+
}
455+
456+
handle->map = critnib_new();
457+
if (!handle->map) {
458+
free(handle);
459+
return NULL;
460+
}
461+
462+
handle->splitMergeMutex = util_mutex_create();
463+
if (!handle->splitMergeMutex) {
464+
critnib_delete(handle->map);
465+
free(handle);
466+
return NULL;
467+
}
468+
469+
return handle;
470+
}
471+
472+
void umfMemoryTrackerDestroy(umf_memory_tracker_handle_t handle) {
473+
if (!handle) {
474+
return;
475+
}
476+
453477
#ifndef NDEBUG
454-
check_if_tracker_is_empty(hTracker, NULL);
478+
check_if_tracker_is_empty(handle, NULL);
455479
#endif /* NDEBUG */
456480

457-
umfMemoryTrackerDestroy(hTracker);
481+
critnib_delete(handle->map);
482+
util_mutex_destroy(handle->splitMergeMutex);
483+
free(handle);
458484
}

src/provider/provider_tracking.h

Lines changed: 4 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -24,63 +24,26 @@
2424
extern "C" {
2525
#endif
2626

27-
extern umf_memory_provider_ops_t UMF_TRACKING_MEMORY_PROVIDER_OPS;
28-
2927
struct umf_memory_tracker_t {
3028
critnib *map;
3129
os_mutex_t *splitMergeMutex;
3230
};
3331

3432
typedef struct umf_memory_tracker_t *umf_memory_tracker_handle_t;
3533

36-
static inline umf_memory_tracker_handle_t umfMemoryTrackerCreate(void) {
37-
umf_memory_tracker_handle_t handle = (umf_memory_tracker_handle_t)malloc(
38-
sizeof(struct umf_memory_tracker_t));
39-
if (!handle) {
40-
return NULL;
41-
}
42-
43-
handle->map = critnib_new();
44-
if (!handle->map) {
45-
free(handle);
46-
return NULL;
47-
}
34+
extern umf_memory_tracker_handle_t TRACKER;
4835

49-
handle->splitMergeMutex = util_mutex_create();
50-
if (!handle->splitMergeMutex) {
51-
critnib_delete(handle->map);
52-
free(handle);
53-
return NULL;
54-
}
36+
umf_memory_tracker_handle_t umfMemoryTrackerCreate(void);
37+
void umfMemoryTrackerDestroy(umf_memory_tracker_handle_t handle);
5538

56-
return handle;
57-
}
58-
59-
static inline void umfMemoryTrackerDestroy(umf_memory_tracker_handle_t handle) {
60-
if (!handle) {
61-
return;
62-
}
63-
64-
critnib_delete(handle->map);
65-
util_mutex_destroy(handle->splitMergeMutex);
66-
free(handle);
67-
}
68-
69-
umf_memory_tracker_handle_t umfMemoryTrackerGet(void);
70-
umf_memory_pool_handle_t
71-
umfMemoryTrackerGetPool(umf_memory_tracker_handle_t hTracker, const void *ptr);
39+
umf_memory_pool_handle_t umfMemoryTrackerGetPool(const void *ptr);
7240

7341
// Creates a memory provider that tracks each allocation/deallocation through umf_memory_tracker_handle_t and
7442
// forwards all requests to hUpstream memory Provider. hUpstream lifetime should be managed by the user of this function.
7543
umf_result_t umfTrackingMemoryProviderCreate(
7644
umf_memory_provider_handle_t hUpstream, umf_memory_pool_handle_t hPool,
7745
umf_memory_provider_handle_t *hTrackingProvider);
7846

79-
// Initialize critnib for a UMF static library build on Windows
80-
void umfTrackingMemoryProviderInit(void);
81-
82-
void umfTrackingMemoryProviderFini(void *tracker);
83-
8447
void umfTrackingMemoryProviderGetUpstreamProvider(
8548
umf_memory_provider_handle_t hTrackingProvider,
8649
umf_memory_provider_handle_t *hUpstream);

src/provider/provider_tracking_linux.c

Lines changed: 0 additions & 29 deletions
This file was deleted.

0 commit comments

Comments
 (0)