@@ -8,7 +8,6 @@ use std::task::{Context, Poll};
88struct 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
4341impl < 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
9196impl < T > futures:: Stream for Receiver < T > {
@@ -99,7 +104,6 @@ impl<T> futures::Stream for Receiver<T> {
99104impl < 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