From e2116c8fba6e73bc2bbf7cb6bb41911d4daed043 Mon Sep 17 00:00:00 2001 From: Flavio Percoco Date: Mon, 22 Dec 2014 12:29:46 +0100 Subject: 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. --- src/libstd/comm/mod.rs | 29 ++++++++++++++++++++++++++++- src/libstd/sync/mutex.rs | 5 +++-- src/libstd/sys/unix/mutex.rs | 3 ++- src/libstd/thread.rs | 2 +- src/libstd/thread_local/scoped.rs | 5 ++--- 5 files changed, 36 insertions(+), 8 deletions(-) (limited to 'src/libstd') 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 Drop for Receiver { } } +/// A version of `UnsafeCell` intended for use in concurrent data +/// structures (for example, you might put it in an `Arc`). +pub struct RacyCell(pub UnsafeCell); + +impl RacyCell { + /// DOX + pub fn new(value: T) -> RacyCell { + 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 Send for RacyCell { } + +unsafe impl kinds::Sync for RacyCell { } // 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 Key { #[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 { pub inner: UnsafeCell<*mut T> } + pub struct KeyInner { pub inner: RacyCell<*mut T> } unsafe impl ::kinds::Sync for KeyInner { } -- cgit 1.4.1-3-g733a5