Skip to content

Commit 612a263

Browse files
authored
Merge pull request #1011 from fabiomestre/fabio/fix_opencl_leak
[OpenCL] Fix memory leak
2 parents 7db941d + 55409e4 commit 612a263

File tree

2 files changed

+11
-7
lines changed

2 files changed

+11
-7
lines changed

source/adapters/opencl/adapter.cpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,28 +12,29 @@
1212

1313
struct ur_adapter_handle_t_ {
1414
std::atomic<uint32_t> RefCount = 0;
15+
std::mutex Mutex;
1516
};
1617

1718
ur_adapter_handle_t_ adapter{};
1819

1920
UR_APIEXPORT ur_result_t UR_APICALL urInit(ur_device_init_flags_t,
2021
ur_loader_config_handle_t) {
21-
cl_ext::ExtFuncPtrCache = new cl_ext::ExtFuncPtrCacheT();
2222
return UR_RESULT_SUCCESS;
2323
}
2424

2525
UR_APIEXPORT ur_result_t UR_APICALL urTearDown(void *) {
26-
if (cl_ext::ExtFuncPtrCache) {
27-
delete cl_ext::ExtFuncPtrCache;
28-
cl_ext::ExtFuncPtrCache = nullptr;
29-
}
3026
return UR_RESULT_SUCCESS;
3127
}
3228

3329
UR_APIEXPORT ur_result_t UR_APICALL
3430
urAdapterGet(uint32_t NumEntries, ur_adapter_handle_t *phAdapters,
3531
uint32_t *pNumAdapters) {
3632
if (NumEntries > 0 && phAdapters) {
33+
std::lock_guard<std::mutex> Lock{adapter.Mutex};
34+
if (adapter.RefCount++ == 0) {
35+
cl_ext::ExtFuncPtrCache = std::make_unique<cl_ext::ExtFuncPtrCacheT>();
36+
}
37+
3738
*phAdapters = &adapter;
3839
}
3940

@@ -50,7 +51,10 @@ UR_APIEXPORT ur_result_t UR_APICALL urAdapterRetain(ur_adapter_handle_t) {
5051
}
5152

5253
UR_APIEXPORT ur_result_t UR_APICALL urAdapterRelease(ur_adapter_handle_t) {
53-
--adapter.RefCount;
54+
std::lock_guard<std::mutex> Lock{adapter.Mutex};
55+
if (--adapter.RefCount == 0) {
56+
cl_ext::ExtFuncPtrCache.reset();
57+
}
5458
return UR_RESULT_SUCCESS;
5559
}
5660

source/adapters/opencl/common.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ struct ExtFuncPtrCacheT {
260260
// piTeardown to avoid issues with static destruction order (a user application
261261
// might have static objects that indirectly access this cache in their
262262
// destructor).
263-
inline ExtFuncPtrCacheT *ExtFuncPtrCache;
263+
inline std::unique_ptr<ExtFuncPtrCacheT> ExtFuncPtrCache;
264264

265265
// USM helper function to get an extension function pointer
266266
template <typename T>

0 commit comments

Comments
 (0)