Skip to content

Commit f97c784

Browse files
committed
[L0 v2] implement raii wrapper for UR handles
with refcount support
1 parent 019a66c commit f97c784

File tree

1 file changed

+71
-0
lines changed

1 file changed

+71
-0
lines changed

source/adapters/level_zero/v2/common.hpp

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include <ze_api.h>
1515

1616
#include "../common.hpp"
17+
#include "logger/ur_logger.hpp"
1718

1819
namespace v2 {
1920

@@ -84,6 +85,70 @@ struct ze_handle_wrapper {
8485
bool ownZeHandle;
8586
};
8687

88+
template <typename URHandle, ur_result_t (*retain)(URHandle),
89+
ur_result_t (*release)(URHandle)>
90+
struct ur_shared_handle {
91+
using handle_t = URHandle;
92+
93+
ur_shared_handle() : handle(nullptr) {}
94+
explicit ur_shared_handle(handle_t handle) : handle(handle) {}
95+
~ur_shared_handle() {
96+
try {
97+
reset();
98+
} catch (...) {
99+
}
100+
}
101+
102+
ur_shared_handle(const ur_shared_handle &other) : handle(other.handle) {
103+
retain(handle);
104+
}
105+
ur_shared_handle(ur_shared_handle &&other) : handle(other.handle) {
106+
other.handle = nullptr;
107+
}
108+
ur_shared_handle(std::nullptr_t) : handle(nullptr) {}
109+
110+
void reset() {
111+
if (!handle) {
112+
return;
113+
}
114+
115+
UR_CALL_THROWS(release(handle));
116+
handle = nullptr;
117+
}
118+
119+
ur_shared_handle &operator=(const ur_shared_handle &other) {
120+
if (handle) {
121+
release(handle);
122+
}
123+
handle = other.handle;
124+
retain(handle);
125+
return *this;
126+
}
127+
ur_shared_handle &operator=(ur_shared_handle &&other) {
128+
if (handle) {
129+
release(handle);
130+
}
131+
handle = other.handle;
132+
other.handle = nullptr;
133+
return *this;
134+
}
135+
ur_shared_handle &operator=(std::nullptr_t) {
136+
if (handle) {
137+
release(handle);
138+
}
139+
new (this) ur_shared_handle(nullptr);
140+
return *this;
141+
}
142+
143+
handle_t *ptr() { return &handle; }
144+
handle_t get() const { return handle; }
145+
handle_t operator->() { return handle; }
146+
operator handle_t() { return handle; }
147+
148+
private:
149+
handle_t handle;
150+
};
151+
87152
using ze_kernel_handle_t =
88153
ze_handle_wrapper<::ze_kernel_handle_t, zeKernelDestroy>;
89154

@@ -93,5 +158,11 @@ using ze_event_handle_t =
93158
using ze_event_pool_handle_t =
94159
ze_handle_wrapper<::ze_event_pool_handle_t, zeEventPoolDestroy>;
95160

161+
using ur_queue_shared_handle_t =
162+
ur_shared_handle<ur_queue_handle_t, urQueueRetain, urQueueRelease>;
163+
164+
using ur_kernel_shared_handle_t =
165+
ur_shared_handle<ur_kernel_handle_t, urKernelRetain, urKernelRelease>;
166+
96167
} // namespace raii
97168
} // namespace v2

0 commit comments

Comments
 (0)