Skip to content

Commit 1dc76ce

Browse files
committed
[SYCL] Make sure to only release an event once
Signed-off-by: Sergey V Maslov <[email protected]>
1 parent 9db080b commit 1dc76ce

File tree

2 files changed

+18
-3
lines changed

2 files changed

+18
-3
lines changed

sycl/plugins/level_zero/pi_level_zero.cpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3849,6 +3849,15 @@ static pi_result cleanupAfterEvent(pi_event Event) {
38493849
PI_CALL(piKernelRelease(pi_cast<pi_kernel>(Event->CommandData)));
38503850
Event->CommandData = nullptr;
38513851
}
3852+
3853+
if (!Event->CleanedUp) {
3854+
Event->CleanedUp = true;
3855+
// Release this event since we explicitly retained it on creation.
3856+
// NOTE: that this needs to be done only once for an event so
3857+
// this is guarded with the CleanedUp flag.
3858+
//
3859+
PI_CALL(piEventRelease(Event));
3860+
}
38523861
}
38533862

38543863
// Make a list of all the dependent events that must have signalled
@@ -3873,9 +3882,6 @@ static pi_result cleanupAfterEvent(pi_event Event) {
38733882
PI_CALL(piEventRelease(DepEvent));
38743883
}
38753884

3876-
// Finally, release this event since we explicitly retained it on creation.
3877-
PI_CALL(piEventRelease(Event));
3878-
38793885
return PI_SUCCESS;
38803886
}
38813887

@@ -3937,6 +3943,9 @@ pi_result piEventRetain(pi_event Event) {
39373943

39383944
pi_result piEventRelease(pi_event Event) {
39393945
PI_ASSERT(Event, PI_INVALID_EVENT);
3946+
if (!Event->RefCount) {
3947+
die("piEventRelease: called on a destroyed event");
3948+
}
39403949

39413950
if (--(Event->RefCount) == 0) {
39423951
cleanupAfterEvent(Event);

sycl/plugins/level_zero/pi_level_zero.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -584,6 +584,12 @@ struct _pi_event : _pi_object {
584584
// enqueued, and must then be released when this event has signalled.
585585
// This list must be destroyed once the event has signalled.
586586
_pi_ze_event_list_t WaitList;
587+
588+
// Tracks if the needed cleanupAfterEvent was already performed for
589+
// a completed event. This allows to control that some cleanup
590+
// actions are performed only once.
591+
//
592+
bool CleanedUp = {false};
587593
};
588594

589595
struct _pi_program : _pi_object {

0 commit comments

Comments
 (0)