about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorJames Miller <james@aatch.net>2013-07-28 20:26:29 +1200
committerJames Miller <james@aatch.net>2013-07-28 20:26:49 +1200
commit5c7e016700cd002647508ec4be764606c0086ce8 (patch)
tree2017ee88c7dbb5e0d20a900213dcd9abfd1c207a /src/libstd
parent4a1a0fbed5a57958eb7b658bbe3e5257872ae99f (diff)
downloadrust-5c7e016700cd002647508ec4be764606c0086ce8.tar.gz
rust-5c7e016700cd002647508ec4be764606c0086ce8.zip
Add static initializers for atomics
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/unstable/atomics.rs31
1 files changed, 26 insertions, 5 deletions
diff --git a/src/libstd/unstable/atomics.rs b/src/libstd/unstable/atomics.rs
index 8b57da32bbd..14ee6c1fd07 100644
--- a/src/libstd/unstable/atomics.rs
+++ b/src/libstd/unstable/atomics.rs
@@ -75,6 +75,10 @@ pub enum Ordering {
     SeqCst
 }
 
+pub static INIT_ATOMIC_FLAG : AtomicFlag = AtomicFlag { v: 0 };
+pub static INIT_ATOMIC_BOOL : AtomicBool = AtomicBool { v: 0 };
+pub static INIT_ATOMIC_INT  : AtomicInt  = AtomicInt  { v: 0 };
+pub static INIT_ATOMIC_UINT : AtomicUint = AtomicUint { v: 0 };
 
 impl AtomicFlag {
 
@@ -589,11 +593,13 @@ pub unsafe fn atomic_umin<T>(dst: &mut T, val: T, order: Ordering) -> T {
  */
 #[inline] #[cfg(not(stage0))]
 pub fn fence(order: Ordering) {
-    match order {
-        Acquire => intrinsics::atomic_fence_acq(),
-        Release => intrinsics::atomic_fence_rel(),
-        AcqRel  => intrinsics::atomic_fence_rel(),
-        _       => intrinsics::atomic_fence(),
+    unsafe {
+        match order {
+            Acquire => intrinsics::atomic_fence_acq(),
+            Release => intrinsics::atomic_fence_rel(),
+            AcqRel  => intrinsics::atomic_fence_rel(),
+            _       => intrinsics::atomic_fence(),
+        }
     }
 }
 
@@ -657,4 +663,19 @@ mod test {
         assert_eq!(a.fetch_and(false, SeqCst),true);
         assert_eq!(a.load(SeqCst),false);
     }
+
+    static mut S_FLAG : AtomicFlag = INIT_ATOMIC_FLAG;
+    static mut S_BOOL : AtomicBool = INIT_ATOMIC_BOOL;
+    static mut S_INT  : AtomicInt  = INIT_ATOMIC_INT;
+    static mut S_UINT : AtomicUint = INIT_ATOMIC_UINT;
+
+    #[test]
+    fn static_init() {
+        unsafe {
+            assert!(!S_FLAG.test_and_set(SeqCst));
+            assert!(!S_BOOL.load(SeqCst));
+            assert!(S_INT.load(SeqCst) == 0);
+            assert!(S_UINT.load(SeqCst) == 0);
+        }
+    }
 }