about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2013-05-21 17:36:59 -0700
committerBrian Anderson <banderson@mozilla.com>2013-05-21 17:36:59 -0700
commit8f77a6f422184dacc14ae1b6a042c321e06bef88 (patch)
treef13fde162baf976dad0e24e82b738e88a7a61b7c
parent6d8d73cfc4cba2fdb2ee67448df39d89be08ce69 (diff)
core: Add AtomicInt and cleanup
-rw-r--r--src/libcore/unstable/sync.rs61
1 files changed, 55 insertions, 6 deletions
diff --git a/src/libcore/unstable/sync.rs b/src/libcore/unstable/sync.rs
index 7c228ff5647..6085ca1a482 100644
--- a/src/libcore/unstable/sync.rs
+++ b/src/libcore/unstable/sync.rs
@@ -208,25 +208,50 @@ extern {
 /* *********************************************************************/
 
 //FIXME: #5042 This should be replaced by proper atomic type
-pub struct AtomicUint(uint);
-pub impl AtomicUint {
-    fn load(&self) -> uint {
+pub struct AtomicUint {
+    priv inner: uint
+}
+
+impl AtomicUint {
+    pub fn new(val: uint) -> AtomicUint { AtomicUint { inner: val } }
+    pub fn load(&self) -> uint {
         unsafe { intrinsics::atomic_load(cast::transmute(self)) as uint }
     }
-    fn store(&mut self, val:uint) {
+    pub fn store(&mut self, val: uint) {
         unsafe { intrinsics::atomic_store(cast::transmute(self), val as int); }
     }
-    fn add(&mut self, val:int) -> uint {
+    pub fn add(&mut self, val: int) -> uint {
         unsafe { intrinsics::atomic_xadd(cast::transmute(self), val as int) as uint }
     }
-    fn cas(&self, old:uint, new:uint) -> uint {
+    pub fn cas(&mut self, old:uint, new: uint) -> uint {
         unsafe { intrinsics::atomic_cxchg(cast::transmute(self), old as int, new as int) as uint }
     }
 }
 
+pub struct AtomicInt {
+    priv inner: int
+}
+
+impl AtomicInt {
+    pub fn new(val: int) -> AtomicInt { AtomicInt { inner: val } }
+    pub fn load(&self) -> int {
+        unsafe { intrinsics::atomic_load(&self.inner) }
+    }
+    pub fn store(&mut self, val: int) {
+        unsafe { intrinsics::atomic_store(&mut self.inner, val); }
+    }
+    pub fn add(&mut self, val: int) -> int {
+        unsafe { intrinsics::atomic_xadd(&mut self.inner, val) }
+    }
+    pub fn cas(&mut self, old: int, new: int) -> int {
+        unsafe { intrinsics::atomic_cxchg(&mut self.inner, old, new) }
+    }
+}
+
 
 #[cfg(test)]
 mod tests {
+    use super::*;
     use comm;
     use super::exclusive;
     use task;
@@ -278,4 +303,28 @@ mod tests {
             assert_eq!(*one, 1);
         }
     }
+
+    #[test]
+    fn atomic_int_smoke_test() {
+        let mut i = AtomicInt::new(0);
+        i.store(10);
+        assert!(i.load() == 10);
+        assert!(i.add(1) == 10);
+        assert!(i.load() == 11);
+        assert!(i.cas(11, 12) == 11);
+        assert!(i.cas(11, 13) == 12);
+        assert!(i.load() == 12);
+    }
+
+    #[test]
+    fn atomic_uint_smoke_test() {
+        let mut i = AtomicUint::new(0);
+        i.store(10);
+        assert!(i.load() == 10);
+        assert!(i.add(1) == 10);
+        assert!(i.load() == 11);
+        assert!(i.cas(11, 12) == 11);
+        assert!(i.cas(11, 13) == 12);
+        assert!(i.load() == 12);
+    }
 }