@@ -208,25 +208,50 @@ extern {
208
208
/* *********************************************************************/
209
209
210
210
//FIXME: #5042 This should be replaced by proper atomic type
211
- pub struct AtomicUint ( uint ) ;
212
- pub impl AtomicUint {
213
- fn load ( & self ) -> uint {
211
+ pub struct AtomicUint {
212
+ priv inner : uint
213
+ }
214
+
215
+ impl AtomicUint {
216
+ pub fn new ( val : uint ) -> AtomicUint { AtomicUint { inner : val } }
217
+ pub fn load ( & self ) -> uint {
214
218
unsafe { intrinsics:: atomic_load ( cast:: transmute ( self ) ) as uint }
215
219
}
216
- fn store ( & mut self , val : uint ) {
220
+ pub fn store ( & mut self , val : uint ) {
217
221
unsafe { intrinsics:: atomic_store ( cast:: transmute ( self ) , val as int ) ; }
218
222
}
219
- fn add ( & mut self , val : int ) -> uint {
223
+ pub fn add ( & mut self , val : int ) -> uint {
220
224
unsafe { intrinsics:: atomic_xadd ( cast:: transmute ( self ) , val as int ) as uint }
221
225
}
222
- fn cas ( & self , old : uint , new : uint ) -> uint {
226
+ pub fn cas ( & mut self , old : uint , new : uint ) -> uint {
223
227
unsafe { intrinsics:: atomic_cxchg ( cast:: transmute ( self ) , old as int , new as int ) as uint }
224
228
}
225
229
}
226
230
231
+ pub struct AtomicInt {
232
+ priv inner : int
233
+ }
234
+
235
+ impl AtomicInt {
236
+ pub fn new ( val : int ) -> AtomicInt { AtomicInt { inner : val } }
237
+ pub fn load ( & self ) -> int {
238
+ unsafe { intrinsics:: atomic_load ( & self . inner ) }
239
+ }
240
+ pub fn store ( & mut self , val : int ) {
241
+ unsafe { intrinsics:: atomic_store ( & mut self . inner , val) ; }
242
+ }
243
+ pub fn add ( & mut self , val : int ) -> int {
244
+ unsafe { intrinsics:: atomic_xadd ( & mut self . inner , val) }
245
+ }
246
+ pub fn cas ( & mut self , old : int , new : int ) -> int {
247
+ unsafe { intrinsics:: atomic_cxchg ( & mut self . inner , old, new) }
248
+ }
249
+ }
250
+
227
251
228
252
#[ cfg( test) ]
229
253
mod tests {
254
+ use super :: * ;
230
255
use comm;
231
256
use super :: exclusive;
232
257
use task;
@@ -278,4 +303,28 @@ mod tests {
278
303
assert_eq ! ( * one, 1 ) ;
279
304
}
280
305
}
306
+
307
+ #[ test]
308
+ fn atomic_int_smoke_test ( ) {
309
+ let mut i = AtomicInt :: new ( 0 ) ;
310
+ i. store ( 10 ) ;
311
+ assert ! ( i. load( ) == 10 ) ;
312
+ assert ! ( i. add( 1 ) == 10 ) ;
313
+ assert ! ( i. load( ) == 11 ) ;
314
+ assert ! ( i. cas( 11 , 12 ) == 11 ) ;
315
+ assert ! ( i. cas( 11 , 13 ) == 12 ) ;
316
+ assert ! ( i. load( ) == 12 ) ;
317
+ }
318
+
319
+ #[ test]
320
+ fn atomic_uint_smoke_test ( ) {
321
+ let mut i = AtomicUint :: new ( 0 ) ;
322
+ i. store ( 10 ) ;
323
+ assert ! ( i. load( ) == 10 ) ;
324
+ assert ! ( i. add( 1 ) == 10 ) ;
325
+ assert ! ( i. load( ) == 11 ) ;
326
+ assert ! ( i. cas( 11 , 12 ) == 11 ) ;
327
+ assert ! ( i. cas( 11 , 13 ) == 12 ) ;
328
+ assert ! ( i. load( ) == 12 ) ;
329
+ }
281
330
}
0 commit comments