@@ -9,6 +9,8 @@ pub struct Mutex {
9
9
initialized : AtomicU8 ,
10
10
}
11
11
12
+ pub type MovableMutex = Mutex ;
13
+
12
14
unsafe impl Send for Mutex { }
13
15
unsafe impl Sync for Mutex { }
14
16
@@ -31,14 +33,14 @@ impl Mutex {
31
33
#[ inline]
32
34
unsafe fn atomic_init ( & self ) {
33
35
loop {
34
- match self . initialized . compare_and_swap ( UNINITIALIZED , INITIALIZING , SeqCst ) {
35
- UNINITIALIZED => {
36
+ match self . initialized . compare_exchange_weak ( UNINITIALIZED , INITIALIZING , SeqCst , SeqCst ) {
37
+ Ok ( UNINITIALIZED ) => {
36
38
* self . inner . get ( ) = xSemaphoreCreateMutex ( ) ;
37
39
debug_assert ! ( !( * self . inner. get( ) ) . is_null( ) ) ;
38
40
self . initialized . store ( INITIALIZED , SeqCst ) ;
39
41
return ;
40
42
}
41
- INITIALIZED => return ,
43
+ Err ( INITIALIZED ) => return ,
42
44
_ => continue ,
43
45
}
44
46
}
@@ -67,14 +69,14 @@ impl Mutex {
67
69
#[ inline]
68
70
pub unsafe fn destroy ( & self ) {
69
71
loop {
70
- match self . initialized . compare_and_swap ( INITIALIZED , UNINITIALIZING , SeqCst ) {
71
- INITIALIZED => {
72
+ match self . initialized . compare_exchange_weak ( INITIALIZED , UNINITIALIZING , SeqCst , SeqCst ) {
73
+ Ok ( INITIALIZED ) => {
72
74
vSemaphoreDelete ( * self . inner . get ( ) ) ;
73
75
* self . inner . get ( ) = ptr:: null_mut ( ) ;
74
76
self . initialized . store ( UNINITIALIZED , SeqCst ) ;
75
77
return ;
76
78
}
77
- UNINITIALIZED => return ,
79
+ Err ( UNINITIALIZED ) => return ,
78
80
_ => continue ,
79
81
}
80
82
}
@@ -111,14 +113,14 @@ impl ReentrantMutex {
111
113
#[ inline]
112
114
unsafe fn atomic_init ( & self ) {
113
115
loop {
114
- match self . initialized . compare_and_swap ( UNINITIALIZED , INITIALIZING , SeqCst ) {
115
- UNINITIALIZED => {
116
+ match self . initialized . compare_exchange_weak ( UNINITIALIZED , INITIALIZING , SeqCst , SeqCst ) {
117
+ Ok ( UNINITIALIZED ) => {
116
118
* self . inner . get ( ) = xSemaphoreCreateRecursiveMutex ( ) ;
117
119
debug_assert ! ( !( * self . inner. get( ) ) . is_null( ) ) ;
118
120
self . initialized . store ( INITIALIZED , SeqCst ) ;
119
121
return ;
120
122
}
121
- INITIALIZED => return ,
123
+ Err ( INITIALIZED ) => return ,
122
124
_ => continue ,
123
125
}
124
126
}
@@ -145,14 +147,14 @@ impl ReentrantMutex {
145
147
146
148
pub unsafe fn destroy ( & self ) {
147
149
loop {
148
- match self . initialized . compare_and_swap ( INITIALIZED , UNINITIALIZING , SeqCst ) {
149
- INITIALIZED => {
150
+ match self . initialized . compare_exchange_weak ( INITIALIZED , UNINITIALIZING , SeqCst , SeqCst ) {
151
+ Ok ( INITIALIZED ) => {
150
152
vSemaphoreDelete ( * self . inner . get ( ) ) ;
151
153
* self . inner . get ( ) = ptr:: null_mut ( ) ;
152
154
self . initialized . store ( UNINITIALIZED , SeqCst ) ;
153
155
return ;
154
156
}
155
- UNINITIALIZED => return ,
157
+ Err ( UNINITIALIZED ) => return ,
156
158
_ => continue ,
157
159
}
158
160
}
0 commit comments