Skip to content

Commit e7a8e07

Browse files
committed
zephyr: Convert Queue to new atomic initializer up
Convert to the new atomic initializer format. This makes the `new()` constructor `const` allowing queues to be used as statics. Similar to the API change to Semaphore, the constructor no longer returns a Result, just the Queue directly. Signed-off-by: David Brown <[email protected]>
1 parent aa85a14 commit e7a8e07

File tree

3 files changed

+16
-49
lines changed

3 files changed

+16
-49
lines changed

zephyr/src/sync/channel.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ pub fn unbounded_from<T>(queue: Queue) -> (Sender<T>, Receiver<T>) {
9393
/// receivers will likely be blocked forever. Any data that has been queued and not received will
9494
/// be leaked when all receivers have been droped.
9595
pub fn unbounded<T>() -> (Sender<T>, Receiver<T>) {
96-
unbounded_from(Queue::new().unwrap())
96+
unbounded_from(Queue::new())
9797
}
9898

9999
/// Create a multi-producer multi-consumer channel with bounded capacity.
@@ -582,8 +582,8 @@ impl<T> Bounded<T> {
582582
.collect();
583583
let slots = Box::into_pin(slots);
584584

585-
let free = Queue::new().unwrap();
586-
let chan = Queue::new().unwrap();
585+
let free = Queue::new();
586+
let chan = Queue::new();
587587

588588
// Add each of the boxes to the free list.
589589
for slot in slots.as_ref().iter() {

zephyr/src/sys/queue.rs

Lines changed: 12 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,14 @@
66
77
use core::ffi::c_void;
88
use core::fmt;
9-
#[cfg(CONFIG_RUST_ALLOC)]
10-
use core::mem;
119

1210
use zephyr_sys::{k_queue, k_queue_append, k_queue_get, k_queue_init};
1311

14-
#[cfg(CONFIG_RUST_ALLOC)]
15-
use crate::error::Result;
16-
use crate::object::{Fixed, StaticKernelObject, Wrapped};
12+
use crate::object::{ObjectInit, ZephyrObject};
1713
use crate::time::Timeout;
1814

1915
/// A wrapper around a Zephyr `k_queue` object.
20-
pub struct Queue {
21-
pub(crate) item: Fixed<k_queue>,
22-
}
23-
24-
unsafe impl Sync for StaticKernelObject<k_queue> {}
16+
pub struct Queue(pub(crate) ZephyrObject<k_queue>);
2517

2618
unsafe impl Sync for Queue {}
2719
unsafe impl Send for Queue {}
@@ -33,13 +25,8 @@ impl Queue {
3325
///
3426
/// **Note**: When a Queue is dropped, any messages that have been added to the queue will be
3527
/// leaked.
36-
#[cfg(CONFIG_RUST_ALLOC)]
37-
pub fn new() -> Result<Queue> {
38-
let item: Fixed<k_queue> = Fixed::new(unsafe { mem::zeroed() });
39-
unsafe {
40-
k_queue_init(item.get());
41-
}
42-
Ok(Queue { item })
28+
pub const fn new() -> Queue {
29+
Queue(<ZephyrObject<k_queue>>::new_raw())
4330
}
4431

4532
/// Append an element to the end of a queue.
@@ -61,7 +48,7 @@ impl Queue {
6148
/// These are easiest to satisfy by ensuring the message is Boxed, and owned by the queue
6249
/// system.
6350
pub unsafe fn send(&self, data: *mut c_void) {
64-
k_queue_append(self.item.get(), data)
51+
k_queue_append(self.0.get(), data)
6552
}
6653

6754
/// Get an element from a queue.
@@ -84,42 +71,22 @@ impl Queue {
8471
T: Into<Timeout>,
8572
{
8673
let timeout: Timeout = timeout.into();
87-
k_queue_get(self.item.get(), timeout.0)
74+
k_queue_get(self.0.get(), timeout.0)
8875
}
8976
}
9077

91-
impl Wrapped for StaticKernelObject<k_queue> {
92-
type T = Queue;
93-
94-
type I = ();
95-
96-
fn get_wrapped(&self, _arg: Self::I) -> Queue {
97-
let ptr = self.value.get();
78+
impl ObjectInit<k_queue> for ZephyrObject<k_queue> {
79+
fn init(item: *mut k_queue) {
80+
// SAFETY: ZephyrObject handles initialization and move prevention.
9881
unsafe {
99-
k_queue_init(ptr);
100-
}
101-
Queue {
102-
item: Fixed::Static(ptr),
82+
k_queue_init(item);
10383
}
10484
}
10585
}
10686

107-
/// A statically defined Zephyr `k_queue`.
108-
///
109-
/// This should be declared as follows:
110-
/// ```
111-
/// kobj_define! {
112-
/// static MY_QUEUE: StaticQueue;
113-
/// }
114-
///
115-
/// let my_queue = MY_QUEUE.init_once(());
116-
///
117-
/// my_queue.send(...);
118-
/// ```
119-
pub type StaticQueue = StaticKernelObject<k_queue>;
120-
12187
impl fmt::Debug for Queue {
12288
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
123-
write!(f, "sys::Queue {:?}", self.item.get())
89+
// SAFETY: Just getting the address to print.
90+
write!(f, "sys::Queue {:?}", unsafe { self.0.get() })
12491
}
12592
}

zephyr/src/work/futures.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ impl WakeInfo {
339339
ev.get(),
340340
ZR_POLL_TYPE_DATA_AVAILABLE,
341341
k_poll_modes_K_POLL_MODE_NOTIFY_ONLY as i32,
342-
queue.item.get() as *mut c_void,
342+
queue.0.get() as *mut c_void,
343343
);
344344
}
345345
}

0 commit comments

Comments
 (0)