rusticl: Make EventSig take ownership of its environment

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>
This commit is contained in:
LingMan 2023-10-09 19:38:26 +02:00 committed by Marge Bot
parent bef50d164f
commit 16383332a9

View 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();