@@ -69,6 +69,7 @@ impl Notifier {
69
69
} else {
70
70
let state = Arc :: new ( Mutex :: new ( FutureState {
71
71
callbacks : Vec :: new ( ) ,
72
+ std_future_callbacks : Vec :: new ( ) ,
72
73
callbacks_with_state : Vec :: new ( ) ,
73
74
complete : lock. 0 ,
74
75
callbacks_made : false ,
@@ -112,7 +113,8 @@ pub(crate) struct FutureState {
112
113
// When we're tracking whether a callback counts as having woken the user's code, we check the
113
114
// first bool - set to false if we're just calling a Waker, and true if we're calling an actual
114
115
// user-provided function.
115
- callbacks : Vec < ( bool , Box < dyn FutureCallback > ) > ,
116
+ callbacks : Vec < Box < dyn FutureCallback > > ,
117
+ std_future_callbacks : Vec < StdWaker > ,
116
118
callbacks_with_state : Vec < ( bool , Box < dyn Fn ( & Arc < Mutex < FutureState > > ) -> ( ) + Send > ) > ,
117
119
complete : bool ,
118
120
callbacks_made : bool ,
@@ -121,9 +123,12 @@ pub(crate) struct FutureState {
121
123
fn complete_future ( this : & Arc < Mutex < FutureState > > ) -> bool {
122
124
let mut state_lock = this. lock ( ) . unwrap ( ) ;
123
125
let state = & mut * state_lock;
124
- for ( counts_as_call , callback) in state. callbacks . drain ( ..) {
126
+ for callback in state. callbacks . drain ( ..) {
125
127
callback. call ( ) ;
126
- state. callbacks_made |= counts_as_call;
128
+ state. callbacks_made = true ;
129
+ }
130
+ for waker in state. std_future_callbacks . drain ( ..) {
131
+ waker. 0 . wake_by_ref ( ) ;
127
132
}
128
133
for ( counts_as_call, callback) in state. callbacks_with_state . drain ( ..) {
129
134
( callback) ( this) ;
@@ -153,7 +158,7 @@ impl Future {
153
158
mem:: drop ( state) ;
154
159
callback. call ( ) ;
155
160
} else {
156
- state. callbacks . push ( ( true , callback) ) ;
161
+ state. callbacks . push ( callback) ;
157
162
}
158
163
}
159
164
@@ -193,9 +198,6 @@ impl Future {
193
198
194
199
use core:: task:: Waker ;
195
200
struct StdWaker ( pub Waker ) ;
196
- impl FutureCallback for StdWaker {
197
- fn call ( & self ) { self . 0 . wake_by_ref ( ) }
198
- }
199
201
200
202
/// This is not exported to bindings users as Rust Futures aren't usable in language bindings.
201
203
impl < ' a > StdFuture for Future {
@@ -208,7 +210,7 @@ impl<'a> StdFuture for Future {
208
210
Poll :: Ready ( ( ) )
209
211
} else {
210
212
let waker = cx. waker ( ) . clone ( ) ;
211
- state. callbacks . push ( ( false , Box :: new ( StdWaker ( waker) ) ) ) ;
213
+ state. std_future_callbacks . push ( StdWaker ( waker) ) ;
212
214
Poll :: Pending
213
215
}
214
216
}
@@ -455,6 +457,7 @@ mod tests {
455
457
let future = Future {
456
458
state : Arc :: new ( Mutex :: new ( FutureState {
457
459
callbacks : Vec :: new ( ) ,
460
+ std_future_callbacks : Vec :: new ( ) ,
458
461
callbacks_with_state : Vec :: new ( ) ,
459
462
complete : false ,
460
463
callbacks_made : false ,
@@ -514,6 +517,7 @@ mod tests {
514
517
let mut future = Future {
515
518
state : Arc :: new ( Mutex :: new ( FutureState {
516
519
callbacks : Vec :: new ( ) ,
520
+ std_future_callbacks : Vec :: new ( ) ,
517
521
callbacks_with_state : Vec :: new ( ) ,
518
522
complete : false ,
519
523
callbacks_made : false ,
0 commit comments