Skip to content

Commit b6380f5

Browse files
committed
Kill RacyCell in favor of marking SyncSender explicitly Send.
1 parent a0f86de commit b6380f5

File tree

1 file changed

+17
-34
lines changed

1 file changed

+17
-34
lines changed

src/libstd/sync/mpsc/mod.rs

Lines changed: 17 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,7 @@ use prelude::v1::*;
319319

320320
use sync::Arc;
321321
use fmt;
322+
#[cfg(stage0)] // NOTE remove use after next snapshot
322323
use marker;
323324
use mem;
324325
use cell::UnsafeCell;
@@ -372,7 +373,7 @@ unsafe impl<T:Send> Send for Sender<T> { }
372373
#[stable]
373374
#[cfg(stage0)] // NOTE remove impl after next snapshot
374375
pub struct SyncSender<T> {
375-
inner: Arc<RacyCell<sync::Packet<T>>>,
376+
inner: Arc<UnsafeCell<sync::Packet<T>>>,
376377
// can't share in an arc
377378
_marker: marker::NoSync,
378379
}
@@ -382,11 +383,13 @@ pub struct SyncSender<T> {
382383
#[stable]
383384
#[cfg(not(stage0))] // NOTE remove cfg after next snapshot
384385
pub struct SyncSender<T> {
385-
inner: Arc<RacyCell<sync::Packet<T>>>,
386+
inner: Arc<UnsafeCell<sync::Packet<T>>>,
386387
}
387388

389+
unsafe impl<T:Send> Send for SyncSender<T> {}
390+
388391
#[cfg(not(stage0))] // NOTE remove cfg after next snapshot
389-
impl<T> !marker::Sync for SyncSender<T> {}
392+
impl<T> !Sync for SyncSender<T> {}
390393

391394
/// An error returned from the `send` function on channels.
392395
///
@@ -442,10 +445,10 @@ pub enum TrySendError<T> {
442445
}
443446

444447
enum Flavor<T> {
445-
Oneshot(Arc<RacyCell<oneshot::Packet<T>>>),
446-
Stream(Arc<RacyCell<stream::Packet<T>>>),
447-
Shared(Arc<RacyCell<shared::Packet<T>>>),
448-
Sync(Arc<RacyCell<sync::Packet<T>>>),
448+
Oneshot(Arc<UnsafeCell<oneshot::Packet<T>>>),
449+
Stream(Arc<UnsafeCell<stream::Packet<T>>>),
450+
Shared(Arc<UnsafeCell<shared::Packet<T>>>),
451+
Sync(Arc<UnsafeCell<sync::Packet<T>>>),
449452
}
450453

451454
#[doc(hidden)]
@@ -497,7 +500,7 @@ impl<T> UnsafeFlavor<T> for Receiver<T> {
497500
/// ```
498501
#[stable]
499502
pub fn channel<T: Send>() -> (Sender<T>, Receiver<T>) {
500-
let a = Arc::new(RacyCell::new(oneshot::Packet::new()));
503+
let a = Arc::new(UnsafeCell::new(oneshot::Packet::new()));
501504
(Sender::new(Flavor::Oneshot(a.clone())), Receiver::new(Flavor::Oneshot(a)))
502505
}
503506

@@ -537,7 +540,7 @@ pub fn channel<T: Send>() -> (Sender<T>, Receiver<T>) {
537540
/// ```
538541
#[stable]
539542
pub fn sync_channel<T: Send>(bound: uint) -> (SyncSender<T>, Receiver<T>) {
540-
let a = Arc::new(RacyCell::new(sync::Packet::new(bound)));
543+
let a = Arc::new(UnsafeCell::new(sync::Packet::new(bound)));
541544
(SyncSender::new(a.clone()), Receiver::new(Flavor::Sync(a)))
542545
}
543546

@@ -589,7 +592,7 @@ impl<T: Send> Sender<T> {
589592
return (*p).send(t).map_err(SendError);
590593
} else {
591594
let a =
592-
Arc::new(RacyCell::new(stream::Packet::new()));
595+
Arc::new(UnsafeCell::new(stream::Packet::new()));
593596
let rx = Receiver::new(Flavor::Stream(a.clone()));
594597
match (*p).upgrade(rx) {
595598
oneshot::UpSuccess => {
@@ -631,7 +634,7 @@ impl<T: Send> Clone for Sender<T> {
631634
fn clone(&self) -> Sender<T> {
632635
let (packet, sleeper, guard) = match *unsafe { self.inner() } {
633636
Flavor::Oneshot(ref p) => {
634-
let a = Arc::new(RacyCell::new(shared::Packet::new()));
637+
let a = Arc::new(UnsafeCell::new(shared::Packet::new()));
635638
unsafe {
636639
let guard = (*a.get()).postinit_lock();
637640
let rx = Receiver::new(Flavor::Shared(a.clone()));
@@ -643,7 +646,7 @@ impl<T: Send> Clone for Sender<T> {
643646
}
644647
}
645648
Flavor::Stream(ref p) => {
646-
let a = Arc::new(RacyCell::new(shared::Packet::new()));
649+
let a = Arc::new(UnsafeCell::new(shared::Packet::new()));
647650
unsafe {
648651
let guard = (*a.get()).postinit_lock();
649652
let rx = Receiver::new(Flavor::Shared(a.clone()));
@@ -690,12 +693,12 @@ impl<T: Send> Drop for Sender<T> {
690693

691694
impl<T: Send> SyncSender<T> {
692695
#[cfg(stage0)] // NOTE remove impl after next snapshot
693-
fn new(inner: Arc<RacyCell<sync::Packet<T>>>) -> SyncSender<T> {
696+
fn new(inner: Arc<UnsafeCell<sync::Packet<T>>>) -> SyncSender<T> {
694697
SyncSender { inner: inner, _marker: marker::NoSync }
695698
}
696699

697700
#[cfg(not(stage0))] // NOTE remove cfg after next snapshot
698-
fn new(inner: Arc<RacyCell<sync::Packet<T>>>) -> SyncSender<T> {
701+
fn new(inner: Arc<UnsafeCell<sync::Packet<T>>>) -> SyncSender<T> {
699702
SyncSender { inner: inner }
700703
}
701704

@@ -978,26 +981,6 @@ impl<T: Send> Drop for Receiver<T> {
978981
}
979982
}
980983

981-
/// A version of `UnsafeCell` intended for use in concurrent data
982-
/// structures (for example, you might put it in an `Arc`).
983-
struct RacyCell<T>(pub UnsafeCell<T>);
984-
985-
impl<T> RacyCell<T> {
986-
987-
fn new(value: T) -> RacyCell<T> {
988-
RacyCell(UnsafeCell { value: value })
989-
}
990-
991-
unsafe fn get(&self) -> *mut T {
992-
self.0.get()
993-
}
994-
995-
}
996-
997-
unsafe impl<T:Send> Send for RacyCell<T> { }
998-
999-
unsafe impl<T> Sync for RacyCell<T> { } // Oh dear
1000-
1001984
impl<T> fmt::Show for SendError<T> {
1002985
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1003986
"sending on a closed channel".fmt(f)

0 commit comments

Comments
 (0)