Skip to content

Commit 2783807

Browse files
committed
rollup merge of #21438: taralx/kill-racycell
Conflicts: src/libstd/sync/mpsc/mod.rs
2 parents 04a2255 + b6380f5 commit 2783807

File tree

1 file changed

+15
-33
lines changed

1 file changed

+15
-33
lines changed

src/libstd/sync/mpsc/mod.rs

Lines changed: 15 additions & 33 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;
@@ -371,10 +372,12 @@ unsafe impl<T:Send> Send for Sender<T> { }
371372
/// owned by one task, but it can be cloned to send to other tasks.
372373
#[stable]
373374
pub struct SyncSender<T> {
374-
inner: Arc<RacyCell<sync::Packet<T>>>,
375+
inner: Arc<UnsafeCell<sync::Packet<T>>>,
375376
}
376377

377-
impl<T> !marker::Sync for SyncSender<T> {}
378+
unsafe impl<T:Send> Send for SyncSender<T> {}
379+
380+
impl<T> !Sync for SyncSender<T> {}
378381

379382
/// An error returned from the `send` function on channels.
380383
///
@@ -430,10 +433,10 @@ pub enum TrySendError<T> {
430433
}
431434

432435
enum Flavor<T> {
433-
Oneshot(Arc<RacyCell<oneshot::Packet<T>>>),
434-
Stream(Arc<RacyCell<stream::Packet<T>>>),
435-
Shared(Arc<RacyCell<shared::Packet<T>>>),
436-
Sync(Arc<RacyCell<sync::Packet<T>>>),
436+
Oneshot(Arc<UnsafeCell<oneshot::Packet<T>>>),
437+
Stream(Arc<UnsafeCell<stream::Packet<T>>>),
438+
Shared(Arc<UnsafeCell<shared::Packet<T>>>),
439+
Sync(Arc<UnsafeCell<sync::Packet<T>>>),
437440
}
438441

439442
#[doc(hidden)]
@@ -485,7 +488,7 @@ impl<T> UnsafeFlavor<T> for Receiver<T> {
485488
/// ```
486489
#[stable]
487490
pub fn channel<T: Send>() -> (Sender<T>, Receiver<T>) {
488-
let a = Arc::new(RacyCell::new(oneshot::Packet::new()));
491+
let a = Arc::new(UnsafeCell::new(oneshot::Packet::new()));
489492
(Sender::new(Flavor::Oneshot(a.clone())), Receiver::new(Flavor::Oneshot(a)))
490493
}
491494

@@ -525,7 +528,7 @@ pub fn channel<T: Send>() -> (Sender<T>, Receiver<T>) {
525528
/// ```
526529
#[stable]
527530
pub fn sync_channel<T: Send>(bound: uint) -> (SyncSender<T>, Receiver<T>) {
528-
let a = Arc::new(RacyCell::new(sync::Packet::new(bound)));
531+
let a = Arc::new(UnsafeCell::new(sync::Packet::new(bound)));
529532
(SyncSender::new(a.clone()), Receiver::new(Flavor::Sync(a)))
530533
}
531534

@@ -577,7 +580,7 @@ impl<T: Send> Sender<T> {
577580
return (*p).send(t).map_err(SendError);
578581
} else {
579582
let a =
580-
Arc::new(RacyCell::new(stream::Packet::new()));
583+
Arc::new(UnsafeCell::new(stream::Packet::new()));
581584
let rx = Receiver::new(Flavor::Stream(a.clone()));
582585
match (*p).upgrade(rx) {
583586
oneshot::UpSuccess => {
@@ -619,7 +622,7 @@ impl<T: Send> Clone for Sender<T> {
619622
fn clone(&self) -> Sender<T> {
620623
let (packet, sleeper, guard) = match *unsafe { self.inner() } {
621624
Flavor::Oneshot(ref p) => {
622-
let a = Arc::new(RacyCell::new(shared::Packet::new()));
625+
let a = Arc::new(UnsafeCell::new(shared::Packet::new()));
623626
unsafe {
624627
let guard = (*a.get()).postinit_lock();
625628
let rx = Receiver::new(Flavor::Shared(a.clone()));
@@ -631,7 +634,7 @@ impl<T: Send> Clone for Sender<T> {
631634
}
632635
}
633636
Flavor::Stream(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()));
@@ -677,8 +680,7 @@ impl<T: Send> Drop for Sender<T> {
677680
////////////////////////////////////////////////////////////////////////////////
678681

679682
impl<T: Send> SyncSender<T> {
680-
681-
fn new(inner: Arc<RacyCell<sync::Packet<T>>>) -> SyncSender<T> {
683+
fn new(inner: Arc<UnsafeCell<sync::Packet<T>>>) -> SyncSender<T> {
682684
SyncSender { inner: inner }
683685
}
684686

@@ -961,26 +963,6 @@ impl<T: Send> Drop for Receiver<T> {
961963
}
962964
}
963965

964-
/// A version of `UnsafeCell` intended for use in concurrent data
965-
/// structures (for example, you might put it in an `Arc`).
966-
struct RacyCell<T>(pub UnsafeCell<T>);
967-
968-
impl<T> RacyCell<T> {
969-
970-
fn new(value: T) -> RacyCell<T> {
971-
RacyCell(UnsafeCell { value: value })
972-
}
973-
974-
unsafe fn get(&self) -> *mut T {
975-
self.0.get()
976-
}
977-
978-
}
979-
980-
unsafe impl<T:Send> Send for RacyCell<T> { }
981-
982-
unsafe impl<T> Sync for RacyCell<T> { } // Oh dear
983-
984966
impl<T> fmt::Show for SendError<T> {
985967
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
986968
"sending on a closed channel".fmt(f)

0 commit comments

Comments
 (0)