diff --git a/src/gallium/frontends/rusticl/core/event.rs b/src/gallium/frontends/rusticl/core/event.rs index bc9ffe28204..febcdc27fef 100644 --- a/src/gallium/frontends/rusticl/core/event.rs +++ b/src/gallium/frontends/rusticl/core/event.rs @@ -29,6 +29,7 @@ struct EventMutState { status: cl_int, cbs: [Vec<(EventCB, *mut c_void)>; 3], fence: Option, + work: Option, } #[repr(C)] @@ -38,7 +39,6 @@ pub struct Event { pub queue: Option>, pub cmd_type: cl_command_type, pub deps: Vec>, - work: Option, state: Mutex, 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 {