embassy_sync/pubsub: fix PubSubBehavior visibility

https://github.com/embassy-rs/embassy/pull/2969 appears to have broken
direct `publish_immediate()` on `pubsub::Channel`, as it functionally
made `PubSubBehavior` private and didn't delegate this method to the new
(private) `SealedPubSubBehavior`.

This change moves `publish_immediate`, `capacity`, and `is_full` from
`SealedPubSubBehavior` to `PubSubBehavior` in order to restore them to
`pub` visibility.
This commit is contained in:
Nathan Perry 2024-09-19 08:17:33 -04:00
parent cdb44f1272
commit 893b8d79e8

View File

@ -194,6 +194,25 @@ impl<M: RawMutex, T: Clone, const CAP: usize, const SUBS: usize, const PUBS: usi
} }
} }
impl<M: RawMutex, T: Clone, const CAP: usize, const SUBS: usize, const PUBS: usize> crate::pubsub::PubSubBehavior<T>
for PubSubChannel<M, T, CAP, SUBS, PUBS>
{
fn publish_immediate(&self, message: T) {
self.inner.lock(|s| {
let mut s = s.borrow_mut();
s.publish_immediate(message)
})
}
fn capacity(&self) -> usize {
self.capacity()
}
fn is_full(&self) -> bool {
self.is_full()
}
}
impl<M: RawMutex, T: Clone, const CAP: usize, const SUBS: usize, const PUBS: usize> SealedPubSubBehavior<T> impl<M: RawMutex, T: Clone, const CAP: usize, const SUBS: usize, const PUBS: usize> SealedPubSubBehavior<T>
for PubSubChannel<M, T, CAP, SUBS, PUBS> for PubSubChannel<M, T, CAP, SUBS, PUBS>
{ {
@ -246,13 +265,6 @@ impl<M: RawMutex, T: Clone, const CAP: usize, const SUBS: usize, const PUBS: usi
}) })
} }
fn publish_immediate(&self, message: T) {
self.inner.lock(|s| {
let mut s = s.borrow_mut();
s.publish_immediate(message)
})
}
fn unregister_subscriber(&self, subscriber_next_message_id: u64) { fn unregister_subscriber(&self, subscriber_next_message_id: u64) {
self.inner.lock(|s| { self.inner.lock(|s| {
let mut s = s.borrow_mut(); let mut s = s.borrow_mut();
@ -267,10 +279,6 @@ impl<M: RawMutex, T: Clone, const CAP: usize, const SUBS: usize, const PUBS: usi
}) })
} }
fn capacity(&self) -> usize {
self.capacity()
}
fn free_capacity(&self) -> usize { fn free_capacity(&self) -> usize {
self.free_capacity() self.free_capacity()
} }
@ -286,10 +294,6 @@ impl<M: RawMutex, T: Clone, const CAP: usize, const SUBS: usize, const PUBS: usi
fn is_empty(&self) -> bool { fn is_empty(&self) -> bool {
self.is_empty() self.is_empty()
} }
fn is_full(&self) -> bool {
self.is_full()
}
} }
/// Internal state for the PubSub channel /// Internal state for the PubSub channel
@ -445,8 +449,6 @@ pub enum Error {
MaximumPublishersReached, MaximumPublishersReached,
} }
/// 'Middle level' behaviour of the pubsub channel.
/// This trait is used so that Sub and Pub can be generic over the channel.
trait SealedPubSubBehavior<T> { trait SealedPubSubBehavior<T> {
/// Try to get a message from the queue with the given message id. /// Try to get a message from the queue with the given message id.
/// ///
@ -462,12 +464,6 @@ trait SealedPubSubBehavior<T> {
/// If the queue is full and a context is given, then its waker is registered in the publisher wakers. /// If the queue is full and a context is given, then its waker is registered in the publisher wakers.
fn publish_with_context(&self, message: T, cx: Option<&mut Context<'_>>) -> Result<(), T>; fn publish_with_context(&self, message: T, cx: Option<&mut Context<'_>>) -> Result<(), T>;
/// Publish a message immediately
fn publish_immediate(&self, message: T);
/// Returns the maximum number of elements the channel can hold.
fn capacity(&self) -> usize;
/// Returns the free capacity of the channel. /// Returns the free capacity of the channel.
/// ///
/// This is equivalent to `capacity() - len()` /// This is equivalent to `capacity() - len()`
@ -482,9 +478,6 @@ trait SealedPubSubBehavior<T> {
/// Returns whether the channel is empty. /// Returns whether the channel is empty.
fn is_empty(&self) -> bool; fn is_empty(&self) -> bool;
/// Returns whether the channel is full.
fn is_full(&self) -> bool;
/// Let the channel know that a subscriber has dropped /// Let the channel know that a subscriber has dropped
fn unregister_subscriber(&self, subscriber_next_message_id: u64); fn unregister_subscriber(&self, subscriber_next_message_id: u64);
@ -495,9 +488,16 @@ trait SealedPubSubBehavior<T> {
/// 'Middle level' behaviour of the pubsub channel. /// 'Middle level' behaviour of the pubsub channel.
/// This trait is used so that Sub and Pub can be generic over the channel. /// This trait is used so that Sub and Pub can be generic over the channel.
#[allow(private_bounds)] #[allow(private_bounds)]
pub trait PubSubBehavior<T>: SealedPubSubBehavior<T> {} pub trait PubSubBehavior<T>: SealedPubSubBehavior<T> {
/// Publish a message immediately
fn publish_immediate(&self, message: T);
impl<T, C: SealedPubSubBehavior<T>> PubSubBehavior<T> for C {} /// Returns the maximum number of elements the channel can hold.
fn capacity(&self) -> usize;
/// Returns whether the channel is full.
fn is_full(&self) -> bool;
}
/// The result of the subscriber wait procedure /// The result of the subscriber wait procedure
#[derive(Debug, Clone, PartialEq, Eq)] #[derive(Debug, Clone, PartialEq, Eq)]