@@ -319,6 +319,7 @@ use prelude::v1::*;
319
319
320
320
use sync:: Arc ;
321
321
use fmt;
322
+ #[ cfg( stage0) ] // NOTE remove use after next snapshot
322
323
use marker;
323
324
use mem;
324
325
use cell:: UnsafeCell ;
@@ -371,10 +372,12 @@ unsafe impl<T:Send> Send for Sender<T> { }
371
372
/// owned by one task, but it can be cloned to send to other tasks.
372
373
#[ stable]
373
374
pub struct SyncSender < T > {
374
- inner : Arc < RacyCell < sync:: Packet < T > > > ,
375
+ inner : Arc < UnsafeCell < sync:: Packet < T > > > ,
375
376
}
376
377
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 > { }
378
381
379
382
/// An error returned from the `send` function on channels.
380
383
///
@@ -430,10 +433,10 @@ pub enum TrySendError<T> {
430
433
}
431
434
432
435
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 > > > ) ,
437
440
}
438
441
439
442
#[ doc( hidden) ]
@@ -485,7 +488,7 @@ impl<T> UnsafeFlavor<T> for Receiver<T> {
485
488
/// ```
486
489
#[ stable]
487
490
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 ( ) ) ) ;
489
492
( Sender :: new ( Flavor :: Oneshot ( a. clone ( ) ) ) , Receiver :: new ( Flavor :: Oneshot ( a) ) )
490
493
}
491
494
@@ -525,7 +528,7 @@ pub fn channel<T: Send>() -> (Sender<T>, Receiver<T>) {
525
528
/// ```
526
529
#[ stable]
527
530
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) ) ) ;
529
532
( SyncSender :: new ( a. clone ( ) ) , Receiver :: new ( Flavor :: Sync ( a) ) )
530
533
}
531
534
@@ -577,7 +580,7 @@ impl<T: Send> Sender<T> {
577
580
return ( * p) . send ( t) . map_err ( SendError ) ;
578
581
} else {
579
582
let a =
580
- Arc :: new ( RacyCell :: new ( stream:: Packet :: new ( ) ) ) ;
583
+ Arc :: new ( UnsafeCell :: new ( stream:: Packet :: new ( ) ) ) ;
581
584
let rx = Receiver :: new ( Flavor :: Stream ( a. clone ( ) ) ) ;
582
585
match ( * p) . upgrade ( rx) {
583
586
oneshot:: UpSuccess => {
@@ -619,7 +622,7 @@ impl<T: Send> Clone for Sender<T> {
619
622
fn clone ( & self ) -> Sender < T > {
620
623
let ( packet, sleeper, guard) = match * unsafe { self . inner ( ) } {
621
624
Flavor :: Oneshot ( ref p) => {
622
- let a = Arc :: new ( RacyCell :: new ( shared:: Packet :: new ( ) ) ) ;
625
+ let a = Arc :: new ( UnsafeCell :: new ( shared:: Packet :: new ( ) ) ) ;
623
626
unsafe {
624
627
let guard = ( * a. get ( ) ) . postinit_lock ( ) ;
625
628
let rx = Receiver :: new ( Flavor :: Shared ( a. clone ( ) ) ) ;
@@ -631,7 +634,7 @@ impl<T: Send> Clone for Sender<T> {
631
634
}
632
635
}
633
636
Flavor :: Stream ( ref p) => {
634
- let a = Arc :: new ( RacyCell :: new ( shared:: Packet :: new ( ) ) ) ;
637
+ let a = Arc :: new ( UnsafeCell :: new ( shared:: Packet :: new ( ) ) ) ;
635
638
unsafe {
636
639
let guard = ( * a. get ( ) ) . postinit_lock ( ) ;
637
640
let rx = Receiver :: new ( Flavor :: Shared ( a. clone ( ) ) ) ;
@@ -677,8 +680,7 @@ impl<T: Send> Drop for Sender<T> {
677
680
////////////////////////////////////////////////////////////////////////////////
678
681
679
682
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 > {
682
684
SyncSender { inner : inner }
683
685
}
684
686
@@ -961,26 +963,6 @@ impl<T: Send> Drop for Receiver<T> {
961
963
}
962
964
}
963
965
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
-
984
966
impl < T > fmt:: Show for SendError < T > {
985
967
fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
986
968
"sending on a closed channel" . fmt ( f)
0 commit comments