@@ -17,23 +17,23 @@ use cast;
17
17
use option:: { Option , Some , None } ;
18
18
19
19
pub struct AtomicFlag {
20
- priv v: int
20
+ priv v: int
21
21
}
22
22
23
23
pub struct AtomicBool {
24
- priv v: uint
24
+ priv v: uint
25
25
}
26
26
27
27
pub struct AtomicInt {
28
- priv v: int
28
+ priv v: int
29
29
}
30
30
31
31
pub struct AtomicUint {
32
- priv v: uint
32
+ priv v: uint
33
33
}
34
34
35
35
pub struct AtomicPtr < T > {
36
- priv p: ~ T
36
+ priv p: * mut T
37
37
}
38
38
39
39
pub enum Ordering {
@@ -173,60 +173,28 @@ impl AtomicUint {
173
173
}
174
174
175
175
impl < T > AtomicPtr < T > {
176
- fn new ( p : ~ T ) -> AtomicPtr < T > {
176
+ fn new ( p : * mut T ) -> AtomicPtr < T > {
177
177
AtomicPtr { p : p }
178
178
}
179
179
180
- /**
181
- * Atomically swaps the stored pointer with the one given.
182
- *
183
- * Returns None if the pointer stored has been taken
184
- */
185
180
#[ inline( always) ]
186
- fn swap ( & mut self , ptr : ~T , order : Ordering ) -> Option < ~T > {
187
- unsafe {
188
- let p = atomic_swap ( & mut self . p , ptr, order) ;
189
- let pv : & uint = cast:: transmute ( & p) ;
190
-
191
- if * pv == 0 {
192
- None
193
- } else {
194
- Some ( p)
195
- }
196
- }
181
+ fn load ( & self , order : Ordering ) -> * mut T {
182
+ unsafe { atomic_load ( & self . p , order) }
197
183
}
198
184
199
- /**
200
- * Atomically takes the stored pointer out.
201
- *
202
- * Returns None if it was already taken.
203
- */
204
185
#[ inline( always) ]
205
- fn take ( & mut self , order : Ordering ) -> Option < ~ T > {
206
- unsafe { self . swap ( cast :: transmute ( 0 ) , order) }
186
+ fn store ( & mut self , ptr : * mut T , order : Ordering ) {
187
+ unsafe { atomic_store ( & mut self . p , ptr , order) ; }
207
188
}
208
189
209
- /**
210
- * Atomically stores the given pointer, this will overwrite
211
- * and previous value stored.
212
- */
213
190
#[ inline( always) ]
214
- fn give ( & mut self , ptr : ~ T , order : Ordering ) {
215
- let _ = self . swap ( ptr, order) ;
191
+ fn swap ( & mut self , ptr : * mut T , order : Ordering ) -> * mut T {
192
+ unsafe { atomic_swap ( & mut self . p , ptr, order) }
216
193
}
217
194
218
- /**
219
- * Checks to see if the stored pointer has been taken.
220
- */
221
- fn taken ( & self , order : Ordering ) -> bool {
222
- unsafe {
223
- let p : ~T = atomic_load ( & self . p , order) ;
224
-
225
- let pv : & uint = cast:: transmute ( & p) ;
226
-
227
- cast:: forget ( p) ;
228
- * pv == 0
229
- }
195
+ #[ inline( always) ]
196
+ fn compare_and_swap ( & mut self , old : * mut T , new : * mut T , order : Ordering ) -> * mut T {
197
+ unsafe { atomic_compare_and_swap ( & mut self . v , old, new, order) }
230
198
}
231
199
}
232
200
0 commit comments