diff --git a/source/adapters/native_cpu/common.hpp b/source/adapters/native_cpu/common.hpp index 36ae7abd8b..d792cbbbcf 100644 --- a/source/adapters/native_cpu/common.hpp +++ b/source/adapters/native_cpu/common.hpp @@ -61,10 +61,16 @@ struct _ur_object { ur_shared_mutex Mutex; }; +// Todo: replace this with a common helper once it is available struct RefCounted { std::atomic_uint32_t _refCount; - void incrementReferenceCount() { _refCount++; } - void decrementReferenceCount() { _refCount--; } + uint32_t incrementReferenceCount() { return ++_refCount; } + uint32_t decrementReferenceCount() { return --_refCount; } RefCounted() : _refCount{1} {} uint32_t getReferenceCount() const { return _refCount; } }; + +template inline void decrementOrDelete(T *refC) { + if (refC->decrementReferenceCount() == 0) + delete refC; +} diff --git a/source/adapters/native_cpu/context.cpp b/source/adapters/native_cpu/context.cpp index e8732646f5..962525d1fc 100644 --- a/source/adapters/native_cpu/context.cpp +++ b/source/adapters/native_cpu/context.cpp @@ -32,13 +32,13 @@ urContextCreate(uint32_t DeviceCount, const ur_device_handle_t *phDevices, UR_APIEXPORT ur_result_t UR_APICALL urContextRetain(ur_context_handle_t hContext) { - std::ignore = hContext; - DIE_NO_IMPLEMENTATION + hContext->incrementReferenceCount(); + return UR_RESULT_SUCCESS; } UR_APIEXPORT ur_result_t UR_APICALL urContextRelease(ur_context_handle_t hContext) { - delete hContext; + decrementOrDelete(hContext); return UR_RESULT_SUCCESS; } diff --git a/source/adapters/native_cpu/context.hpp b/source/adapters/native_cpu/context.hpp index 04404d7988..30bfb31d71 100644 --- a/source/adapters/native_cpu/context.hpp +++ b/source/adapters/native_cpu/context.hpp @@ -12,9 +12,10 @@ #include +#include "common.hpp" #include "device.hpp" -struct ur_context_handle_t_ { +struct ur_context_handle_t_ : RefCounted { ur_context_handle_t_(ur_device_handle_t_ *phDevices) : _device{phDevices} {} ur_device_handle_t _device; diff --git a/source/adapters/native_cpu/kernel.cpp b/source/adapters/native_cpu/kernel.cpp index 96648e57f8..7a5c6be308 100644 --- a/source/adapters/native_cpu/kernel.cpp +++ b/source/adapters/native_cpu/kernel.cpp @@ -182,7 +182,7 @@ UR_APIEXPORT ur_result_t UR_APICALL urKernelRetain(ur_kernel_handle_t hKernel) { UR_APIEXPORT ur_result_t UR_APICALL urKernelRelease(ur_kernel_handle_t hKernel) { - delete hKernel; + decrementOrDelete(hKernel); return UR_RESULT_SUCCESS; } diff --git a/source/adapters/native_cpu/program.cpp b/source/adapters/native_cpu/program.cpp index 63b8c988ba..ccd96a3a24 100644 --- a/source/adapters/native_cpu/program.cpp +++ b/source/adapters/native_cpu/program.cpp @@ -115,8 +115,7 @@ urProgramRetain(ur_program_handle_t hProgram) { UR_APIEXPORT ur_result_t UR_APICALL urProgramRelease(ur_program_handle_t hProgram) { - delete hProgram; - + decrementOrDelete(hProgram); return UR_RESULT_SUCCESS; } diff --git a/source/adapters/native_cpu/queue.cpp b/source/adapters/native_cpu/queue.cpp index d4e85ce989..516e66db64 100644 --- a/source/adapters/native_cpu/queue.cpp +++ b/source/adapters/native_cpu/queue.cpp @@ -43,12 +43,14 @@ UR_APIEXPORT ur_result_t UR_APICALL urQueueCreate( UR_APIEXPORT ur_result_t UR_APICALL urQueueRetain(ur_queue_handle_t hQueue) { std::ignore = hQueue; + hQueue->incrementReferenceCount(); - DIE_NO_IMPLEMENTATION; + return UR_RESULT_SUCCESS; } UR_APIEXPORT ur_result_t UR_APICALL urQueueRelease(ur_queue_handle_t hQueue) { - delete hQueue; + decrementOrDelete(hQueue); + return UR_RESULT_SUCCESS; } diff --git a/source/adapters/native_cpu/queue.hpp b/source/adapters/native_cpu/queue.hpp index 0c7d812496..5e9039dd24 100644 --- a/source/adapters/native_cpu/queue.hpp +++ b/source/adapters/native_cpu/queue.hpp @@ -8,5 +8,6 @@ // //===----------------------------------------------------------------------===// #pragma once +#include "common.hpp" -struct ur_queue_handle_t_ {}; +struct ur_queue_handle_t_ : RefCounted {};