Make wake_task safe

This commit is contained in:
Grant Miller 2023-01-29 16:32:12 -06:00
parent 48e1aab762
commit b6ca6d699a

View File

@ -444,14 +444,10 @@ impl Executor {
}
}
/// Wake a task by raw pointer.
/// Wake a task by `TaskRef`.
///
/// You can obtain task pointers from `Waker`s using [`task_from_waker`].
///
/// # Safety
///
/// `task` must be a valid task pointer obtained from [`task_from_waker`].
pub unsafe fn wake_task(task: TaskRef) {
/// You can obtain a `TaskRef` from a `Waker` using [`task_from_waker`].
pub fn wake_task(task: TaskRef) {
critical_section::with(|cs| {
let header = task.header();
let state = header.state.load(Ordering::Relaxed);
@ -465,8 +461,10 @@ pub unsafe fn wake_task(task: TaskRef) {
header.state.store(state | STATE_RUN_QUEUED, Ordering::Relaxed);
// We have just marked the task as scheduled, so enqueue it.
unsafe {
let executor = &*header.executor.get();
executor.enqueue(cs, task);
}
})
}