@@ -96,7 +96,7 @@ impl AtomicFlag {
96
96
*/
97
97
#[ inline]
98
98
pub fn test_and_set ( & mut self , order : Ordering ) -> bool {
99
- unsafe { atomic_compare_and_swap ( & mut self . v , 0 , 1 , order) > 0 }
99
+ unsafe { atomic_compare_and_swap ( & mut self . v , 0 , 1 , order) > 0 }
100
100
}
101
101
}
102
102
@@ -121,7 +121,7 @@ impl AtomicBool {
121
121
pub fn swap ( & mut self , val : bool , order : Ordering ) -> bool {
122
122
let val = if val { 1 } else { 0 } ;
123
123
124
- unsafe { atomic_swap ( & mut self . v , val, order) > 0 }
124
+ unsafe { atomic_swap ( & mut self . v , val, order) > 0 }
125
125
}
126
126
127
127
#[ inline]
@@ -131,6 +131,38 @@ impl AtomicBool {
131
131
132
132
unsafe { atomic_compare_and_swap ( & mut self . v , old, new, order) > 0 }
133
133
}
134
+
135
+ /// Returns the old value
136
+ #[ inline]
137
+ pub fn fetch_and ( & mut self , val : bool , order : Ordering ) -> bool {
138
+ let val = if val { 1 } else { 0 } ;
139
+
140
+ unsafe { atomic_and ( & mut self . v , val, order) > 0 }
141
+ }
142
+
143
+ /// Returns the old value
144
+ #[ inline]
145
+ pub fn fetch_nand ( & mut self , val : bool , order : Ordering ) -> bool {
146
+ let val = if val { 1 } else { 0 } ;
147
+
148
+ unsafe { atomic_nand ( & mut self . v , val, order) > 0 }
149
+ }
150
+
151
+ /// Returns the old value
152
+ #[ inline]
153
+ pub fn fetch_or ( & mut self , val : bool , order : Ordering ) -> bool {
154
+ let val = if val { 1 } else { 0 } ;
155
+
156
+ unsafe { atomic_or ( & mut self . v , val, order) > 0 }
157
+ }
158
+
159
+ /// Returns the old value
160
+ #[ inline]
161
+ pub fn fetch_xor ( & mut self , val : bool , order : Ordering ) -> bool {
162
+ let val = if val { 1 } else { 0 } ;
163
+
164
+ unsafe { atomic_xor ( & mut self . v , val, order) > 0 }
165
+ }
134
166
}
135
167
136
168
impl AtomicInt {
@@ -169,6 +201,18 @@ impl AtomicInt {
169
201
pub fn fetch_sub ( & mut self , val : int , order : Ordering ) -> int {
170
202
unsafe { atomic_sub ( & mut self . v , val, order) }
171
203
}
204
+
205
+ /// Returns the old value
206
+ #[ inline]
207
+ pub fn fetch_min ( & mut self , val : int , order : Ordering ) -> int {
208
+ unsafe { atomic_min ( & mut self . v , val, order) }
209
+ }
210
+
211
+ /// Returns the old value
212
+ #[ inline]
213
+ pub fn fetch_max ( & mut self , val : int , order : Ordering ) -> int {
214
+ unsafe { atomic_max ( & mut self . v , val, order) }
215
+ }
172
216
}
173
217
174
218
impl AtomicUint {
@@ -207,6 +251,18 @@ impl AtomicUint {
207
251
pub fn fetch_sub ( & mut self , val : uint , order : Ordering ) -> uint {
208
252
unsafe { atomic_sub ( & mut self . v , val, order) }
209
253
}
254
+
255
+ /// Returns the old value
256
+ #[ inline]
257
+ pub fn fetch_min ( & mut self , val : uint , order : Ordering ) -> uint {
258
+ unsafe { atomic_umin ( & mut self . v , val, order) }
259
+ }
260
+
261
+ /// Returns the old value
262
+ #[ inline]
263
+ pub fn fetch_max ( & mut self , val : uint , order : Ordering ) -> uint {
264
+ unsafe { atomic_umax ( & mut self . v , val, order) }
265
+ }
210
266
}
211
267
212
268
impl < T > AtomicPtr < T > {
@@ -395,6 +451,125 @@ pub unsafe fn atomic_compare_and_swap<T>(dst:&mut T, old:T, new:T, order: Orderi
395
451
} )
396
452
}
397
453
454
+ #[ inline]
455
+ pub unsafe fn atomic_and < T > ( dst : & mut T , val : T , order : Ordering ) -> T {
456
+ let dst = cast:: transmute ( dst) ;
457
+ let val = cast:: transmute ( val) ;
458
+
459
+ cast:: transmute ( match order {
460
+ Acquire => intrinsics:: atomic_and_acq ( dst, val) ,
461
+ Release => intrinsics:: atomic_and_rel ( dst, val) ,
462
+ AcqRel => intrinsics:: atomic_and_acqrel ( dst, val) ,
463
+ Relaxed => intrinsics:: atomic_and_relaxed ( dst, val) ,
464
+ _ => intrinsics:: atomic_and ( dst, val)
465
+ } )
466
+ }
467
+
468
+
469
+ #[ inline]
470
+ pub unsafe fn atomic_nand < T > ( dst : & mut T , val : T , order : Ordering ) -> T {
471
+ let dst = cast:: transmute ( dst) ;
472
+ let val = cast:: transmute ( val) ;
473
+
474
+ cast:: transmute ( match order {
475
+ Acquire => intrinsics:: atomic_nand_acq ( dst, val) ,
476
+ Release => intrinsics:: atomic_nand_rel ( dst, val) ,
477
+ AcqRel => intrinsics:: atomic_nand_acqrel ( dst, val) ,
478
+ Relaxed => intrinsics:: atomic_nand_relaxed ( dst, val) ,
479
+ _ => intrinsics:: atomic_nand ( dst, val)
480
+ } )
481
+ }
482
+
483
+
484
+ #[ inline]
485
+ pub unsafe fn atomic_or < T > ( dst : & mut T , val : T , order : Ordering ) -> T {
486
+ let dst = cast:: transmute ( dst) ;
487
+ let val = cast:: transmute ( val) ;
488
+
489
+ cast:: transmute ( match order {
490
+ Acquire => intrinsics:: atomic_or_acq ( dst, val) ,
491
+ Release => intrinsics:: atomic_or_rel ( dst, val) ,
492
+ AcqRel => intrinsics:: atomic_or_acqrel ( dst, val) ,
493
+ Relaxed => intrinsics:: atomic_or_relaxed ( dst, val) ,
494
+ _ => intrinsics:: atomic_or ( dst, val)
495
+ } )
496
+ }
497
+
498
+
499
+ #[ inline]
500
+ pub unsafe fn atomic_xor < T > ( dst : & mut T , val : T , order : Ordering ) -> T {
501
+ let dst = cast:: transmute ( dst) ;
502
+ let val = cast:: transmute ( val) ;
503
+
504
+ cast:: transmute ( match order {
505
+ Acquire => intrinsics:: atomic_xor_acq ( dst, val) ,
506
+ Release => intrinsics:: atomic_xor_rel ( dst, val) ,
507
+ AcqRel => intrinsics:: atomic_xor_acqrel ( dst, val) ,
508
+ Relaxed => intrinsics:: atomic_xor_relaxed ( dst, val) ,
509
+ _ => intrinsics:: atomic_xor ( dst, val)
510
+ } )
511
+ }
512
+
513
+
514
+ #[ inline]
515
+ pub unsafe fn atomic_max < T > ( dst : & mut T , val : T , order : Ordering ) -> T {
516
+ let dst = cast:: transmute ( dst) ;
517
+ let val = cast:: transmute ( val) ;
518
+
519
+ cast:: transmute ( match order {
520
+ Acquire => intrinsics:: atomic_max_acq ( dst, val) ,
521
+ Release => intrinsics:: atomic_max_rel ( dst, val) ,
522
+ AcqRel => intrinsics:: atomic_max_acqrel ( dst, val) ,
523
+ Relaxed => intrinsics:: atomic_max_relaxed ( dst, val) ,
524
+ _ => intrinsics:: atomic_max ( dst, val)
525
+ } )
526
+ }
527
+
528
+
529
+ #[ inline]
530
+ pub unsafe fn atomic_min < T > ( dst : & mut T , val : T , order : Ordering ) -> T {
531
+ let dst = cast:: transmute ( dst) ;
532
+ let val = cast:: transmute ( val) ;
533
+
534
+ cast:: transmute ( match order {
535
+ Acquire => intrinsics:: atomic_min_acq ( dst, val) ,
536
+ Release => intrinsics:: atomic_min_rel ( dst, val) ,
537
+ AcqRel => intrinsics:: atomic_min_acqrel ( dst, val) ,
538
+ Relaxed => intrinsics:: atomic_min_relaxed ( dst, val) ,
539
+ _ => intrinsics:: atomic_min ( dst, val)
540
+ } )
541
+ }
542
+
543
+ #[ inline]
544
+ pub unsafe fn atomic_umax < T > ( dst : & mut T , val : T , order : Ordering ) -> T {
545
+ let dst = cast:: transmute ( dst) ;
546
+ let val = cast:: transmute ( val) ;
547
+
548
+ cast:: transmute ( match order {
549
+ Acquire => intrinsics:: atomic_umax_acq ( dst, val) ,
550
+ Release => intrinsics:: atomic_umax_rel ( dst, val) ,
551
+ AcqRel => intrinsics:: atomic_umax_acqrel ( dst, val) ,
552
+ Relaxed => intrinsics:: atomic_umax_relaxed ( dst, val) ,
553
+ _ => intrinsics:: atomic_umax ( dst, val)
554
+ } )
555
+ }
556
+
557
+
558
+ #[ inline]
559
+ pub unsafe fn atomic_umin < T > ( dst : & mut T , val : T , order : Ordering ) -> T {
560
+ let dst = cast:: transmute ( dst) ;
561
+ let val = cast:: transmute ( val) ;
562
+
563
+ cast:: transmute ( match order {
564
+ Acquire => intrinsics:: atomic_umin_acq ( dst, val) ,
565
+ Release => intrinsics:: atomic_umin_rel ( dst, val) ,
566
+ AcqRel => intrinsics:: atomic_umin_acqrel ( dst, val) ,
567
+ Relaxed => intrinsics:: atomic_umin_relaxed ( dst, val) ,
568
+ _ => intrinsics:: atomic_umin ( dst, val)
569
+ } )
570
+ }
571
+
572
+
398
573
#[ cfg( test) ]
399
574
mod test {
400
575
use option:: * ;
@@ -448,4 +623,11 @@ mod test {
448
623
assert ! ( p. fill( ~2 , SeqCst ) . is_none( ) ) ; // shouldn't fail
449
624
assert_eq ! ( p. take( SeqCst ) , Some ( ~2 ) ) ;
450
625
}
626
+
627
+ #[ test]
628
+ fn bool_and ( ) {
629
+ let mut a = AtomicBool :: new ( true ) ;
630
+ assert_eq ! ( a. fetch_and( false , SeqCst ) , true ) ;
631
+ assert_eq ! ( a. load( SeqCst ) , false ) ;
632
+ }
451
633
}
0 commit comments