about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorFlavio Percoco <flaper87@gmail.com>2014-12-22 12:29:46 +0100
committerFlavio Percoco <flaper87@gmail.com>2014-12-26 17:26:33 +0100
commite2116c8fba6e73bc2bbf7cb6bb41911d4daed043 (patch)
tree5484f1e0a4b7dfad3f2a363e5db1a39c9b50ccc9 /src/libstd
parentf436f9ca2963e33cc41802370bb9c551c833970e (diff)
downloadrust-e2116c8fba6e73bc2bbf7cb6bb41911d4daed043.tar.gz
rust-e2116c8fba6e73bc2bbf7cb6bb41911d4daed043.zip
Move RacyCell to `std::comm`
RacyCell is not exactly what we'd like as a final implementation for
this. Therefore, we're moving it under `std::comm` and also making it
private.
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/comm/mod.rs29
-rw-r--r--src/libstd/sync/mutex.rs5
-rw-r--r--src/libstd/sys/unix/mutex.rs3
-rw-r--r--src/libstd/thread.rs2
-rw-r--r--src/libstd/thread_local/scoped.rs5
5 files changed, 36 insertions, 8 deletions
diff --git a/src/libstd/comm/mod.rs b/src/libstd/comm/mod.rs
index 618a5eebf0f..c317be85ebc 100644
--- a/src/libstd/comm/mod.rs
+++ b/src/libstd/comm/mod.rs
@@ -319,9 +319,10 @@ pub use self::TrySendError::*;
 use self::Flavor::*;
 
 use alloc::arc::Arc;
+use core::kinds;
 use core::kinds::marker;
 use core::mem;
-use core::cell::{UnsafeCell, RacyCell};
+use core::cell::UnsafeCell;
 
 pub use self::select::{Select, Handle};
 use self::select::StartResult;
@@ -1024,6 +1025,32 @@ impl<T: Send> Drop for Receiver<T> {
     }
 }
 
+/// A version of `UnsafeCell` intended for use in concurrent data
+/// structures (for example, you might put it in an `Arc`).
+pub struct RacyCell<T>(pub UnsafeCell<T>);
+
+impl<T> RacyCell<T> {
+    /// DOX
+    pub fn new(value: T) -> RacyCell<T> {
+        RacyCell(UnsafeCell { value: value })
+    }
+
+    /// DOX
+    pub unsafe fn get(&self) -> *mut T {
+        self.0.get()
+    }
+
+    /// DOX
+    pub unsafe fn into_inner(self) -> T {
+        self.0.into_inner()
+    }
+}
+
+unsafe impl<T:Send> Send for RacyCell<T> { }
+
+unsafe impl<T> kinds::Sync for RacyCell<T> { } // Oh dear
+
+
 #[cfg(test)]
 mod test {
     use prelude::*;
diff --git a/src/libstd/sync/mutex.rs b/src/libstd/sync/mutex.rs
index d2dafac281a..77c358c6259 100644
--- a/src/libstd/sync/mutex.rs
+++ b/src/libstd/sync/mutex.rs
@@ -10,8 +10,9 @@
 
 use prelude::*;
 
-use cell::{UnsafeCell, RacyCell};
-use kinds::{marker, Sync};
+use comm::RacyCell;
+use cell::UnsafeCell;
+use kinds::marker;
 use sync::{poison, AsMutexGuard};
 use sys_common::mutex as sys;
 
diff --git a/src/libstd/sys/unix/mutex.rs b/src/libstd/sys/unix/mutex.rs
index 986f50bc8de..3b0114b3e90 100644
--- a/src/libstd/sys/unix/mutex.rs
+++ b/src/libstd/sys/unix/mutex.rs
@@ -8,8 +8,9 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
+use comm::RacyCell;
+use cell::UnsafeCell;
 use kinds::Sync;
-use cell::{UnsafeCell, RacyCell};
 use sys::sync as ffi;
 use sys_common::mutex;
 
diff --git a/src/libstd/thread.rs b/src/libstd/thread.rs
index 92aa5201ec3..45d5c5e0aab 100644
--- a/src/libstd/thread.rs
+++ b/src/libstd/thread.rs
@@ -127,7 +127,7 @@
 use any::Any;
 use borrow::IntoCow;
 use boxed::Box;
-use cell::RacyCell;
+use comm::RacyCell;
 use clone::Clone;
 use kinds::{Send, Sync};
 use ops::{Drop, FnOnce};
diff --git a/src/libstd/thread_local/scoped.rs b/src/libstd/thread_local/scoped.rs
index d7ea163cc80..3ea051b16f2 100644
--- a/src/libstd/thread_local/scoped.rs
+++ b/src/libstd/thread_local/scoped.rs
@@ -196,11 +196,10 @@ impl<T> Key<T> {
 
 #[cfg(not(any(windows, target_os = "android", target_os = "ios")))]
 mod imp {
-    use std::cell::UnsafeCell;
+    use std::comm::RacyCell;
 
-    // SNAP c9f6d69 switch to `Cell`
     #[doc(hidden)]
-    pub struct KeyInner<T> { pub inner: UnsafeCell<*mut T> }
+    pub struct KeyInner<T> { pub inner: RacyCell<*mut T> }
 
     unsafe impl<T> ::kinds::Sync for KeyInner<T> { }