aboutsummaryrefslogtreecommitdiff
path: root/embassy-executor/src
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2025-12-19 12:42:22 +0100
committerGitHub <[email protected]>2025-12-19 12:42:22 +0100
commit905bdfa7662c2ac5d2dfc81219c9704955473253 (patch)
treeb04f494ce37d42a6d3afa9b8441ab412480786c6 /embassy-executor/src
parent14efaf71d76ad0af569522ee0c4082d473fdede7 (diff)
parente62adea1f93f8eaba2f9da5ebe90e5f23a480101 (diff)
Merge pull request #5100 from bugadani/fallible-from-waker2
executor: Add fallible from_waker getter
Diffstat (limited to 'embassy-executor/src')
-rw-r--r--embassy-executor/src/raw/mod.rs6
-rw-r--r--embassy-executor/src/raw/waker.rs13
-rw-r--r--embassy-executor/src/raw/waker_turbo.rs4
3 files changed, 19 insertions, 4 deletions
diff --git a/embassy-executor/src/raw/mod.rs b/embassy-executor/src/raw/mod.rs
index ab845ed3b..2b7560de6 100644
--- a/embassy-executor/src/raw/mod.rs
+++ b/embassy-executor/src/raw/mod.rs
@@ -49,6 +49,7 @@ use self::run_queue::{RunQueue, RunQueueItem};
49use self::state::State; 49use self::state::State;
50use self::util::{SyncUnsafeCell, UninitCell}; 50use self::util::{SyncUnsafeCell, UninitCell};
51pub use self::waker::task_from_waker; 51pub use self::waker::task_from_waker;
52use self::waker::try_task_from_waker;
52use super::SpawnToken; 53use super::SpawnToken;
53use crate::{Metadata, SpawnError}; 54use crate::{Metadata, SpawnError};
54 55
@@ -57,6 +58,11 @@ extern "Rust" fn __embassy_time_queue_item_from_waker(waker: &Waker) -> &'static
57 unsafe { task_from_waker(waker).timer_queue_item() } 58 unsafe { task_from_waker(waker).timer_queue_item() }
58} 59}
59 60
61#[unsafe(no_mangle)]
62extern "Rust" fn __try_embassy_time_queue_item_from_waker(waker: &Waker) -> Option<&'static mut TimerQueueItem> {
63 unsafe { try_task_from_waker(waker).map(|task| task.timer_queue_item()) }
64}
65
60/// Raw task header for use in task pointers. 66/// Raw task header for use in task pointers.
61/// 67///
62/// A task can be in one of the following states: 68/// A task can be in one of the following states:
diff --git a/embassy-executor/src/raw/waker.rs b/embassy-executor/src/raw/waker.rs
index 2706f0fdf..8416f9f93 100644
--- a/embassy-executor/src/raw/waker.rs
+++ b/embassy-executor/src/raw/waker.rs
@@ -32,13 +32,18 @@ pub(crate) unsafe fn from_task(p: TaskRef) -> Waker {
32/// 32///
33/// Panics if the waker is not created by the Embassy executor. 33/// Panics if the waker is not created by the Embassy executor.
34pub fn task_from_waker(waker: &Waker) -> TaskRef { 34pub fn task_from_waker(waker: &Waker) -> TaskRef {
35 unwrap!(
36 try_task_from_waker(waker),
37 "Found waker not created by the Embassy executor. Unless the generic timer queue is enabled, `embassy_time::Timer` only works with the Embassy executor."
38 )
39}
40
41pub(crate) fn try_task_from_waker(waker: &Waker) -> Option<TaskRef> {
35 // make sure to compare vtable addresses. Doing `==` on the references 42 // make sure to compare vtable addresses. Doing `==` on the references
36 // will compare the contents, which is slower. 43 // will compare the contents, which is slower.
37 if waker.vtable() as *const _ != &VTABLE as *const _ { 44 if waker.vtable() as *const _ != &VTABLE as *const _ {
38 panic!( 45 return None;
39 "Found waker not created by the Embassy executor. `embassy_time::Timer` only works with the Embassy executor."
40 )
41 } 46 }
42 // safety: our wakers are always created with `TaskRef::as_ptr` 47 // safety: our wakers are always created with `TaskRef::as_ptr`
43 unsafe { TaskRef::from_ptr(waker.data() as *const TaskHeader) } 48 Some(unsafe { TaskRef::from_ptr(waker.data() as *const TaskHeader) })
44} 49}
diff --git a/embassy-executor/src/raw/waker_turbo.rs b/embassy-executor/src/raw/waker_turbo.rs
index 919bcc61a..ee33e7633 100644
--- a/embassy-executor/src/raw/waker_turbo.rs
+++ b/embassy-executor/src/raw/waker_turbo.rs
@@ -25,6 +25,10 @@ pub fn task_from_waker(waker: &Waker) -> TaskRef {
25 unsafe { TaskRef::from_ptr(ptr as *const TaskHeader) } 25 unsafe { TaskRef::from_ptr(ptr as *const TaskHeader) }
26} 26}
27 27
28pub(crate) fn try_task_from_waker(waker: &Waker) -> Option<TaskRef> {
29 Some(task_from_waker(waker))
30}
31
28#[inline(never)] 32#[inline(never)]
29#[unsafe(no_mangle)] 33#[unsafe(no_mangle)]
30fn _turbo_wake(ptr: NonNull<()>) { 34fn _turbo_wake(ptr: NonNull<()>) {