14
14
#include < ze_api.h>
15
15
16
16
#include " ../common.hpp"
17
+ #include " logger/ur_logger.hpp"
17
18
18
19
namespace v2 {
19
20
@@ -84,6 +85,70 @@ struct ze_handle_wrapper {
84
85
bool ownZeHandle;
85
86
};
86
87
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
+
87
152
using ze_kernel_handle_t =
88
153
ze_handle_wrapper<::ze_kernel_handle_t , zeKernelDestroy>;
89
154
@@ -93,5 +158,11 @@ using ze_event_handle_t =
93
158
using ze_event_pool_handle_t =
94
159
ze_handle_wrapper<::ze_event_pool_handle_t , zeEventPoolDestroy>;
95
160
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
+
96
167
} // namespace raii
97
168
} // namespace v2
0 commit comments