@@ -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 ;
@@ -372,7 +373,7 @@ unsafe impl<T:Send> Send for Sender<T> { }
372
373
#[ stable]
373
374
#[ cfg( stage0) ] // NOTE remove impl after next snapshot
374
375
pub struct SyncSender < T > {
375
- inner : Arc < RacyCell < sync:: Packet < T > > > ,
376
+ inner : Arc < UnsafeCell < sync:: Packet < T > > > ,
376
377
// can't share in an arc
377
378
_marker : marker:: NoSync ,
378
379
}
@@ -382,11 +383,13 @@ pub struct SyncSender<T> {
382
383
#[ stable]
383
384
#[ cfg( not( stage0) ) ] // NOTE remove cfg after next snapshot
384
385
pub struct SyncSender < T > {
385
- inner : Arc < RacyCell < sync:: Packet < T > > > ,
386
+ inner : Arc < UnsafeCell < sync:: Packet < T > > > ,
386
387
}
387
388
389
+ unsafe impl < T : Send > Send for SyncSender < T > { }
390
+
388
391
#[ cfg( not( stage0) ) ] // NOTE remove cfg after next snapshot
389
- impl < T > !marker :: Sync for SyncSender < T > { }
392
+ impl < T > !Sync for SyncSender < T > { }
390
393
391
394
/// An error returned from the `send` function on channels.
392
395
///
@@ -442,10 +445,10 @@ pub enum TrySendError<T> {
442
445
}
443
446
444
447
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 > > > ) ,
449
452
}
450
453
451
454
#[ doc( hidden) ]
@@ -497,7 +500,7 @@ impl<T> UnsafeFlavor<T> for Receiver<T> {
497
500
/// ```
498
501
#[ stable]
499
502
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 ( ) ) ) ;
501
504
( Sender :: new ( Flavor :: Oneshot ( a. clone ( ) ) ) , Receiver :: new ( Flavor :: Oneshot ( a) ) )
502
505
}
503
506
@@ -537,7 +540,7 @@ pub fn channel<T: Send>() -> (Sender<T>, Receiver<T>) {
537
540
/// ```
538
541
#[ stable]
539
542
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) ) ) ;
541
544
( SyncSender :: new ( a. clone ( ) ) , Receiver :: new ( Flavor :: Sync ( a) ) )
542
545
}
543
546
@@ -589,7 +592,7 @@ impl<T: Send> Sender<T> {
589
592
return ( * p) . send ( t) . map_err ( SendError ) ;
590
593
} else {
591
594
let a =
592
- Arc :: new ( RacyCell :: new ( stream:: Packet :: new ( ) ) ) ;
595
+ Arc :: new ( UnsafeCell :: new ( stream:: Packet :: new ( ) ) ) ;
593
596
let rx = Receiver :: new ( Flavor :: Stream ( a. clone ( ) ) ) ;
594
597
match ( * p) . upgrade ( rx) {
595
598
oneshot:: UpSuccess => {
@@ -631,7 +634,7 @@ impl<T: Send> Clone for Sender<T> {
631
634
fn clone ( & self ) -> Sender < T > {
632
635
let ( packet, sleeper, guard) = match * unsafe { self . inner ( ) } {
633
636
Flavor :: Oneshot ( 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 ( ) ) ) ;
@@ -643,7 +646,7 @@ impl<T: Send> Clone for Sender<T> {
643
646
}
644
647
}
645
648
Flavor :: Stream ( ref p) => {
646
- let a = Arc :: new ( RacyCell :: new ( shared:: Packet :: new ( ) ) ) ;
649
+ let a = Arc :: new ( UnsafeCell :: new ( shared:: Packet :: new ( ) ) ) ;
647
650
unsafe {
648
651
let guard = ( * a. get ( ) ) . postinit_lock ( ) ;
649
652
let rx = Receiver :: new ( Flavor :: Shared ( a. clone ( ) ) ) ;
@@ -690,12 +693,12 @@ impl<T: Send> Drop for Sender<T> {
690
693
691
694
impl < T : Send > SyncSender < T > {
692
695
#[ 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 > {
694
697
SyncSender { inner : inner, _marker : marker:: NoSync }
695
698
}
696
699
697
700
#[ 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 > {
699
702
SyncSender { inner : inner }
700
703
}
701
704
@@ -978,26 +981,6 @@ impl<T: Send> Drop for Receiver<T> {
978
981
}
979
982
}
980
983
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
-
1001
984
impl < T > fmt:: Show for SendError < T > {
1002
985
fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
1003
986
"sending on a closed channel" . fmt ( f)
0 commit comments