diff --git a/src/libstd/sync/mpsc/mod.rs b/src/libstd/sync/mpsc/mod.rs index 0ba19b70617..e1ad02498db 100644 --- a/src/libstd/sync/mpsc/mod.rs +++ b/src/libstd/sync/mpsc/mod.rs @@ -319,6 +319,7 @@ use prelude::v1::*; use sync::Arc; use fmt; +#[cfg(stage0)] // NOTE remove use after next snapshot use marker; use mem; use cell::UnsafeCell; @@ -372,7 +373,7 @@ unsafe impl Send for Sender { } #[stable] #[cfg(stage0)] // NOTE remove impl after next snapshot pub struct SyncSender { - inner: Arc>>, + inner: Arc>>, // can't share in an arc _marker: marker::NoSync, } @@ -382,11 +383,13 @@ pub struct SyncSender { #[stable] #[cfg(not(stage0))] // NOTE remove cfg after next snapshot pub struct SyncSender { - inner: Arc>>, + inner: Arc>>, } +unsafe impl Send for SyncSender {} + #[cfg(not(stage0))] // NOTE remove cfg after next snapshot -impl !marker::Sync for SyncSender {} +impl !Sync for SyncSender {} /// An error returned from the `send` function on channels. /// @@ -442,10 +445,10 @@ pub enum TrySendError { } enum Flavor { - Oneshot(Arc>>), - Stream(Arc>>), - Shared(Arc>>), - Sync(Arc>>), + Oneshot(Arc>>), + Stream(Arc>>), + Shared(Arc>>), + Sync(Arc>>), } #[doc(hidden)] @@ -497,7 +500,7 @@ impl UnsafeFlavor for Receiver { /// ``` #[stable] pub fn channel() -> (Sender, Receiver) { - let a = Arc::new(RacyCell::new(oneshot::Packet::new())); + let a = Arc::new(UnsafeCell::new(oneshot::Packet::new())); (Sender::new(Flavor::Oneshot(a.clone())), Receiver::new(Flavor::Oneshot(a))) } @@ -537,7 +540,7 @@ pub fn channel() -> (Sender, Receiver) { /// ``` #[stable] pub fn sync_channel(bound: uint) -> (SyncSender, Receiver) { - let a = Arc::new(RacyCell::new(sync::Packet::new(bound))); + let a = Arc::new(UnsafeCell::new(sync::Packet::new(bound))); (SyncSender::new(a.clone()), Receiver::new(Flavor::Sync(a))) } @@ -589,7 +592,7 @@ impl Sender { return (*p).send(t).map_err(SendError); } else { let a = - Arc::new(RacyCell::new(stream::Packet::new())); + Arc::new(UnsafeCell::new(stream::Packet::new())); let rx = Receiver::new(Flavor::Stream(a.clone())); match (*p).upgrade(rx) { oneshot::UpSuccess => { @@ -631,7 +634,7 @@ impl Clone for Sender { fn clone(&self) -> Sender { let (packet, sleeper, guard) = match *unsafe { self.inner() } { Flavor::Oneshot(ref p) => { - let a = Arc::new(RacyCell::new(shared::Packet::new())); + let a = Arc::new(UnsafeCell::new(shared::Packet::new())); unsafe { let guard = (*a.get()).postinit_lock(); let rx = Receiver::new(Flavor::Shared(a.clone())); @@ -643,7 +646,7 @@ impl Clone for Sender { } } Flavor::Stream(ref p) => { - let a = Arc::new(RacyCell::new(shared::Packet::new())); + let a = Arc::new(UnsafeCell::new(shared::Packet::new())); unsafe { let guard = (*a.get()).postinit_lock(); let rx = Receiver::new(Flavor::Shared(a.clone())); @@ -690,12 +693,12 @@ impl Drop for Sender { impl SyncSender { #[cfg(stage0)] // NOTE remove impl after next snapshot - fn new(inner: Arc>>) -> SyncSender { + fn new(inner: Arc>>) -> SyncSender { SyncSender { inner: inner, _marker: marker::NoSync } } #[cfg(not(stage0))] // NOTE remove cfg after next snapshot - fn new(inner: Arc>>) -> SyncSender { + fn new(inner: Arc>>) -> SyncSender { SyncSender { inner: inner } } @@ -978,26 +981,6 @@ impl Drop for Receiver { } } -/// A version of `UnsafeCell` intended for use in concurrent data -/// structures (for example, you might put it in an `Arc`). -struct RacyCell(pub UnsafeCell); - -impl RacyCell { - - fn new(value: T) -> RacyCell { - RacyCell(UnsafeCell { value: value }) - } - - unsafe fn get(&self) -> *mut T { - self.0.get() - } - -} - -unsafe impl Send for RacyCell { } - -unsafe impl Sync for RacyCell { } // Oh dear - impl fmt::Show for SendError { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { "sending on a closed channel".fmt(f)