@@ -17,32 +17,27 @@ unsafe impl Sync for Condvar {}
1717
1818impl Condvar {
1919 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
2220 Condvar {
2321 lock : unsafe { ReentrantMutex :: uninitialized ( ) } ,
2422 waiter_list : UnsafeCell :: new ( None ) ,
2523 }
2624 }
2725
2826 #[ 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 ( ) ) ;
3629 }
3730
3831 #[ inline]
3932 pub unsafe fn notify_one ( & self ) {
4033 self . lock . lock ( ) ;
4134
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 ( ) ;
4641 }
4742
4843 self . lock . unlock ( ) ;
@@ -52,10 +47,12 @@ impl Condvar {
5247 pub unsafe fn notify_all ( & self ) {
5348 self . lock . lock ( ) ;
5449
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 ( ) ;
5956 }
6057
6158 self . lock . unlock ( ) ;
@@ -88,9 +85,11 @@ impl Condvar {
8885
8986 self . lock . lock ( ) ;
9087
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+ }
9493
9594 self . lock . unlock ( ) ;
9695
@@ -104,18 +103,19 @@ impl Condvar {
104103
105104 self . lock . lock ( ) ;
106105
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+ }
110112 } else {
111- None
112- } ;
113+ core :: hint :: unreachable_unchecked ( ) ;
114+ }
113115
114116 self . lock . unlock ( ) ;
115117
116- if let Some ( deleted_waiter) = deleted_waiter {
117- vSemaphoreDelete ( deleted_waiter) ;
118- }
118+ vSemaphoreDelete ( waiter) ;
119119
120120 mutex. lock ( ) ;
121121
@@ -128,12 +128,17 @@ impl Condvar {
128128
129129 #[ inline]
130130 pub unsafe fn destroy ( & self ) {
131+ #[ cfg( debug) ]
132+ {
131133 self . lock . lock ( ) ;
132134
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 ( ) ;
135139 }
136140
137141 self . lock . unlock ( ) ;
142+ }
138143 }
139144}
0 commit comments