Skip to content

Commit 15ab6fd

Browse files
committed
auto merge of #8039 : Xazax-hun/rust/master, r=brson
Added some more atomic operations. #7421
2 parents 382b037 + 7cc8f4b commit 15ab6fd

File tree

1 file changed

+184
-2
lines changed

1 file changed

+184
-2
lines changed

src/libstd/unstable/atomics.rs

Lines changed: 184 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ impl AtomicFlag {
9696
*/
9797
#[inline]
9898
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 }
100100
}
101101
}
102102

@@ -121,7 +121,7 @@ impl AtomicBool {
121121
pub fn swap(&mut self, val: bool, order: Ordering) -> bool {
122122
let val = if val { 1 } else { 0 };
123123

124-
unsafe { atomic_swap(&mut self.v, val, order) > 0}
124+
unsafe { atomic_swap(&mut self.v, val, order) > 0 }
125125
}
126126

127127
#[inline]
@@ -131,6 +131,38 @@ impl AtomicBool {
131131

132132
unsafe { atomic_compare_and_swap(&mut self.v, old, new, order) > 0 }
133133
}
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+
}
134166
}
135167

136168
impl AtomicInt {
@@ -169,6 +201,18 @@ impl AtomicInt {
169201
pub fn fetch_sub(&mut self, val: int, order: Ordering) -> int {
170202
unsafe { atomic_sub(&mut self.v, val, order) }
171203
}
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+
}
172216
}
173217

174218
impl AtomicUint {
@@ -207,6 +251,18 @@ impl AtomicUint {
207251
pub fn fetch_sub(&mut self, val: uint, order: Ordering) -> uint {
208252
unsafe { atomic_sub(&mut self.v, val, order) }
209253
}
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+
}
210266
}
211267

212268
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
395451
})
396452
}
397453

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+
398573
#[cfg(test)]
399574
mod test {
400575
use option::*;
@@ -448,4 +623,11 @@ mod test {
448623
assert!(p.fill(~2, SeqCst).is_none()); // shouldn't fail
449624
assert_eq!(p.take(SeqCst), Some(~2));
450625
}
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+
}
451633
}

0 commit comments

Comments
 (0)