@@ -17,32 +17,27 @@ unsafe impl Sync for Condvar {}
17
17
18
18
impl Condvar {
19
19
pub const fn new ( ) -> Condvar {
20
- // Might be moved and address is changing it is better to avoid
21
- // initialization of potentially opaque OS data before it landed
22
20
Condvar {
23
21
lock : unsafe { ReentrantMutex :: uninitialized ( ) } ,
24
22
waiter_list : UnsafeCell :: new ( None ) ,
25
23
}
26
24
}
27
25
28
26
#[ inline]
29
- pub unsafe fn init ( & mut self ) { }
30
-
31
- #[ inline]
32
- unsafe fn init_waiter_list ( & self ) {
33
- if ( * self . waiter_list . get ( ) ) . is_none ( ) {
34
- ( * self . waiter_list . get ( ) ) = Some ( VecDeque :: new ( ) ) ;
35
- }
27
+ pub unsafe fn init ( & mut self ) {
28
+ self . waiter_list . get_mut ( ) . replace ( VecDeque :: new ( ) ) ;
36
29
}
37
30
38
31
#[ inline]
39
32
pub unsafe fn notify_one ( & self ) {
40
33
self . lock . lock ( ) ;
41
34
42
- self . init_waiter_list ( ) ;
43
- let waiter_list = ( & * self . waiter_list . get ( ) ) . as_ref ( ) . unwrap ( ) ;
44
- if let Some ( & waiter) = waiter_list. front ( ) {
45
- xSemaphoreGive ( waiter) ;
35
+ if let Some ( waiter_list) = ( & * self . waiter_list . get ( ) ) . as_ref ( ) {
36
+ if let Some ( & waiter) = waiter_list. front ( ) {
37
+ xSemaphoreGive ( waiter) ;
38
+ }
39
+ } else {
40
+ core:: hint:: unreachable_unchecked ( ) ;
46
41
}
47
42
48
43
self . lock . unlock ( ) ;
@@ -52,10 +47,12 @@ impl Condvar {
52
47
pub unsafe fn notify_all ( & self ) {
53
48
self . lock . lock ( ) ;
54
49
55
- self . init_waiter_list ( ) ;
56
- let waiter_list = ( & * self . waiter_list . get ( ) ) . as_ref ( ) . unwrap ( ) ;
57
- for & waiter in waiter_list {
58
- xSemaphoreGive ( waiter) ;
50
+ if let Some ( waiter_list) = ( & * self . waiter_list . get ( ) ) . as_ref ( ) {
51
+ for & waiter in waiter_list {
52
+ xSemaphoreGive ( waiter) ;
53
+ }
54
+ } else {
55
+ core:: hint:: unreachable_unchecked ( ) ;
59
56
}
60
57
61
58
self . lock . unlock ( ) ;
@@ -88,9 +85,11 @@ impl Condvar {
88
85
89
86
self . lock . lock ( ) ;
90
87
91
- self . init_waiter_list ( ) ;
92
- let waiter_list = ( & mut * self . waiter_list . get ( ) ) . as_mut ( ) . unwrap ( ) ;
93
- waiter_list. push_back ( waiter) ;
88
+ if let Some ( waiter_list) = ( & mut * self . waiter_list . get ( ) ) . as_mut ( ) {
89
+ waiter_list. push_back ( waiter) ;
90
+ } else {
91
+ core:: hint:: unreachable_unchecked ( ) ;
92
+ }
94
93
95
94
self . lock . unlock ( ) ;
96
95
@@ -104,18 +103,19 @@ impl Condvar {
104
103
105
104
self . lock . lock ( ) ;
106
105
107
- let waiter_list = ( & mut * self . waiter_list . get ( ) ) . as_mut ( ) . unwrap ( ) ;
108
- let deleted_waiter = if let Some ( index) = waiter_list. iter ( ) . position ( |& w| w == waiter) {
109
- waiter_list. remove ( index)
106
+ if let Some ( waiter_list) = ( & mut * self . waiter_list . get ( ) ) . as_mut ( ) {
107
+ if let Some ( index) = waiter_list. iter ( ) . position ( |& w| w == waiter) {
108
+ waiter_list. remove ( index) ;
109
+ } else {
110
+ core:: hint:: unreachable_unchecked ( ) ;
111
+ }
110
112
} else {
111
- None
112
- } ;
113
+ core :: hint :: unreachable_unchecked ( ) ;
114
+ }
113
115
114
116
self . lock . unlock ( ) ;
115
117
116
- if let Some ( deleted_waiter) = deleted_waiter {
117
- vSemaphoreDelete ( deleted_waiter) ;
118
- }
118
+ vSemaphoreDelete ( waiter) ;
119
119
120
120
mutex. lock ( ) ;
121
121
@@ -128,12 +128,17 @@ impl Condvar {
128
128
129
129
#[ inline]
130
130
pub unsafe fn destroy ( & self ) {
131
+ #[ cfg( debug) ]
132
+ {
131
133
self . lock . lock ( ) ;
132
134
133
- if let Some ( waiter_list) = ( & * self . waiter_list . get ( ) ) . as_ref ( ) {
134
- assert ! ( waiter_list. is_empty( ) ) ;
135
+ if let Some ( waiter_list) = ( & * self . waiter_list . get ( ) ) . as_mut ( ) {
136
+ debug_assert ! ( waiter_list. is_empty( ) ) ;
137
+ } else {
138
+ core:: hint:: unreachable_unchecked ( ) ;
135
139
}
136
140
137
141
self . lock . unlock ( ) ;
142
+ }
138
143
}
139
144
}
0 commit comments