1414#include < ze_api.h>
1515
1616#include " ../common.hpp"
17+ #include " logger/ur_logger.hpp"
1718
1819namespace 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+
87152using ze_kernel_handle_t =
88153 ze_handle_wrapper<::ze_kernel_handle_t , zeKernelDestroy>;
89154
@@ -93,5 +158,11 @@ using ze_event_handle_t =
93158using 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