12
12
13
13
struct ur_adapter_handle_t_ {
14
14
std::atomic<uint32_t > RefCount = 0 ;
15
+ std::mutex Mutex;
15
16
};
16
17
17
18
ur_adapter_handle_t_ adapter{};
18
19
19
20
UR_APIEXPORT ur_result_t UR_APICALL urInit (ur_device_init_flags_t ,
20
21
ur_loader_config_handle_t ) {
21
- cl_ext::ExtFuncPtrCache = new cl_ext::ExtFuncPtrCacheT ();
22
22
return UR_RESULT_SUCCESS;
23
23
}
24
24
25
25
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
- }
30
26
return UR_RESULT_SUCCESS;
31
27
}
32
28
33
29
UR_APIEXPORT ur_result_t UR_APICALL
34
30
urAdapterGet (uint32_t NumEntries, ur_adapter_handle_t *phAdapters,
35
31
uint32_t *pNumAdapters) {
36
32
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
+
37
38
*phAdapters = &adapter;
38
39
}
39
40
@@ -50,7 +51,10 @@ UR_APIEXPORT ur_result_t UR_APICALL urAdapterRetain(ur_adapter_handle_t) {
50
51
}
51
52
52
53
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
+ }
54
58
return UR_RESULT_SUCCESS;
55
59
}
56
60
0 commit comments