diff options
Diffstat (limited to 'embassy-executor/src/raw/mod.rs')
| -rw-r--r-- | embassy-executor/src/raw/mod.rs | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/embassy-executor/src/raw/mod.rs b/embassy-executor/src/raw/mod.rs index 7da14468d..bcbd214a9 100644 --- a/embassy-executor/src/raw/mod.rs +++ b/embassy-executor/src/raw/mod.rs | |||
| @@ -386,11 +386,11 @@ impl SyncExecutor { | |||
| 386 | /// - `task` must be set up to run in this executor. | 386 | /// - `task` must be set up to run in this executor. |
| 387 | /// - `task` must NOT be already enqueued (in this executor or another one). | 387 | /// - `task` must NOT be already enqueued (in this executor or another one). |
| 388 | #[inline(always)] | 388 | #[inline(always)] |
| 389 | unsafe fn enqueue(&self, task: TaskRef) { | 389 | unsafe fn enqueue(&self, task: TaskRef, l: state::Token) { |
| 390 | #[cfg(feature = "trace")] | 390 | #[cfg(feature = "trace")] |
| 391 | trace::task_ready_begin(self, &task); | 391 | trace::task_ready_begin(self, &task); |
| 392 | 392 | ||
| 393 | if self.run_queue.enqueue(task) { | 393 | if self.run_queue.enqueue(task, l) { |
| 394 | self.pender.pend(); | 394 | self.pender.pend(); |
| 395 | } | 395 | } |
| 396 | } | 396 | } |
| @@ -401,7 +401,9 @@ impl SyncExecutor { | |||
| 401 | #[cfg(feature = "trace")] | 401 | #[cfg(feature = "trace")] |
| 402 | trace::task_new(self, &task); | 402 | trace::task_new(self, &task); |
| 403 | 403 | ||
| 404 | self.enqueue(task); | 404 | state::locked(|l| { |
| 405 | self.enqueue(task, l); | ||
| 406 | }) | ||
| 405 | } | 407 | } |
| 406 | 408 | ||
| 407 | /// # Safety | 409 | /// # Safety |
| @@ -544,13 +546,13 @@ impl Executor { | |||
| 544 | /// You can obtain a `TaskRef` from a `Waker` using [`task_from_waker`]. | 546 | /// You can obtain a `TaskRef` from a `Waker` using [`task_from_waker`]. |
| 545 | pub fn wake_task(task: TaskRef) { | 547 | pub fn wake_task(task: TaskRef) { |
| 546 | let header = task.header(); | 548 | let header = task.header(); |
| 547 | if header.state.run_enqueue() { | 549 | header.state.run_enqueue(|l| { |
| 548 | // We have just marked the task as scheduled, so enqueue it. | 550 | // We have just marked the task as scheduled, so enqueue it. |
| 549 | unsafe { | 551 | unsafe { |
| 550 | let executor = header.executor.get().unwrap_unchecked(); | 552 | let executor = header.executor.get().unwrap_unchecked(); |
| 551 | executor.enqueue(task); | 553 | executor.enqueue(task, l); |
| 552 | } | 554 | } |
| 553 | } | 555 | }); |
| 554 | } | 556 | } |
| 555 | 557 | ||
| 556 | /// Wake a task by `TaskRef` without calling pend. | 558 | /// Wake a task by `TaskRef` without calling pend. |
| @@ -558,11 +560,11 @@ pub fn wake_task(task: TaskRef) { | |||
| 558 | /// You can obtain a `TaskRef` from a `Waker` using [`task_from_waker`]. | 560 | /// You can obtain a `TaskRef` from a `Waker` using [`task_from_waker`]. |
| 559 | pub fn wake_task_no_pend(task: TaskRef) { | 561 | pub fn wake_task_no_pend(task: TaskRef) { |
| 560 | let header = task.header(); | 562 | let header = task.header(); |
| 561 | if header.state.run_enqueue() { | 563 | header.state.run_enqueue(|l| { |
| 562 | // We have just marked the task as scheduled, so enqueue it. | 564 | // We have just marked the task as scheduled, so enqueue it. |
| 563 | unsafe { | 565 | unsafe { |
| 564 | let executor = header.executor.get().unwrap_unchecked(); | 566 | let executor = header.executor.get().unwrap_unchecked(); |
| 565 | executor.run_queue.enqueue(task); | 567 | executor.run_queue.enqueue(task, l); |
| 566 | } | 568 | } |
| 567 | } | 569 | }); |
| 568 | } | 570 | } |
