File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 11use super :: shared_state:: { SharedState , Source } ;
22use crate :: sealed;
33use std:: cell:: Cell ;
4+ use std:: ops:: ControlFlow ;
45use std:: pin:: Pin ;
56use std:: rc:: Rc ;
67use std:: task:: { Context , Poll } ;
@@ -14,12 +15,14 @@ struct Data<T> {
1415impl < T > Source for Data < T > {
1516 type Item = T ;
1617
17- fn closed ( & self ) -> bool {
18- self . sender_count . get ( ) == 0
19- }
20-
21- fn extract_item ( & self ) -> Option < Self :: Item > {
22- self . queue . pop ( )
18+ fn try_yield_one ( & self ) -> ControlFlow < Option < Self :: Item > > {
19+ if let Some ( item) = self . queue . pop ( ) {
20+ ControlFlow :: Break ( Some ( item) )
21+ } else if self . sender_count . get ( ) == 0 {
22+ ControlFlow :: Break ( None )
23+ } else {
24+ ControlFlow :: Continue ( ( ) )
25+ }
2326 }
2427}
2528
Original file line number Diff line number Diff line change @@ -2,6 +2,7 @@ use super::shared_state::{SharedState, Source};
22use futures:: FutureExt ;
33use std:: cell:: Cell ;
44use std:: future:: { poll_fn, Future } ;
5+ use std:: ops:: ControlFlow ;
56use std:: rc:: Rc ;
67
78struct Data {
@@ -14,16 +15,13 @@ struct Data {
1415impl Source for Data {
1516 type Item = ( ) ;
1617
17- fn closed ( & self ) -> bool {
18- !self . has_sender . get ( )
19- }
20-
21- fn extract_item ( & self ) -> Option < Self :: Item > {
22- if !self . closed ( ) && self . notified . get ( ) {
23- self . notified . set ( false ) ;
24- Some ( ( ) )
18+ fn try_yield_one ( & self ) -> ControlFlow < Option < Self :: Item > > {
19+ if !self . has_sender . get ( ) {
20+ ControlFlow :: Break ( None )
21+ } else if self . notified . replace ( false ) {
22+ ControlFlow :: Break ( Some ( ( ) ) )
2523 } else {
26- None
24+ ControlFlow :: Continue ( ( ) )
2725 }
2826 }
2927}
Original file line number Diff line number Diff line change 11use super :: shared_state:: { SharedState , Source } ;
22use std:: cell:: Cell ;
33use std:: future:: Future ;
4+ use std:: ops:: ControlFlow ;
45use std:: pin:: Pin ;
56use std:: rc:: Rc ;
67use std:: task:: { Context , Poll } ;
@@ -14,12 +15,12 @@ struct Data<T> {
1415impl < T > Source for Data < T > {
1516 type Item = T ;
1617
17- fn closed ( & self ) -> bool {
18- ! self . has_sender . get ( )
19- }
20-
21- fn extract_item ( & self ) -> Option < Self :: Item > {
22- self . value . replace ( None )
18+ fn try_yield_one ( & self ) -> ControlFlow < Option < Self :: Item > > {
19+ match self . value . take ( ) {
20+ Some ( value ) => ControlFlow :: Break ( Some ( value ) ) ,
21+ None if ! self . has_sender . get ( ) => ControlFlow :: Break ( None ) ,
22+ None => ControlFlow :: Continue ( ( ) ) ,
23+ }
2324 }
2425}
2526
Original file line number Diff line number Diff line change @@ -2,6 +2,7 @@ use super::shared_state::{SharedState, Source};
22use futures:: FutureExt ;
33use std:: cell:: Cell ;
44use std:: future:: { poll_fn, Future } ;
5+ use std:: ops:: ControlFlow ;
56use std:: rc:: Rc ;
67
78struct Data {
@@ -14,17 +15,14 @@ struct Data {
1415impl Source for Data {
1516 type Item = ( ) ;
1617
17- fn closed ( & self ) -> bool {
18- !self . has_sender . get ( )
19- }
20-
21- fn extract_item ( & self ) -> Option < Self :: Item > {
22- let current_capacity = self . capacity . get ( ) ;
23- if !self . closed ( ) && current_capacity > 0 {
24- self . capacity . set ( current_capacity - 1 ) ;
25- Some ( ( ) )
18+ fn try_yield_one ( & self ) -> ControlFlow < Option < Self :: Item > > {
19+ if !self . has_sender . get ( ) {
20+ ControlFlow :: Break ( None )
21+ } else if self . capacity . get ( ) > 0 {
22+ self . capacity . update ( |cap| cap - 1 ) ;
23+ ControlFlow :: Break ( Some ( ( ) ) )
2624 } else {
27- None
25+ ControlFlow :: Continue ( ( ) )
2826 }
2927 }
3028}
Original file line number Diff line number Diff line change 11use std:: cell:: Cell ;
2- use std:: ops:: Deref ;
2+ use std:: ops:: { ControlFlow , Deref } ;
33use std:: rc:: Rc ;
44use std:: task:: { Context , Poll , Waker } ;
55
66pub ( super ) trait Source {
77 type Item ;
8- fn closed ( & self ) -> bool ;
9- fn extract_item ( & self ) -> Option < Self :: Item > ;
8+ fn try_yield_one ( & self ) -> ControlFlow < Option < Self :: Item > > ;
109}
1110
1211pub ( super ) struct SharedState < T > {
@@ -36,10 +35,8 @@ impl<T: Source> SharedState<T> {
3635 // This should NEVER be called concurrently from different futures/tasks,
3736 // because we store only 1 waker
3837 pub ( super ) fn poll_wait ( self : & mut Rc < Self > , cx : & mut Context < ' _ > ) -> Poll < Option < T :: Item > > {
39- if let Some ( item) = self . inner . extract_item ( ) {
40- Poll :: Ready ( Some ( item) )
41- } else if self . inner . closed ( ) {
42- Poll :: Ready ( None )
38+ if let ControlFlow :: Break ( output) = self . inner . try_yield_one ( ) {
39+ Poll :: Ready ( output)
4340 } else {
4441 let new_waker = match self . waker . replace ( None ) {
4542 Some ( waker) if waker. will_wake ( cx. waker ( ) ) => waker,
You can’t perform that action at this time.
0 commit comments