Skip to content

Commit 5da03ef

Browse files
author
Mikhail Vasilyev
committed
channel: add is_closed() for Sender and Receiver
1 parent 38e5dff commit 5da03ef

1 file changed

Lines changed: 32 additions & 4 deletions

File tree

src/local_sync/channel.rs

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ use std::task::{Context, Poll};
88
struct Data<T> {
99
queue: sealed::Queue<T>,
1010
sender_count: Cell<usize>,
11-
#[cfg(debug_assertions)]
1211
has_receiver: Cell<bool>,
1312
}
1413

@@ -34,15 +33,17 @@ pub fn channel<T>() -> (Sender<T>, Receiver<T>) {
3433
let state = SharedState::new(Data {
3534
queue: Default::default(),
3635
sender_count: Cell::new(1),
37-
#[cfg(debug_assertions)]
3836
has_receiver: Cell::new(true),
3937
});
4038
(Sender(state.clone()), Receiver(state))
4139
}
4240

4341
impl<T> Sender<T> {
42+
pub fn is_closed(&self) -> bool {
43+
!self.0.has_receiver.get()
44+
}
45+
4446
pub fn send(&self, item: T) {
45-
#[cfg(debug_assertions)]
4647
debug_assert!(self.0.has_receiver.get());
4748
self.0.queue.push(item);
4849
self.0.notify();
@@ -86,6 +87,10 @@ impl<T> Receiver<T> {
8687
pub fn has_pending_data(&self) -> bool {
8788
!self.0.queue.is_empty()
8889
}
90+
91+
pub fn is_closed(&self) -> bool {
92+
self.0.sender_count.get() == 0
93+
}
8994
}
9095

9196
impl<T> futures::Stream for Receiver<T> {
@@ -99,7 +104,6 @@ impl<T> futures::Stream for Receiver<T> {
99104
impl<T> Drop for Receiver<T> {
100105
fn drop(&mut self) {
101106
self.0.receiver_dropped();
102-
#[cfg(debug_assertions)]
103107
self.0.has_receiver.set(false);
104108
}
105109
}
@@ -153,4 +157,28 @@ mod tests {
153157
}
154158
assert_eq!(None, assert_ready!(receiver.poll_next()));
155159
}
160+
161+
#[test]
162+
fn test_sender_is_closed() {
163+
let (sender, receiver) = channel::<i32>();
164+
assert!(!sender.is_closed());
165+
166+
drop(receiver);
167+
assert!(sender.is_closed());
168+
}
169+
170+
#[test]
171+
fn test_receiver_is_closed() {
172+
let (sender, receiver) = channel::<i32>();
173+
assert!(!receiver.is_closed());
174+
175+
let sender2 = sender.clone();
176+
assert!(!receiver.is_closed());
177+
178+
drop(sender);
179+
assert!(!receiver.is_closed());
180+
181+
drop(sender2);
182+
assert!(receiver.is_closed());
183+
}
156184
}

0 commit comments

Comments
 (0)