embassy-sync: add clear, len, is_empty and is_full functions to zerocopy_channel

This commit is contained in:
Oliver Rockstedt 2024-10-05 13:39:27 +02:00
parent 6e0b08291b
commit 383ad72b63
2 changed files with 77 additions and 0 deletions

View File

@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## Unreleased
- Add LazyLock sync primitive.
- Add `clear`, `len`, `is_empty` and `is_full` functions to `zerocopy_channel`.
## 0.6.0 - 2024-05-29

View File

@ -70,6 +70,28 @@ impl<'a, M: RawMutex, T> Channel<'a, M, T> {
pub fn split(&mut self) -> (Sender<'_, M, T>, Receiver<'_, M, T>) {
(Sender { channel: self }, Receiver { channel: self })
}
/// Clears all elements in the channel.
pub fn clear(&mut self) {
self.state.lock(|s| {
s.borrow_mut().clear();
});
}
/// Returns the number of elements currently in the channel.
pub fn len(&self) -> usize {
self.state.lock(|s| s.borrow().len())
}
/// Returns whether the channel is empty.
pub fn is_empty(&self) -> bool {
self.state.lock(|s| s.borrow().is_empty())
}
/// Returns whether the channel is full.
pub fn is_full(&self) -> bool {
self.state.lock(|s| s.borrow().is_full())
}
}
/// Send-only access to a [`Channel`].
@ -130,6 +152,28 @@ impl<'a, M: RawMutex, T> Sender<'a, M, T> {
pub fn send_done(&mut self) {
self.channel.state.lock(|s| s.borrow_mut().push_done())
}
/// Clears all elements in the channel.
pub fn clear(&mut self) {
self.channel.state.lock(|s| {
s.borrow_mut().clear();
});
}
/// Returns the number of elements currently in the channel.
pub fn len(&self) -> usize {
self.channel.state.lock(|s| s.borrow().len())
}
/// Returns whether the channel is empty.
pub fn is_empty(&self) -> bool {
self.channel.state.lock(|s| s.borrow().is_empty())
}
/// Returns whether the channel is full.
pub fn is_full(&self) -> bool {
self.channel.state.lock(|s| s.borrow().is_full())
}
}
/// Receive-only access to a [`Channel`].
@ -190,6 +234,28 @@ impl<'a, M: RawMutex, T> Receiver<'a, M, T> {
pub fn receive_done(&mut self) {
self.channel.state.lock(|s| s.borrow_mut().pop_done())
}
/// Clears all elements in the channel.
pub fn clear(&mut self) {
self.channel.state.lock(|s| {
s.borrow_mut().clear();
});
}
/// Returns the number of elements currently in the channel.
pub fn len(&self) -> usize {
self.channel.state.lock(|s| s.borrow().len())
}
/// Returns whether the channel is empty.
pub fn is_empty(&self) -> bool {
self.channel.state.lock(|s| s.borrow().is_empty())
}
/// Returns whether the channel is full.
pub fn is_full(&self) -> bool {
self.channel.state.lock(|s| s.borrow().is_full())
}
}
struct State {
@ -217,6 +283,16 @@ impl State {
}
}
fn clear(&mut self) {
self.front = 0;
self.back = 0;
self.full = false;
}
fn len(&self) -> usize {
self.len
}
fn is_full(&self) -> bool {
self.full
}