@@ -126,23 +126,20 @@ where
126
126
T : Clone + Send + Sync + ' static ,
127
127
{
128
128
fn is_started ( & mut self ) -> bool {
129
- let _started_alive = self . started_alive . clone ( ) ;
130
- let started_alive = _started_alive. lock ( ) . unwrap ( ) ;
129
+ let started_alive = self . started_alive . lock ( ) . unwrap ( ) ;
131
130
let & ( ref started, _) = & * started_alive;
132
131
started. load ( Ordering :: SeqCst )
133
132
}
134
133
135
134
fn is_alive ( & mut self ) -> bool {
136
- let _started_alive = self . started_alive . clone ( ) ;
137
- let started_alive = _started_alive. lock ( ) . unwrap ( ) ;
135
+ let started_alive = self . started_alive . lock ( ) . unwrap ( ) ;
138
136
let & ( _, ref alive) = & * started_alive;
139
137
alive. load ( Ordering :: SeqCst )
140
138
}
141
139
142
140
fn start ( & mut self ) {
143
141
{
144
- let _started_alive = self . started_alive . clone ( ) ;
145
- let started_alive = _started_alive. lock ( ) . unwrap ( ) ;
142
+ let started_alive = self . started_alive . lock ( ) . unwrap ( ) ;
146
143
let & ( ref started, ref alive) = & * started_alive;
147
144
148
145
if started. load ( Ordering :: SeqCst ) {
@@ -159,23 +156,23 @@ where
159
156
let _effect = self . effect . clone ( ) ;
160
157
let _publisher = self . publisher . clone ( ) ;
161
158
162
- let _started_alive = self . started_alive . clone ( ) ;
163
-
164
159
let mut handler = self . handler . lock ( ) . unwrap ( ) ;
165
160
handler. start ( ) ;
166
161
handler. post ( RawFunc :: new ( move || {
167
- let effect = & mut * _effect. lock ( ) . unwrap ( ) ;
168
- let result = ( effect) ( ) ;
169
- ( * this. result . lock ( ) . unwrap ( ) ) = Some ( result. clone ( ) ) ;
170
- _publisher. lock ( ) . unwrap ( ) . publish ( result) ;
162
+ let result = { ( _effect. lock ( ) . unwrap ( ) ) ( ) } ;
163
+ {
164
+ ( * this. result . lock ( ) . unwrap ( ) ) = Some ( result. clone ( ) ) ;
165
+ }
166
+ {
167
+ _publisher. lock ( ) . unwrap ( ) . publish ( result) ;
168
+ }
171
169
this. stop ( ) ;
172
170
} ) ) ;
173
171
}
174
172
175
173
fn stop ( & mut self ) {
176
174
{
177
- let _started_alive = self . started_alive . clone ( ) ;
178
- let started_alive = _started_alive. lock ( ) . unwrap ( ) ;
175
+ let started_alive = self . started_alive . lock ( ) . unwrap ( ) ;
179
176
let & ( ref started, ref alive) = & * started_alive;
180
177
181
178
if !started. load ( Ordering :: SeqCst ) {
@@ -219,11 +216,9 @@ where
219
216
if self . is_started ( ) && ( !self . is_alive ( ) ) {
220
217
Poll :: Ready ( self . result ( ) )
221
218
} else {
222
- if ! self . is_started ( ) {
223
- self . start ( ) ;
219
+ {
220
+ self . waker . lock ( ) . unwrap ( ) . replace ( cx . waker ( ) . clone ( ) ) ;
224
221
}
225
-
226
- self . waker . lock ( ) . unwrap ( ) . replace ( cx. waker ( ) . clone ( ) ) ;
227
222
Poll :: Pending
228
223
}
229
224
}
@@ -260,17 +255,19 @@ impl CountDownLatch {
260
255
}
261
256
262
257
pub fn countdown ( & self ) {
263
- let & ( ref lock, ref cvar) = & * self . pair . clone ( ) ;
264
- let mut started = lock. lock ( ) . unwrap ( ) ;
265
- if * started > 0 {
266
- * started -= 1 ;
267
- }
268
- cvar. notify_one ( ) ;
269
-
270
- #[ cfg( feature = "for_futures" ) ]
271
258
{
272
- if let Some ( waker) = self . waker . lock ( ) . unwrap ( ) . take ( ) {
273
- waker. wake ( )
259
+ let & ( ref lock, ref cvar) = & * self . pair . clone ( ) ;
260
+ let mut started = lock. lock ( ) . unwrap ( ) ;
261
+ if * started > 0 {
262
+ * started -= 1 ;
263
+ }
264
+ cvar. notify_one ( ) ;
265
+
266
+ #[ cfg( feature = "for_futures" ) ]
267
+ {
268
+ if let Some ( waker) = self . waker . lock ( ) . unwrap ( ) . take ( ) {
269
+ waker. wake ( )
270
+ }
274
271
}
275
272
}
276
273
}
@@ -306,9 +303,13 @@ impl Future for CountDownLatch {
306
303
type Output = ( ) ;
307
304
308
305
fn poll ( self : Pin < & mut Self > , cx : & mut Context < ' _ > ) -> Poll < Self :: Output > {
309
- let & ( ref remaining, _) = & * self . pair . clone ( ) ;
310
- if * remaining. lock ( ) . unwrap ( ) > 0 {
311
- self . waker . lock ( ) . unwrap ( ) . replace ( cx. waker ( ) . clone ( ) ) ;
306
+ let pair = self . pair . clone ( ) ;
307
+ let & ( ref remaining, _) = & * pair;
308
+ let count = remaining. lock ( ) . unwrap ( ) ;
309
+ if * count > 0 {
310
+ {
311
+ self . waker . lock ( ) . unwrap ( ) . replace ( cx. waker ( ) . clone ( ) ) ;
312
+ }
312
313
Poll :: Pending
313
314
} else {
314
315
Poll :: Ready ( ( ) )
@@ -466,7 +467,7 @@ where
466
467
}
467
468
468
469
{
469
- let result = self . blocking_recever . lock ( ) . unwrap ( ) . try_recv ( ) ;
470
+ let result = { self . blocking_recever . lock ( ) . unwrap ( ) . try_recv ( ) } ;
470
471
471
472
match result {
472
473
Ok ( v) => Ok ( v) ,
@@ -483,15 +484,15 @@ where
483
484
{
484
485
match self . timeout {
485
486
Some ( duration) => {
486
- let result = self . blocking_recever . lock ( ) . unwrap ( ) . recv_timeout ( duration) ;
487
+ let result = { self . blocking_recever . lock ( ) . unwrap ( ) . recv_timeout ( duration) } ;
487
488
488
489
match result {
489
490
Ok ( v) => Ok ( v) ,
490
491
Err ( e) => Err ( Box :: new ( e) ) ,
491
492
}
492
493
}
493
494
None => {
494
- let result = self . blocking_recever . lock ( ) . unwrap ( ) . recv ( ) ;
495
+ let result = { self . blocking_recever . lock ( ) . unwrap ( ) . recv ( ) } ;
495
496
496
497
match result {
497
498
Ok ( v) => Ok ( v) ,
@@ -542,7 +543,8 @@ where
542
543
#[ cfg( feature = "for_futures" ) ]
543
544
#[ futures_test:: test]
544
545
async fn test_sync_future ( ) {
545
- let wa = WillAsync :: new ( move || 1 ) ;
546
+ let mut wa = WillAsync :: new ( move || 1 ) ;
547
+ wa. start ( ) ;
546
548
547
549
assert_eq ! ( Some ( 1 ) , wa. await ) ;
548
550
@@ -552,25 +554,33 @@ async fn test_sync_future() {
552
554
let latch = CountDownLatch :: new ( 4 ) ;
553
555
let latch2 = latch. clone ( ) ;
554
556
555
- let _ = pub1. subscribe ( Arc :: new ( SubscriptionFunc :: new ( move |_ | {
556
- println ! ( "{:?}" , "test_sync_future" ) ;
557
+ let _ = pub1. subscribe ( Arc :: new ( SubscriptionFunc :: new ( move |y | {
558
+ println ! ( "test_sync_future {:?}" , y ) ;
557
559
latch2. countdown ( ) ;
558
560
} ) ) ) ;
559
561
562
+ println ! ( "test_sync_future before Publisher.start()" ) ;
563
+
560
564
{
561
565
let h = & mut _h. lock ( ) . unwrap ( ) ;
562
566
563
- println ! ( "hh2" ) ;
567
+ println ! ( "test_sync_future hh2" ) ;
564
568
h. start ( ) ;
565
- println ! ( "hh2 running" ) ;
569
+ println ! ( "test_sync_future hh2 running" ) ;
566
570
}
571
+ std:: thread:: sleep ( Duration :: from_millis ( 10 ) ) ;
567
572
568
573
pub1. publish ( 1 ) ;
574
+ println ! ( "test_sync_future pub1.publish" ) ;
569
575
pub1. publish ( 2 ) ;
576
+ println ! ( "test_sync_future pub1.publish" ) ;
570
577
pub1. publish ( 3 ) ;
578
+ println ! ( "test_sync_future pub1.publish" ) ;
571
579
pub1. publish ( 4 ) ;
580
+ println ! ( "test_sync_future pub1.publish" ) ;
572
581
573
582
let _ = latch. await ;
583
+ println ! ( "test_sync_future done" ) ;
574
584
}
575
585
576
586
#[ test]
0 commit comments