1
1
use std:: pin:: Pin ;
2
- use std:: sync:: atomic:: { AtomicBool , AtomicUsize , Ordering } ;
2
+ use std:: sync:: atomic:: { AtomicUsize , Ordering } ;
3
3
use std:: sync:: Arc ;
4
4
use std:: time:: Duration ;
5
5
@@ -61,7 +61,6 @@ impl WaitTimeoutResult {
61
61
/// ```
62
62
#[ derive( Debug ) ]
63
63
pub struct Condvar {
64
- has_blocked : AtomicBool ,
65
64
blocked : std:: sync:: Mutex < Slab < WaitEntry > > ,
66
65
}
67
66
@@ -89,7 +88,6 @@ impl Condvar {
89
88
/// ```
90
89
pub fn new ( ) -> Self {
91
90
Condvar {
92
- has_blocked : AtomicBool :: new ( false ) ,
93
91
blocked : std:: sync:: Mutex :: new ( Slab :: new ( ) ) ,
94
92
}
95
93
}
@@ -275,10 +273,8 @@ impl Condvar {
275
273
/// # }) }
276
274
/// ```
277
275
pub fn notify_one ( & self ) {
278
- if self . has_blocked . load ( Ordering :: Acquire ) {
279
- let blocked = self . blocked . lock ( ) . unwrap ( ) ;
280
- notify ( blocked, false ) ;
281
- }
276
+ let blocked = self . blocked . lock ( ) . unwrap ( ) ;
277
+ notify ( blocked, false ) ;
282
278
}
283
279
284
280
/// Wakes up all blocked tasks on this condvar.
@@ -314,10 +310,8 @@ impl Condvar {
314
310
/// # }) }
315
311
/// ```
316
312
pub fn notify_all ( & self ) {
317
- if self . has_blocked . load ( Ordering :: Acquire ) {
318
- let blocked = self . blocked . lock ( ) . unwrap ( ) ;
319
- notify ( blocked, true ) ;
320
- }
313
+ let blocked = self . blocked . lock ( ) . unwrap ( ) ;
314
+ notify ( blocked, true ) ;
321
315
}
322
316
}
323
317
@@ -355,9 +349,6 @@ impl<'a, 'b, T> Future for AwaitNotify<'a, 'b, T> {
355
349
waker : Some ( w) ,
356
350
} ) ) ;
357
351
358
- if blocked. len ( ) == 1 {
359
- self . cond . has_blocked . store ( true , Ordering :: Relaxed ) ;
360
- }
361
352
// the guard is dropped when we return, which frees the lock
362
353
Poll :: Pending
363
354
}
@@ -378,9 +369,7 @@ impl<'a, 'b, T> Drop for AwaitNotify<'a, 'b, T> {
378
369
let mut blocked = self . cond . blocked . lock ( ) . unwrap ( ) ;
379
370
blocked. remove ( key) ;
380
371
381
- if blocked. is_empty ( ) {
382
- self . cond . has_blocked . store ( false , Ordering :: Relaxed ) ;
383
- } else if self . state . load ( Ordering :: Acquire ) == NOTIFIED_ONCE {
372
+ if !blocked. is_empty ( ) && self . state . load ( Ordering :: Acquire ) == NOTIFIED_ONCE {
384
373
// we got a notification form notify_once but didn't handle it,
385
374
// so send it to a different task
386
375
notify ( blocked, false ) ;
0 commit comments