Skip to content

Commit 010dc4a

Browse files
authored
Merge pull request #2651 from igchor/fix_queue_variant
[L0 v2] fix queue destruction
2 parents e0c2da6 + 93766f1 commit 010dc4a

File tree

7 files changed

+47
-22
lines changed

7 files changed

+47
-22
lines changed

scripts/templates/queue_api.cpp.mako

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ ur_queue_t_::~ur_queue_t_() {}
3131
## FUNCTION ###################################################################
3232
namespace ${x}::level_zero {
3333
%for obj in th.get_queue_related_functions(specs, n, tags):
34+
%if not 'Release' in obj['name'] and not 'Retain' in obj['name']:
3435
${x}_result_t
3536
${th.make_func_name(n, tags, obj)}(
3637
%for line in th.make_param_lines(n, tags, obj, format=["name", "type", "delim"]):
@@ -42,5 +43,18 @@ try {
4243
} catch(...) {
4344
return exceptionToResult(std::current_exception());
4445
}
46+
%else:
47+
${x}_result_t
48+
${th.make_func_name(n, tags, obj)}(
49+
%for line in th.make_param_lines(n, tags, obj, format=["name", "type", "delim"]):
50+
${line}
51+
%endfor
52+
)
53+
try {
54+
return ${obj['params'][0]['name']}->${th.transform_queue_related_function_name(n, tags, obj, format=["name"])};
55+
} catch(...) {
56+
return exceptionToResult(std::current_exception());
57+
}
58+
%endif
4559
%endfor
4660
}

scripts/templates/queue_api.hpp.mako

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@ struct ur_queue_t_ {
3333
virtual void deferEventFree(ur_event_handle_t hEvent) = 0;
3434

3535
%for obj in th.get_queue_related_functions(specs, n, tags):
36+
%if not 'Release' in obj['name'] and not 'Retain' in obj['name']:
3637
virtual ${x}_result_t ${th.transform_queue_related_function_name(n, tags, obj, format=["type"])} = 0;
38+
%endif
3739
%endfor
3840

3941
virtual ur_result_t

source/adapters/level_zero/v2/queue_api.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,12 @@ ur_result_t urQueueGetInfo(ur_queue_handle_t hQueue, ur_queue_info_t propName,
3030
return exceptionToResult(std::current_exception());
3131
}
3232
ur_result_t urQueueRetain(ur_queue_handle_t hQueue) try {
33-
return hQueue->get().queueRetain();
33+
return hQueue->queueRetain();
3434
} catch (...) {
3535
return exceptionToResult(std::current_exception());
3636
}
3737
ur_result_t urQueueRelease(ur_queue_handle_t hQueue) try {
38-
return hQueue->get().queueRelease();
38+
return hQueue->queueRelease();
3939
} catch (...) {
4040
return exceptionToResult(std::current_exception());
4141
}

source/adapters/level_zero/v2/queue_api.hpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@ struct ur_queue_t_ {
2626

2727
virtual ur_result_t queueGetInfo(ur_queue_info_t, size_t, void *,
2828
size_t *) = 0;
29-
virtual ur_result_t queueRetain() = 0;
30-
virtual ur_result_t queueRelease() = 0;
3129
virtual ur_result_t queueGetNativeHandle(ur_queue_native_desc_t *,
3230
ur_native_handle_t *) = 0;
3331
virtual ur_result_t queueFinish() = 0;

source/adapters/level_zero/v2/queue_handle.hpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,24 @@ struct ur_queue_handle_t_ {
2929
ur_queue_t_ &get() {
3030
return std::visit([&](auto &q) -> ur_queue_t_ & { return q; }, queue_data);
3131
}
32+
33+
ur_result_t queueRetain() {
34+
return std::visit(
35+
[](auto &q) {
36+
q.RefCount.increment();
37+
return UR_RESULT_SUCCESS;
38+
},
39+
queue_data);
40+
}
41+
42+
ur_result_t queueRelease() {
43+
return std::visit(
44+
[queueHandle = this](auto &q) {
45+
if (!q.RefCount.decrementAndTest())
46+
return UR_RESULT_SUCCESS;
47+
delete queueHandle;
48+
return UR_RESULT_SUCCESS;
49+
},
50+
queue_data);
51+
}
3252
};

source/adapters/level_zero/v2/queue_immediate_in_order.cpp

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -133,21 +133,6 @@ ur_queue_immediate_in_order_t::queueGetInfo(ur_queue_info_t propName,
133133
return UR_RESULT_SUCCESS;
134134
}
135135

136-
ur_result_t ur_queue_immediate_in_order_t::queueRetain() {
137-
RefCount.increment();
138-
return UR_RESULT_SUCCESS;
139-
}
140-
141-
ur_result_t ur_queue_immediate_in_order_t::queueRelease() {
142-
if (!RefCount.decrementAndTest())
143-
return UR_RESULT_SUCCESS;
144-
145-
UR_CALL(queueFinish());
146-
147-
delete this;
148-
return UR_RESULT_SUCCESS;
149-
}
150-
151136
void ur_queue_immediate_in_order_t::deferEventFree(ur_event_handle_t hEvent) {
152137
std::unique_lock<ur_shared_mutex> lock(this->Mutex);
153138
deferredEvents.push_back(hEvent);
@@ -197,6 +182,14 @@ ur_result_t ur_queue_immediate_in_order_t::queueFlush() {
197182
return UR_RESULT_SUCCESS;
198183
}
199184

185+
ur_queue_immediate_in_order_t::~ur_queue_immediate_in_order_t() {
186+
try {
187+
UR_CALL_THROWS(queueFinish());
188+
} catch (...) {
189+
logger::error("Failed to finish queue on destruction");
190+
}
191+
}
192+
200193
ur_result_t ur_queue_immediate_in_order_t::enqueueKernelLaunch(
201194
ur_kernel_handle_t hKernel, uint32_t workDim,
202195
const size_t *pGlobalWorkOffset, const size_t *pGlobalWorkSize,

source/adapters/level_zero/v2/queue_immediate_in_order.hpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,12 +83,10 @@ struct ur_queue_immediate_in_order_t : _ur_object, public ur_queue_t_ {
8383
ur_native_handle_t, ur_queue_flags_t,
8484
bool ownZeQueue);
8585

86-
~ur_queue_immediate_in_order_t() {}
86+
~ur_queue_immediate_in_order_t();
8787

8888
ur_result_t queueGetInfo(ur_queue_info_t propName, size_t propSize,
8989
void *pPropValue, size_t *pPropSizeRet) override;
90-
ur_result_t queueRetain() override;
91-
ur_result_t queueRelease() override;
9290
ur_result_t queueGetNativeHandle(ur_queue_native_desc_t *pDesc,
9391
ur_native_handle_t *phNativeQueue) override;
9492
ur_result_t queueFinish() override;

0 commit comments

Comments
 (0)