rusticl/event: drop work item before updating status
This fixes some CTS compiler tests where they relied on the cl_kernel
object to be released in time so it can recompile a program without
throwing CL_INVALID_OPERATION due to still having active kernel objects.
Fixes: 47a80d7ff4 ("rusticl/event: proper eventing support")
Signed-off-by: Karol Herbst <kherbst@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22510>
This commit is contained in:
@@ -29,6 +29,7 @@ struct EventMutState {
|
||||
status: cl_int,
|
||||
cbs: [Vec<(EventCB, *mut c_void)>; 3],
|
||||
fence: Option<PipeFence>,
|
||||
work: Option<EventSig>,
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
@@ -38,7 +39,6 @@ pub struct Event {
|
||||
pub queue: Option<Arc<Queue>>,
|
||||
pub cmd_type: cl_command_type,
|
||||
pub deps: Vec<Arc<Event>>,
|
||||
work: Option<EventSig>,
|
||||
state: Mutex<EventMutState>,
|
||||
cv: Condvar,
|
||||
}
|
||||
@@ -66,8 +66,8 @@ impl Event {
|
||||
status: CL_QUEUED as cl_int,
|
||||
cbs: [Vec::new(), Vec::new(), Vec::new()],
|
||||
fence: None,
|
||||
work: Some(work),
|
||||
}),
|
||||
work: Some(work),
|
||||
cv: Condvar::new(),
|
||||
})
|
||||
}
|
||||
@@ -83,8 +83,8 @@ impl Event {
|
||||
status: CL_SUBMITTED as cl_int,
|
||||
cbs: [Vec::new(), Vec::new(), Vec::new()],
|
||||
fence: None,
|
||||
work: None,
|
||||
}),
|
||||
work: None,
|
||||
cv: Condvar::new(),
|
||||
})
|
||||
}
|
||||
@@ -161,7 +161,8 @@ impl Event {
|
||||
let mut lock = self.state();
|
||||
let status = lock.status;
|
||||
if status == CL_QUEUED as cl_int {
|
||||
let new = self.work.as_ref().map_or(
|
||||
let work = lock.work.take();
|
||||
let new = work.as_ref().map_or(
|
||||
// if there is no work
|
||||
CL_SUBMITTED as cl_int,
|
||||
|w| {
|
||||
@@ -174,6 +175,10 @@ impl Event {
|
||||
res
|
||||
},
|
||||
);
|
||||
// we have to make sure that the work object is dropped before we notify about the
|
||||
// status change. It's probably fine to move the value above, but we have to be
|
||||
// absolutely sure it happens before the status update.
|
||||
drop(work);
|
||||
self.set_status(&mut lock, new);
|
||||
new
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user