rusticl: Make EventSig take ownership of its environment
authorLingMan <18294-LingMan@users.noreply.gitlab.freedesktop.org>
Mon, 9 Oct 2023 17:38:26 +0000 (19:38 +0200)
committerMarge Bot <emma+marge@anholt.net>
Sun, 15 Oct 2023 00:17:10 +0000 (00:17 +0000)
Needed because some events may consume their inputs. E.g. it will shortly be needed for the SVMFreeCb.
SVMMemFill will also soon require mutable access.

Reviewed-by: Karol Herbst <kherbst@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25669>

src/gallium/frontends/rusticl/core/event.rs

index 4452092..ecea056 100644 (file)
@@ -24,7 +24,7 @@ static_assert!(CL_RUNNING == 1);
 static_assert!(CL_SUBMITTED == 2);
 static_assert!(CL_QUEUED == 3);
 
-pub type EventSig = Box<dyn Fn(&Arc<Queue>, &PipeContext) -> CLResult<()>>;
+pub type EventSig = Box<dyn FnOnce(&Arc<Queue>, &PipeContext) -> CLResult<()>>;
 
 pub enum EventTimes {
     Queued = CL_PROFILING_COMMAND_QUEUED as isize,
@@ -205,10 +205,9 @@ impl Event {
                 // We already have the lock so can't call set_time on the event
                 lock.time_submit = queue.device.screen().get_timestamp();
             }
-            let work = lock.work.take();
             let mut query_start = None;
             let mut query_end = None;
-            let new = work.as_ref().map_or(
+            let new = lock.work.take().map_or(
                 // if there is no work
                 CL_SUBMITTED as cl_int,
                 |w| {
@@ -229,10 +228,7 @@ 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);
+
             if profiling_enabled {
                 lock.time_start = query_start.unwrap().read_blocked();
                 lock.time_end = query_end.unwrap().read_blocked();