Skip to content

Commit b4e665f

Browse files
authored
Merge pull request #1097 from PietroGhg/pietro/refcounting
[NATIVECPU] Implement correct reference counting for Native CPU adapter
2 parents e197941 + b7731bc commit b4e665f

File tree

7 files changed

+21
-12
lines changed

7 files changed

+21
-12
lines changed

source/adapters/native_cpu/common.hpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,16 @@ struct _ur_object {
6161
ur_shared_mutex Mutex;
6262
};
6363

64+
// Todo: replace this with a common helper once it is available
6465
struct RefCounted {
6566
std::atomic_uint32_t _refCount;
66-
void incrementReferenceCount() { _refCount++; }
67-
void decrementReferenceCount() { _refCount--; }
67+
uint32_t incrementReferenceCount() { return ++_refCount; }
68+
uint32_t decrementReferenceCount() { return --_refCount; }
6869
RefCounted() : _refCount{1} {}
6970
uint32_t getReferenceCount() const { return _refCount; }
7071
};
72+
73+
template <typename T> inline void decrementOrDelete(T *refC) {
74+
if (refC->decrementReferenceCount() == 0)
75+
delete refC;
76+
}

source/adapters/native_cpu/context.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,13 @@ urContextCreate(uint32_t DeviceCount, const ur_device_handle_t *phDevices,
3232

3333
UR_APIEXPORT ur_result_t UR_APICALL
3434
urContextRetain(ur_context_handle_t hContext) {
35-
std::ignore = hContext;
36-
DIE_NO_IMPLEMENTATION
35+
hContext->incrementReferenceCount();
36+
return UR_RESULT_SUCCESS;
3737
}
3838

3939
UR_APIEXPORT ur_result_t UR_APICALL
4040
urContextRelease(ur_context_handle_t hContext) {
41-
delete hContext;
41+
decrementOrDelete(hContext);
4242
return UR_RESULT_SUCCESS;
4343
}
4444

source/adapters/native_cpu/context.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,10 @@
1212

1313
#include <ur_api.h>
1414

15+
#include "common.hpp"
1516
#include "device.hpp"
1617

17-
struct ur_context_handle_t_ {
18+
struct ur_context_handle_t_ : RefCounted {
1819
ur_context_handle_t_(ur_device_handle_t_ *phDevices) : _device{phDevices} {}
1920

2021
ur_device_handle_t _device;

source/adapters/native_cpu/kernel.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ UR_APIEXPORT ur_result_t UR_APICALL urKernelRetain(ur_kernel_handle_t hKernel) {
182182

183183
UR_APIEXPORT ur_result_t UR_APICALL
184184
urKernelRelease(ur_kernel_handle_t hKernel) {
185-
delete hKernel;
185+
decrementOrDelete(hKernel);
186186

187187
return UR_RESULT_SUCCESS;
188188
}

source/adapters/native_cpu/program.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,7 @@ urProgramRetain(ur_program_handle_t hProgram) {
115115

116116
UR_APIEXPORT ur_result_t UR_APICALL
117117
urProgramRelease(ur_program_handle_t hProgram) {
118-
delete hProgram;
119-
118+
decrementOrDelete(hProgram);
120119
return UR_RESULT_SUCCESS;
121120
}
122121

source/adapters/native_cpu/queue.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,14 @@ UR_APIEXPORT ur_result_t UR_APICALL urQueueCreate(
4343

4444
UR_APIEXPORT ur_result_t UR_APICALL urQueueRetain(ur_queue_handle_t hQueue) {
4545
std::ignore = hQueue;
46+
hQueue->incrementReferenceCount();
4647

47-
DIE_NO_IMPLEMENTATION;
48+
return UR_RESULT_SUCCESS;
4849
}
4950

5051
UR_APIEXPORT ur_result_t UR_APICALL urQueueRelease(ur_queue_handle_t hQueue) {
51-
delete hQueue;
52+
decrementOrDelete(hQueue);
53+
5254
return UR_RESULT_SUCCESS;
5355
}
5456

source/adapters/native_cpu/queue.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@
88
//
99
//===----------------------------------------------------------------------===//
1010
#pragma once
11+
#include "common.hpp"
1112

12-
struct ur_queue_handle_t_ {};
13+
struct ur_queue_handle_t_ : RefCounted {};

0 commit comments

Comments
 (0)