diff options
| author | Peter Krull <[email protected]> | 2024-09-23 19:02:59 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2024-09-23 19:02:59 +0200 |
| commit | a2c473306f4a7c8e99add2546450ab3a7a97436e (patch) | |
| tree | 5522a708e492db7d4632dc0a56fe5057244f03f0 /embassy-executor/src | |
| parent | e02a987bafd4f0fcf9d80e7c4f6e1504b8b02cec (diff) | |
| parent | 2935290a6222536d6341103f91bfd732165d3862 (diff) | |
Merge branch 'embassy-rs:main' into multi-signal
Diffstat (limited to 'embassy-executor/src')
| -rw-r--r-- | embassy-executor/src/arch/riscv32.rs | 2 | ||||
| -rw-r--r-- | embassy-executor/src/fmt.rs | 34 | ||||
| -rw-r--r-- | embassy-executor/src/raw/mod.rs | 2 | ||||
| -rw-r--r-- | embassy-executor/src/raw/waker.rs | 38 |
4 files changed, 49 insertions, 27 deletions
diff --git a/embassy-executor/src/arch/riscv32.rs b/embassy-executor/src/arch/riscv32.rs index c56f502d3..01e63a9fd 100644 --- a/embassy-executor/src/arch/riscv32.rs +++ b/embassy-executor/src/arch/riscv32.rs | |||
| @@ -6,9 +6,9 @@ pub use thread::*; | |||
| 6 | #[cfg(feature = "executor-thread")] | 6 | #[cfg(feature = "executor-thread")] |
| 7 | mod thread { | 7 | mod thread { |
| 8 | use core::marker::PhantomData; | 8 | use core::marker::PhantomData; |
| 9 | use core::sync::atomic::{AtomicBool, Ordering}; | ||
| 9 | 10 | ||
| 10 | pub use embassy_executor_macros::main_riscv as main; | 11 | pub use embassy_executor_macros::main_riscv as main; |
| 11 | use portable_atomic::{AtomicBool, Ordering}; | ||
| 12 | 12 | ||
| 13 | use crate::{raw, Spawner}; | 13 | use crate::{raw, Spawner}; |
| 14 | 14 | ||
diff --git a/embassy-executor/src/fmt.rs b/embassy-executor/src/fmt.rs index 78e583c1c..8ca61bc39 100644 --- a/embassy-executor/src/fmt.rs +++ b/embassy-executor/src/fmt.rs | |||
| @@ -1,11 +1,12 @@ | |||
| 1 | #![macro_use] | 1 | #![macro_use] |
| 2 | #![allow(unused_macros)] | 2 | #![allow(unused)] |
| 3 | 3 | ||
| 4 | use core::fmt::{Debug, Display, LowerHex}; | 4 | use core::fmt::{Debug, Display, LowerHex}; |
| 5 | 5 | ||
| 6 | #[cfg(all(feature = "defmt", feature = "log"))] | 6 | #[cfg(all(feature = "defmt", feature = "log"))] |
| 7 | compile_error!("You may not enable both `defmt` and `log` features."); | 7 | compile_error!("You may not enable both `defmt` and `log` features."); |
| 8 | 8 | ||
| 9 | #[collapse_debuginfo(yes)] | ||
| 9 | macro_rules! assert { | 10 | macro_rules! assert { |
| 10 | ($($x:tt)*) => { | 11 | ($($x:tt)*) => { |
| 11 | { | 12 | { |
| @@ -17,6 +18,7 @@ macro_rules! assert { | |||
| 17 | }; | 18 | }; |
| 18 | } | 19 | } |
| 19 | 20 | ||
| 21 | #[collapse_debuginfo(yes)] | ||
| 20 | macro_rules! assert_eq { | 22 | macro_rules! assert_eq { |
| 21 | ($($x:tt)*) => { | 23 | ($($x:tt)*) => { |
| 22 | { | 24 | { |
| @@ -28,6 +30,7 @@ macro_rules! assert_eq { | |||
| 28 | }; | 30 | }; |
| 29 | } | 31 | } |
| 30 | 32 | ||
| 33 | #[collapse_debuginfo(yes)] | ||
| 31 | macro_rules! assert_ne { | 34 | macro_rules! assert_ne { |
| 32 | ($($x:tt)*) => { | 35 | ($($x:tt)*) => { |
| 33 | { | 36 | { |
| @@ -39,6 +42,7 @@ macro_rules! assert_ne { | |||
| 39 | }; | 42 | }; |
| 40 | } | 43 | } |
| 41 | 44 | ||
| 45 | #[collapse_debuginfo(yes)] | ||
| 42 | macro_rules! debug_assert { | 46 | macro_rules! debug_assert { |
| 43 | ($($x:tt)*) => { | 47 | ($($x:tt)*) => { |
| 44 | { | 48 | { |
| @@ -50,6 +54,7 @@ macro_rules! debug_assert { | |||
| 50 | }; | 54 | }; |
| 51 | } | 55 | } |
| 52 | 56 | ||
| 57 | #[collapse_debuginfo(yes)] | ||
| 53 | macro_rules! debug_assert_eq { | 58 | macro_rules! debug_assert_eq { |
| 54 | ($($x:tt)*) => { | 59 | ($($x:tt)*) => { |
| 55 | { | 60 | { |
| @@ -61,6 +66,7 @@ macro_rules! debug_assert_eq { | |||
| 61 | }; | 66 | }; |
| 62 | } | 67 | } |
| 63 | 68 | ||
| 69 | #[collapse_debuginfo(yes)] | ||
| 64 | macro_rules! debug_assert_ne { | 70 | macro_rules! debug_assert_ne { |
| 65 | ($($x:tt)*) => { | 71 | ($($x:tt)*) => { |
| 66 | { | 72 | { |
| @@ -72,6 +78,7 @@ macro_rules! debug_assert_ne { | |||
| 72 | }; | 78 | }; |
| 73 | } | 79 | } |
| 74 | 80 | ||
| 81 | #[collapse_debuginfo(yes)] | ||
| 75 | macro_rules! todo { | 82 | macro_rules! todo { |
| 76 | ($($x:tt)*) => { | 83 | ($($x:tt)*) => { |
| 77 | { | 84 | { |
| @@ -83,20 +90,19 @@ macro_rules! todo { | |||
| 83 | }; | 90 | }; |
| 84 | } | 91 | } |
| 85 | 92 | ||
| 86 | #[cfg(not(feature = "defmt"))] | 93 | #[collapse_debuginfo(yes)] |
| 87 | macro_rules! unreachable { | 94 | macro_rules! unreachable { |
| 88 | ($($x:tt)*) => { | 95 | ($($x:tt)*) => { |
| 89 | ::core::unreachable!($($x)*) | 96 | { |
| 90 | }; | 97 | #[cfg(not(feature = "defmt"))] |
| 91 | } | 98 | ::core::unreachable!($($x)*); |
| 92 | 99 | #[cfg(feature = "defmt")] | |
| 93 | #[cfg(feature = "defmt")] | 100 | ::defmt::unreachable!($($x)*); |
| 94 | macro_rules! unreachable { | 101 | } |
| 95 | ($($x:tt)*) => { | ||
| 96 | ::defmt::unreachable!($($x)*) | ||
| 97 | }; | 102 | }; |
| 98 | } | 103 | } |
| 99 | 104 | ||
| 105 | #[collapse_debuginfo(yes)] | ||
| 100 | macro_rules! panic { | 106 | macro_rules! panic { |
| 101 | ($($x:tt)*) => { | 107 | ($($x:tt)*) => { |
| 102 | { | 108 | { |
| @@ -108,6 +114,7 @@ macro_rules! panic { | |||
| 108 | }; | 114 | }; |
| 109 | } | 115 | } |
| 110 | 116 | ||
| 117 | #[collapse_debuginfo(yes)] | ||
| 111 | macro_rules! trace { | 118 | macro_rules! trace { |
| 112 | ($s:literal $(, $x:expr)* $(,)?) => { | 119 | ($s:literal $(, $x:expr)* $(,)?) => { |
| 113 | { | 120 | { |
| @@ -121,6 +128,7 @@ macro_rules! trace { | |||
| 121 | }; | 128 | }; |
| 122 | } | 129 | } |
| 123 | 130 | ||
| 131 | #[collapse_debuginfo(yes)] | ||
| 124 | macro_rules! debug { | 132 | macro_rules! debug { |
| 125 | ($s:literal $(, $x:expr)* $(,)?) => { | 133 | ($s:literal $(, $x:expr)* $(,)?) => { |
| 126 | { | 134 | { |
| @@ -134,6 +142,7 @@ macro_rules! debug { | |||
| 134 | }; | 142 | }; |
| 135 | } | 143 | } |
| 136 | 144 | ||
| 145 | #[collapse_debuginfo(yes)] | ||
| 137 | macro_rules! info { | 146 | macro_rules! info { |
| 138 | ($s:literal $(, $x:expr)* $(,)?) => { | 147 | ($s:literal $(, $x:expr)* $(,)?) => { |
| 139 | { | 148 | { |
| @@ -147,6 +156,7 @@ macro_rules! info { | |||
| 147 | }; | 156 | }; |
| 148 | } | 157 | } |
| 149 | 158 | ||
| 159 | #[collapse_debuginfo(yes)] | ||
| 150 | macro_rules! warn { | 160 | macro_rules! warn { |
| 151 | ($s:literal $(, $x:expr)* $(,)?) => { | 161 | ($s:literal $(, $x:expr)* $(,)?) => { |
| 152 | { | 162 | { |
| @@ -160,6 +170,7 @@ macro_rules! warn { | |||
| 160 | }; | 170 | }; |
| 161 | } | 171 | } |
| 162 | 172 | ||
| 173 | #[collapse_debuginfo(yes)] | ||
| 163 | macro_rules! error { | 174 | macro_rules! error { |
| 164 | ($s:literal $(, $x:expr)* $(,)?) => { | 175 | ($s:literal $(, $x:expr)* $(,)?) => { |
| 165 | { | 176 | { |
| @@ -174,6 +185,7 @@ macro_rules! error { | |||
| 174 | } | 185 | } |
| 175 | 186 | ||
| 176 | #[cfg(feature = "defmt")] | 187 | #[cfg(feature = "defmt")] |
| 188 | #[collapse_debuginfo(yes)] | ||
| 177 | macro_rules! unwrap { | 189 | macro_rules! unwrap { |
| 178 | ($($x:tt)*) => { | 190 | ($($x:tt)*) => { |
| 179 | ::defmt::unwrap!($($x)*) | 191 | ::defmt::unwrap!($($x)*) |
| @@ -181,6 +193,7 @@ macro_rules! unwrap { | |||
| 181 | } | 193 | } |
| 182 | 194 | ||
| 183 | #[cfg(not(feature = "defmt"))] | 195 | #[cfg(not(feature = "defmt"))] |
| 196 | #[collapse_debuginfo(yes)] | ||
| 184 | macro_rules! unwrap { | 197 | macro_rules! unwrap { |
| 185 | ($arg:expr) => { | 198 | ($arg:expr) => { |
| 186 | match $crate::fmt::Try::into_result($arg) { | 199 | match $crate::fmt::Try::into_result($arg) { |
| @@ -229,7 +242,6 @@ impl<T, E> Try for Result<T, E> { | |||
| 229 | } | 242 | } |
| 230 | } | 243 | } |
| 231 | 244 | ||
| 232 | #[allow(unused)] | ||
| 233 | pub(crate) struct Bytes<'a>(pub &'a [u8]); | 245 | pub(crate) struct Bytes<'a>(pub &'a [u8]); |
| 234 | 246 | ||
| 235 | impl<'a> Debug for Bytes<'a> { | 247 | impl<'a> Debug for Bytes<'a> { |
diff --git a/embassy-executor/src/raw/mod.rs b/embassy-executor/src/raw/mod.rs index 3d5e3ab9f..d9ea5c005 100644 --- a/embassy-executor/src/raw/mod.rs +++ b/embassy-executor/src/raw/mod.rs | |||
| @@ -30,7 +30,7 @@ use core::ptr::NonNull; | |||
| 30 | use core::task::{Context, Poll}; | 30 | use core::task::{Context, Poll}; |
| 31 | 31 | ||
| 32 | #[cfg(feature = "integrated-timers")] | 32 | #[cfg(feature = "integrated-timers")] |
| 33 | use embassy_time_driver::{self, AlarmHandle}; | 33 | use embassy_time_driver::AlarmHandle; |
| 34 | #[cfg(feature = "rtos-trace")] | 34 | #[cfg(feature = "rtos-trace")] |
| 35 | use rtos_trace::trace; | 35 | use rtos_trace::trace; |
| 36 | 36 | ||
diff --git a/embassy-executor/src/raw/waker.rs b/embassy-executor/src/raw/waker.rs index 522853e34..8bb2cfd05 100644 --- a/embassy-executor/src/raw/waker.rs +++ b/embassy-executor/src/raw/waker.rs | |||
| @@ -1,4 +1,3 @@ | |||
| 1 | use core::mem; | ||
| 2 | use core::task::{RawWaker, RawWakerVTable, Waker}; | 1 | use core::task::{RawWaker, RawWakerVTable, Waker}; |
| 3 | 2 | ||
| 4 | use super::{wake_task, TaskHeader, TaskRef}; | 3 | use super::{wake_task, TaskHeader, TaskRef}; |
| @@ -33,20 +32,31 @@ pub(crate) unsafe fn from_task(p: TaskRef) -> Waker { | |||
| 33 | /// | 32 | /// |
| 34 | /// Panics if the waker is not created by the Embassy executor. | 33 | /// Panics if the waker is not created by the Embassy executor. |
| 35 | pub fn task_from_waker(waker: &Waker) -> TaskRef { | 34 | pub fn task_from_waker(waker: &Waker) -> TaskRef { |
| 36 | // safety: OK because WakerHack has the same layout as Waker. | 35 | let (vtable, data) = { |
| 37 | // This is not really guaranteed because the structs are `repr(Rust)`, it is | 36 | #[cfg(not(feature = "nightly"))] |
| 38 | // indeed the case in the current implementation. | 37 | { |
| 39 | // TODO use waker_getters when stable. https://github.com/rust-lang/rust/issues/96992 | 38 | struct WakerHack { |
| 40 | let hack: &WakerHack = unsafe { mem::transmute(waker) }; | 39 | data: *const (), |
| 41 | if hack.vtable != &VTABLE { | 40 | vtable: &'static RawWakerVTable, |
| 41 | } | ||
| 42 | |||
| 43 | // safety: OK because WakerHack has the same layout as Waker. | ||
| 44 | // This is not really guaranteed because the structs are `repr(Rust)`, it is | ||
| 45 | // indeed the case in the current implementation. | ||
| 46 | // TODO use waker_getters when stable. https://github.com/rust-lang/rust/issues/96992 | ||
| 47 | let hack: &WakerHack = unsafe { core::mem::transmute(waker) }; | ||
| 48 | (hack.vtable, hack.data) | ||
| 49 | } | ||
| 50 | |||
| 51 | #[cfg(feature = "nightly")] | ||
| 52 | { | ||
| 53 | (waker.vtable(), waker.data()) | ||
| 54 | } | ||
| 55 | }; | ||
| 56 | |||
| 57 | if vtable != &VTABLE { | ||
| 42 | panic!("Found waker not created by the Embassy executor. `embassy_time::Timer` only works with the Embassy executor.") | 58 | panic!("Found waker not created by the Embassy executor. `embassy_time::Timer` only works with the Embassy executor.") |
| 43 | } | 59 | } |
| 44 | |||
| 45 | // safety: our wakers are always created with `TaskRef::as_ptr` | 60 | // safety: our wakers are always created with `TaskRef::as_ptr` |
| 46 | unsafe { TaskRef::from_ptr(hack.data as *const TaskHeader) } | 61 | unsafe { TaskRef::from_ptr(data as *const TaskHeader) } |
| 47 | } | ||
| 48 | |||
| 49 | struct WakerHack { | ||
| 50 | data: *const (), | ||
| 51 | vtable: &'static RawWakerVTable, | ||
| 52 | } | 62 | } |
