3
3
use std:: cell:: UnsafeCell ;
4
4
use std:: fmt;
5
5
use std:: sync:: atomic:: AtomicUsize ;
6
- use std:: sync:: atomic:: Ordering :: { Acquire , Release , AcqRel } ;
6
+ use std:: sync:: atomic:: Ordering :: { AcqRel , Acquire , Release } ;
7
7
use std:: task:: Waker ;
8
8
9
9
/// A synchronization primitive for task wakeup.
@@ -261,7 +261,11 @@ impl AtomicWaker {
261
261
/// }
262
262
/// ```
263
263
pub fn register ( & self , waker : & Waker ) {
264
- match self . state . compare_and_swap ( WAITING , REGISTERING , Acquire ) {
264
+ match self
265
+ . state
266
+ . compare_exchange ( WAITING , REGISTERING , Acquire , Acquire )
267
+ . unwrap_or_else ( |x| x)
268
+ {
265
269
WAITING => {
266
270
unsafe {
267
271
// Locked acquired, update the waker cell
@@ -277,8 +281,9 @@ impl AtomicWaker {
277
281
// nothing to acquire, only release. In case of concurrent
278
282
// wakers, we need to acquire their releases, so success needs
279
283
// to do both.
280
- let res = self . state . compare_exchange (
281
- REGISTERING , WAITING , AcqRel , Acquire ) ;
284
+ let res = self
285
+ . state
286
+ . compare_exchange ( REGISTERING , WAITING , AcqRel , Acquire ) ;
282
287
283
288
match res {
284
289
Ok ( _) => {
@@ -342,9 +347,7 @@ impl AtomicWaker {
342
347
//
343
348
// We just want to maintain memory safety. It is ok to drop the
344
349
// call to `register`.
345
- debug_assert ! (
346
- state == REGISTERING ||
347
- state == REGISTERING | WAKING ) ;
350
+ debug_assert ! ( state == REGISTERING || state == REGISTERING | WAKING ) ;
348
351
}
349
352
}
350
353
}
@@ -389,9 +392,8 @@ impl AtomicWaker {
389
392
// not.
390
393
//
391
394
debug_assert ! (
392
- state == REGISTERING ||
393
- state == REGISTERING | WAKING ||
394
- state == WAKING ) ;
395
+ state == REGISTERING || state == REGISTERING | WAKING || state == WAKING
396
+ ) ;
395
397
None
396
398
}
397
399
}
0 commit comments