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,32 @@ 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 ( & self . condvar as * const AtomicU32 as * mut abi:: condvar , abi:: scope:: PRIVATE , 1 ) ;
37
32
assert_eq ! ( ret, abi:: errno:: SUCCESS , "Failed to signal on condition variable" ) ;
38
33
}
39
34
}
40
35
41
36
pub unsafe fn notify_all ( & self ) {
42
- let condvar = self . condvar . get ( ) ;
43
- if ( * condvar) . load ( Ordering :: Relaxed ) != abi:: CONDVAR_HAS_NO_WAITERS . 0 {
37
+ if self . condvar . load ( Ordering :: Relaxed ) != abi:: CONDVAR_HAS_NO_WAITERS . 0 {
44
38
let ret = abi:: condvar_signal (
45
- condvar as * mut abi:: condvar ,
39
+ & self . condvar as * const AtomicU32 as * mut abi:: condvar ,
46
40
abi:: scope:: PRIVATE ,
47
41
abi:: nthreads:: MAX ,
48
42
) ;
@@ -53,20 +47,19 @@ impl Condvar {
53
47
pub unsafe fn wait ( & self , mutex : & Mutex ) {
54
48
let mutex = mutex:: raw ( mutex) ;
55
49
assert_eq ! (
56
- ( * mutex) . load( Ordering :: Relaxed ) & !abi:: LOCK_KERNEL_MANAGED . 0 ,
50
+ mutex. load( Ordering :: Relaxed ) & !abi:: LOCK_KERNEL_MANAGED . 0 ,
57
51
__pthread_thread_id. 0 | abi:: LOCK_WRLOCKED . 0 ,
58
52
"This lock is not write-locked by this thread"
59
53
) ;
60
54
61
55
// Call into the kernel to wait on the condition variable.
62
- let condvar = self . condvar . get ( ) ;
63
56
let subscription = abi:: subscription {
64
57
type_ : abi:: eventtype:: CONDVAR ,
65
58
union : abi:: subscription_union {
66
59
condvar : abi:: subscription_condvar {
67
- condvar : condvar as * mut abi:: condvar ,
60
+ condvar : & self . condvar as * const AtomicU32 as * mut abi:: condvar ,
68
61
condvar_scope : abi:: scope:: PRIVATE ,
69
- lock : mutex as * mut abi:: lock ,
62
+ lock : mutex as * const AtomicU32 as * mut abi:: lock ,
70
63
lock_scope : abi:: scope:: PRIVATE ,
71
64
} ,
72
65
} ,
@@ -86,23 +79,22 @@ impl Condvar {
86
79
pub unsafe fn wait_timeout ( & self , mutex : & Mutex , dur : Duration ) -> bool {
87
80
let mutex = mutex:: raw ( mutex) ;
88
81
assert_eq ! (
89
- ( * mutex) . load( Ordering :: Relaxed ) & !abi:: LOCK_KERNEL_MANAGED . 0 ,
82
+ mutex. load( Ordering :: Relaxed ) & !abi:: LOCK_KERNEL_MANAGED . 0 ,
90
83
__pthread_thread_id. 0 | abi:: LOCK_WRLOCKED . 0 ,
91
84
"This lock is not write-locked by this thread"
92
85
) ;
93
86
94
87
// Call into the kernel to wait on the condition variable.
95
- let condvar = self . condvar . get ( ) ;
96
88
let timeout =
97
89
checked_dur2intervals ( & dur) . expect ( "overflow converting duration to nanoseconds" ) ;
98
90
let subscriptions = [
99
91
abi:: subscription {
100
92
type_ : abi:: eventtype:: CONDVAR ,
101
93
union : abi:: subscription_union {
102
94
condvar : abi:: subscription_condvar {
103
- condvar : condvar as * mut abi:: condvar ,
95
+ condvar : & self . condvar as * const AtomicU32 as * mut abi:: condvar ,
104
96
condvar_scope : abi:: scope:: PRIVATE ,
105
- lock : mutex as * mut abi:: lock ,
97
+ lock : mutex as * const AtomicU32 as * mut abi:: lock ,
106
98
lock_scope : abi:: scope:: PRIVATE ,
107
99
} ,
108
100
} ,
@@ -144,9 +136,8 @@ impl Condvar {
144
136
}
145
137
146
138
pub unsafe fn destroy ( & self ) {
147
- let condvar = self . condvar . get ( ) ;
148
139
assert_eq ! (
149
- ( * condvar) . load( Ordering :: Relaxed ) ,
140
+ self . condvar. load( Ordering :: Relaxed ) ,
150
141
abi:: CONDVAR_HAS_NO_WAITERS . 0 ,
151
142
"Attempted to destroy a condition variable with blocked threads"
152
143
) ;
0 commit comments