1
- use crate :: cell:: UnsafeCell ;
2
1
use crate :: mem;
3
2
use crate :: sync:: atomic:: { AtomicU32 , Ordering } ;
4
3
use crate :: sys:: cloudabi:: abi;
@@ -12,37 +11,36 @@ extern "C" {
12
11
}
13
12
14
13
pub struct Condvar {
15
- condvar : UnsafeCell < AtomicU32 > ,
14
+ condvar : AtomicU32 ,
16
15
}
17
16
18
17
pub type MovableCondvar = Condvar ;
19
18
20
19
unsafe impl Send for Condvar { }
21
20
unsafe impl Sync for Condvar { }
22
21
23
- const NEW : Condvar =
24
- Condvar { condvar : UnsafeCell :: new ( AtomicU32 :: new ( abi:: CONDVAR_HAS_NO_WAITERS . 0 ) ) } ;
25
-
26
22
impl Condvar {
27
23
pub const fn new ( ) -> Condvar {
28
- NEW
24
+ Condvar { condvar : AtomicU32 :: new ( abi :: CONDVAR_HAS_NO_WAITERS . 0 ) }
29
25
}
30
26
31
27
pub unsafe fn init ( & mut self ) { }
32
28
33
29
pub unsafe fn notify_one ( & self ) {
34
- let condvar = self . condvar . get ( ) ;
35
- if ( * condvar) . load ( Ordering :: Relaxed ) != abi:: CONDVAR_HAS_NO_WAITERS . 0 {
36
- let ret = abi:: condvar_signal ( condvar as * mut abi:: condvar , abi:: scope:: PRIVATE , 1 ) ;
30
+ if self . condvar . load ( Ordering :: Relaxed ) != abi:: CONDVAR_HAS_NO_WAITERS . 0 {
31
+ let ret = abi:: condvar_signal (
32
+ & self . condvar as * const AtomicU32 as * mut abi:: condvar ,
33
+ abi:: scope:: PRIVATE ,
34
+ 1 ,
35
+ ) ;
37
36
assert_eq ! ( ret, abi:: errno:: SUCCESS , "Failed to signal on condition variable" ) ;
38
37
}
39
38
}
40
39
41
40
pub unsafe fn notify_all ( & self ) {
42
- let condvar = self . condvar . get ( ) ;
43
- if ( * condvar) . load ( Ordering :: Relaxed ) != abi:: CONDVAR_HAS_NO_WAITERS . 0 {
41
+ if self . condvar . load ( Ordering :: Relaxed ) != abi:: CONDVAR_HAS_NO_WAITERS . 0 {
44
42
let ret = abi:: condvar_signal (
45
- condvar as * mut abi:: condvar ,
43
+ & self . condvar as * const AtomicU32 as * mut abi:: condvar ,
46
44
abi:: scope:: PRIVATE ,
47
45
abi:: nthreads:: MAX ,
48
46
) ;
@@ -53,20 +51,19 @@ impl Condvar {
53
51
pub unsafe fn wait ( & self , mutex : & Mutex ) {
54
52
let mutex = mutex:: raw ( mutex) ;
55
53
assert_eq ! (
56
- ( * mutex) . load( Ordering :: Relaxed ) & !abi:: LOCK_KERNEL_MANAGED . 0 ,
54
+ mutex. load( Ordering :: Relaxed ) & !abi:: LOCK_KERNEL_MANAGED . 0 ,
57
55
__pthread_thread_id. 0 | abi:: LOCK_WRLOCKED . 0 ,
58
56
"This lock is not write-locked by this thread"
59
57
) ;
60
58
61
59
// Call into the kernel to wait on the condition variable.
62
- let condvar = self . condvar . get ( ) ;
63
60
let subscription = abi:: subscription {
64
61
type_ : abi:: eventtype:: CONDVAR ,
65
62
union : abi:: subscription_union {
66
63
condvar : abi:: subscription_condvar {
67
- condvar : condvar as * mut abi:: condvar ,
64
+ condvar : & self . condvar as * const AtomicU32 as * mut abi:: condvar ,
68
65
condvar_scope : abi:: scope:: PRIVATE ,
69
- lock : mutex as * mut abi:: lock ,
66
+ lock : mutex as * const AtomicU32 as * mut abi:: lock ,
70
67
lock_scope : abi:: scope:: PRIVATE ,
71
68
} ,
72
69
} ,
@@ -86,23 +83,22 @@ impl Condvar {
86
83
pub unsafe fn wait_timeout ( & self , mutex : & Mutex , dur : Duration ) -> bool {
87
84
let mutex = mutex:: raw ( mutex) ;
88
85
assert_eq ! (
89
- ( * mutex) . load( Ordering :: Relaxed ) & !abi:: LOCK_KERNEL_MANAGED . 0 ,
86
+ mutex. load( Ordering :: Relaxed ) & !abi:: LOCK_KERNEL_MANAGED . 0 ,
90
87
__pthread_thread_id. 0 | abi:: LOCK_WRLOCKED . 0 ,
91
88
"This lock is not write-locked by this thread"
92
89
) ;
93
90
94
91
// Call into the kernel to wait on the condition variable.
95
- let condvar = self . condvar . get ( ) ;
96
92
let timeout =
97
93
checked_dur2intervals ( & dur) . expect ( "overflow converting duration to nanoseconds" ) ;
98
94
let subscriptions = [
99
95
abi:: subscription {
100
96
type_ : abi:: eventtype:: CONDVAR ,
101
97
union : abi:: subscription_union {
102
98
condvar : abi:: subscription_condvar {
103
- condvar : condvar as * mut abi:: condvar ,
99
+ condvar : & self . condvar as * const AtomicU32 as * mut abi:: condvar ,
104
100
condvar_scope : abi:: scope:: PRIVATE ,
105
- lock : mutex as * mut abi:: lock ,
101
+ lock : mutex as * const AtomicU32 as * mut abi:: lock ,
106
102
lock_scope : abi:: scope:: PRIVATE ,
107
103
} ,
108
104
} ,
@@ -124,7 +120,7 @@ impl Condvar {
124
120
let mut nevents: mem:: MaybeUninit < usize > = mem:: MaybeUninit :: uninit ( ) ;
125
121
let ret = abi:: poll (
126
122
subscriptions. as_ptr ( ) ,
127
- mem:: MaybeUninit :: first_ptr_mut ( & mut events) ,
123
+ mem:: MaybeUninit :: slice_as_mut_ptr ( & mut events) ,
128
124
2 ,
129
125
nevents. as_mut_ptr ( ) ,
130
126
) ;
@@ -144,9 +140,8 @@ impl Condvar {
144
140
}
145
141
146
142
pub unsafe fn destroy ( & self ) {
147
- let condvar = self . condvar . get ( ) ;
148
143
assert_eq ! (
149
- ( * condvar) . load( Ordering :: Relaxed ) ,
144
+ self . condvar. load( Ordering :: Relaxed ) ,
150
145
abi:: CONDVAR_HAS_NO_WAITERS . 0 ,
151
146
"Attempted to destroy a condition variable with blocked threads"
152
147
) ;
0 commit comments