Skip to content

Commit 24d2122

Browse files
authored
Remove ConcurrentQueue & other minor tweaks (#4058)
* Remove ConcurrentQueue * Unrequire preempt driver for 802.15.4
1 parent 105c163 commit 24d2122

File tree

13 files changed

+150
-248
lines changed

13 files changed

+150
-248
lines changed

esp-preempt/src/queue.rs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,31 @@ impl QueueInner {
6868
true
6969
}
7070

71+
unsafe fn remove(&mut self, item: *const u8) {
72+
// do what the ESP-IDF implementations does...
73+
// just remove all elements and add them back except the one we need to remove -
74+
// good enough for now
75+
let count = self.len();
76+
77+
if count == 0 {
78+
return;
79+
}
80+
81+
let mut tmp_item = vec![0; self.item_size];
82+
83+
let item_slice = unsafe { core::slice::from_raw_parts(item, self.item_size) };
84+
for _ in 0..count {
85+
if !unsafe { self.try_dequeue(tmp_item.as_mut_ptr().cast()) } {
86+
break;
87+
}
88+
if &tmp_item[..] != item_slice {
89+
_ = unsafe { self.try_enqueue(tmp_item.as_mut_ptr().cast()) };
90+
}
91+
// Note that even if we find our item, we'll need to keep cycling through everything to
92+
// keep insertion order.
93+
}
94+
}
95+
7196
fn len(&self) -> usize {
7297
if self.current_write >= self.current_read {
7398
self.current_write - self.current_read
@@ -132,6 +157,10 @@ impl Queue {
132157
self.inner.with(|queue| unsafe { queue.try_dequeue(item) })
133158
}
134159

160+
unsafe fn remove(&self, item: *const u8) {
161+
self.inner.with(|queue| unsafe { queue.remove(item) })
162+
}
163+
135164
fn messages_waiting(&self) -> usize {
136165
self.inner.with(|queue| queue.len())
137166
}
@@ -176,6 +205,12 @@ impl QueueImplementation for Queue {
176205
unsafe { queue.try_receive(item) }
177206
}
178207

208+
unsafe fn remove(queue: QueuePtr, item: *const u8) {
209+
let queue = unsafe { Queue::from_ptr(queue) };
210+
211+
unsafe { queue.remove(item) }
212+
}
213+
179214
fn messages_waiting(queue: QueuePtr) -> usize {
180215
let queue = unsafe { Queue::from_ptr(queue) };
181216

esp-radio-preempt-driver/src/queue.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ unsafe extern "Rust" {
2222
fn esp_preempt_queue_try_send_to_back(queue: QueuePtr, item: *const u8) -> bool;
2323
fn esp_preempt_queue_receive(queue: QueuePtr, item: *mut u8, timeout_us: Option<u32>) -> bool;
2424
fn esp_preempt_queue_try_receive(queue: QueuePtr, item: *mut u8) -> bool;
25+
fn esp_preempt_queue_remove(queue: QueuePtr, item: *const u8);
2526
fn esp_preempt_queue_messages_waiting(queue: QueuePtr) -> usize;
2627
}
2728

@@ -97,6 +98,14 @@ pub trait QueueImplementation {
9798
/// a size equal to the queue's item size.
9899
unsafe fn try_receive(queue: QueuePtr, item: *mut u8) -> bool;
99100

101+
/// Removes an item from the queue.
102+
///
103+
/// # Safety
104+
///
105+
/// The caller must ensure that `item` can be dereferenced and points to an allocation of
106+
/// a size equal to the queue's item size.
107+
unsafe fn remove(queue: QueuePtr, item: *const u8);
108+
100109
/// Returns the number of messages in the queue.
101110
fn messages_waiting(queue: QueuePtr) -> usize;
102111
}
@@ -162,6 +171,12 @@ macro_rules! register_queue_implementation {
162171
unsafe { <$t as $crate::queue::QueueImplementation>::try_receive(queue, item) }
163172
}
164173

174+
#[unsafe(no_mangle)]
175+
#[inline]
176+
fn esp_preempt_queue_remove(queue: QueuePtr, item: *mut u8) {
177+
unsafe { <$t as $crate::queue::QueueImplementation>::remove(queue, item) }
178+
}
179+
165180
#[unsafe(no_mangle)]
166181
#[inline]
167182
fn esp_preempt_queue_messages_waiting(queue: QueuePtr) -> usize {
@@ -278,6 +293,16 @@ impl QueueHandle {
278293
unsafe { esp_preempt_queue_try_receive(self.0, item) }
279294
}
280295

296+
/// Removes an item from the queue.
297+
///
298+
/// # Safety
299+
///
300+
/// The caller must ensure that `item` can be dereferenced and points to an allocation of
301+
/// a size equal to the queue's item size.
302+
pub unsafe fn remove(&self, item: *const u8) {
303+
unsafe { esp_preempt_queue_remove(self.0, item) }
304+
}
305+
281306
/// Returns the number of messages in the queue.
282307
pub fn messages_waiting(&self) -> usize {
283308
unsafe { esp_preempt_queue_messages_waiting(self.0) }

0 commit comments

Comments
 (0)