181
181
// senders. Under the hood, however, there are actually three flavors of
182
182
// channels in play.
183
183
//
184
- // * Oneshots - these channels are highly optimized for the one-send use case.
184
+ // * Flavor:: Oneshots - these channels are highly optimized for the one-send use case.
185
185
// They contain as few atomics as possible and involve one and
186
186
// exactly one allocation.
187
187
// * Streams - these channels are optimized for the non-shared use case. They
@@ -316,7 +316,6 @@ use core::prelude::*;
316
316
317
317
pub use self :: TryRecvError :: * ;
318
318
pub use self :: TrySendError :: * ;
319
- use self :: Flavor :: * ;
320
319
321
320
use alloc:: arc:: Arc ;
322
321
use core:: kinds;
@@ -478,7 +477,7 @@ impl<T> UnsafeFlavor<T> for Receiver<T> {
478
477
#[ unstable]
479
478
pub fn channel < T : Send > ( ) -> ( Sender < T > , Receiver < T > ) {
480
479
let a = Arc :: new ( RacyCell :: new ( oneshot:: Packet :: new ( ) ) ) ;
481
- ( Sender :: new ( Oneshot ( a. clone ( ) ) ) , Receiver :: new ( Oneshot ( a) ) )
480
+ ( Sender :: new ( Flavor :: Oneshot ( a. clone ( ) ) ) , Receiver :: new ( Flavor :: Oneshot ( a) ) )
482
481
}
483
482
484
483
/// Creates a new synchronous, bounded channel.
@@ -518,7 +517,7 @@ pub fn channel<T: Send>() -> (Sender<T>, Receiver<T>) {
518
517
of channel that is is creating"]
519
518
pub fn sync_channel < T : Send > ( bound : uint ) -> ( SyncSender < T > , Receiver < T > ) {
520
519
let a = Arc :: new ( RacyCell :: new ( sync:: Packet :: new ( bound) ) ) ;
521
- ( SyncSender :: new ( a. clone ( ) ) , Receiver :: new ( Sync ( a) ) )
520
+ ( SyncSender :: new ( a. clone ( ) ) , Receiver :: new ( Flavor :: Sync ( a) ) )
522
521
}
523
522
524
523
////////////////////////////////////////////////////////////////////////////////
@@ -592,15 +591,15 @@ impl<T: Send> Sender<T> {
592
591
#[ unstable = "this function may be renamed to send() in the future" ]
593
592
pub fn send_opt ( & self , t : T ) -> Result < ( ) , T > {
594
593
let ( new_inner, ret) = match * unsafe { self . inner ( ) } {
595
- Oneshot ( ref p) => {
594
+ Flavor :: Oneshot ( ref p) => {
596
595
unsafe {
597
596
let p = p. get ( ) ;
598
597
if !( * p) . sent ( ) {
599
598
return ( * p) . send ( t) ;
600
599
} else {
601
600
let a =
602
601
Arc :: new ( RacyCell :: new ( stream:: Packet :: new ( ) ) ) ;
603
- match ( * p) . upgrade ( Receiver :: new ( Stream ( a. clone ( ) ) ) ) {
602
+ match ( * p) . upgrade ( Receiver :: new ( Flavor :: Stream ( a. clone ( ) ) ) ) {
604
603
oneshot:: UpSuccess => {
605
604
let ret = ( * a. get ( ) ) . send ( t) ;
606
605
( a, ret)
@@ -618,13 +617,13 @@ impl<T: Send> Sender<T> {
618
617
}
619
618
}
620
619
}
621
- Stream ( ref p) => return unsafe { ( * p. get ( ) ) . send ( t) } ,
622
- Shared ( ref p) => return unsafe { ( * p. get ( ) ) . send ( t) } ,
623
- Sync ( ..) => unreachable ! ( ) ,
620
+ Flavor :: Stream ( ref p) => return unsafe { ( * p. get ( ) ) . send ( t) } ,
621
+ Flavor :: Shared ( ref p) => return unsafe { ( * p. get ( ) ) . send ( t) } ,
622
+ Flavor :: Sync ( ..) => unreachable ! ( ) ,
624
623
} ;
625
624
626
625
unsafe {
627
- let tmp = Sender :: new ( Stream ( new_inner) ) ;
626
+ let tmp = Sender :: new ( Flavor :: Stream ( new_inner) ) ;
628
627
mem:: swap ( self . inner_mut ( ) , tmp. inner_mut ( ) ) ;
629
628
}
630
629
return ret;
@@ -635,53 +634,53 @@ impl<T: Send> Sender<T> {
635
634
impl < T : Send > Clone for Sender < T > {
636
635
fn clone ( & self ) -> Sender < T > {
637
636
let ( packet, sleeper, guard) = match * unsafe { self . inner ( ) } {
638
- Oneshot ( ref p) => {
637
+ Flavor :: Oneshot ( ref p) => {
639
638
let a = Arc :: new ( RacyCell :: new ( shared:: Packet :: new ( ) ) ) ;
640
639
unsafe {
641
640
let guard = ( * a. get ( ) ) . postinit_lock ( ) ;
642
- match ( * p. get ( ) ) . upgrade ( Receiver :: new ( Shared ( a. clone ( ) ) ) ) {
641
+ match ( * p. get ( ) ) . upgrade ( Receiver :: new ( Flavor :: Shared ( a. clone ( ) ) ) ) {
643
642
oneshot:: UpSuccess |
644
643
oneshot:: UpDisconnected => ( a, None , guard) ,
645
644
oneshot:: UpWoke ( task) => ( a, Some ( task) , guard)
646
645
}
647
646
}
648
647
}
649
- Stream ( ref p) => {
648
+ Flavor :: Stream ( ref p) => {
650
649
let a = Arc :: new ( RacyCell :: new ( shared:: Packet :: new ( ) ) ) ;
651
650
unsafe {
652
651
let guard = ( * a. get ( ) ) . postinit_lock ( ) ;
653
- match ( * p. get ( ) ) . upgrade ( Receiver :: new ( Shared ( a. clone ( ) ) ) ) {
652
+ match ( * p. get ( ) ) . upgrade ( Receiver :: new ( Flavor :: Shared ( a. clone ( ) ) ) ) {
654
653
stream:: UpSuccess |
655
654
stream:: UpDisconnected => ( a, None , guard) ,
656
655
stream:: UpWoke ( task) => ( a, Some ( task) , guard) ,
657
656
}
658
657
}
659
658
}
660
- Shared ( ref p) => {
659
+ Flavor :: Shared ( ref p) => {
661
660
unsafe { ( * p. get ( ) ) . clone_chan ( ) ; }
662
- return Sender :: new ( Shared ( p. clone ( ) ) ) ;
661
+ return Sender :: new ( Flavor :: Shared ( p. clone ( ) ) ) ;
663
662
}
664
- Sync ( ..) => unreachable ! ( ) ,
663
+ Flavor :: Sync ( ..) => unreachable ! ( ) ,
665
664
} ;
666
665
667
666
unsafe {
668
667
( * packet. get ( ) ) . inherit_blocker ( sleeper, guard) ;
669
668
670
- let tmp = Sender :: new ( Shared ( packet. clone ( ) ) ) ;
669
+ let tmp = Sender :: new ( Flavor :: Shared ( packet. clone ( ) ) ) ;
671
670
mem:: swap ( self . inner_mut ( ) , tmp. inner_mut ( ) ) ;
672
671
}
673
- Sender :: new ( Shared ( packet) )
672
+ Sender :: new ( Flavor :: Shared ( packet) )
674
673
}
675
674
}
676
675
677
676
#[ unsafe_destructor]
678
677
impl < T : Send > Drop for Sender < T > {
679
678
fn drop ( & mut self ) {
680
679
match * unsafe { self . inner_mut ( ) } {
681
- Oneshot ( ref mut p) => unsafe { ( * p. get ( ) ) . drop_chan ( ) ; } ,
682
- Stream ( ref mut p) => unsafe { ( * p. get ( ) ) . drop_chan ( ) ; } ,
683
- Shared ( ref mut p) => unsafe { ( * p. get ( ) ) . drop_chan ( ) ; } ,
684
- Sync ( ..) => unreachable ! ( ) ,
680
+ Flavor :: Oneshot ( ref mut p) => unsafe { ( * p. get ( ) ) . drop_chan ( ) ; } ,
681
+ Flavor :: Stream ( ref mut p) => unsafe { ( * p. get ( ) ) . drop_chan ( ) ; } ,
682
+ Flavor :: Shared ( ref mut p) => unsafe { ( * p. get ( ) ) . drop_chan ( ) ; } ,
683
+ Flavor :: Sync ( ..) => unreachable ! ( ) ,
685
684
}
686
685
}
687
686
}
@@ -827,30 +826,30 @@ impl<T: Send> Receiver<T> {
827
826
pub fn try_recv ( & self ) -> Result < T , TryRecvError > {
828
827
loop {
829
828
let new_port = match * unsafe { self . inner ( ) } {
830
- Oneshot ( ref p) => {
829
+ Flavor :: Oneshot ( ref p) => {
831
830
match unsafe { ( * p. get ( ) ) . try_recv ( ) } {
832
831
Ok ( t) => return Ok ( t) ,
833
832
Err ( oneshot:: Empty ) => return Err ( Empty ) ,
834
833
Err ( oneshot:: Disconnected ) => return Err ( Disconnected ) ,
835
834
Err ( oneshot:: Upgraded ( rx) ) => rx,
836
835
}
837
836
}
838
- Stream ( ref p) => {
837
+ Flavor :: Stream ( ref p) => {
839
838
match unsafe { ( * p. get ( ) ) . try_recv ( ) } {
840
839
Ok ( t) => return Ok ( t) ,
841
840
Err ( stream:: Empty ) => return Err ( Empty ) ,
842
841
Err ( stream:: Disconnected ) => return Err ( Disconnected ) ,
843
842
Err ( stream:: Upgraded ( rx) ) => rx,
844
843
}
845
844
}
846
- Shared ( ref p) => {
845
+ Flavor :: Shared ( ref p) => {
847
846
match unsafe { ( * p. get ( ) ) . try_recv ( ) } {
848
847
Ok ( t) => return Ok ( t) ,
849
848
Err ( shared:: Empty ) => return Err ( Empty ) ,
850
849
Err ( shared:: Disconnected ) => return Err ( Disconnected ) ,
851
850
}
852
851
}
853
- Sync ( ref p) => {
852
+ Flavor :: Sync ( ref p) => {
854
853
match unsafe { ( * p. get ( ) ) . try_recv ( ) } {
855
854
Ok ( t) => return Ok ( t) ,
856
855
Err ( sync:: Empty ) => return Err ( Empty ) ,
@@ -881,30 +880,30 @@ impl<T: Send> Receiver<T> {
881
880
pub fn recv_opt ( & self ) -> Result < T , ( ) > {
882
881
loop {
883
882
let new_port = match * unsafe { self . inner ( ) } {
884
- Oneshot ( ref p) => {
883
+ Flavor :: Oneshot ( ref p) => {
885
884
match unsafe { ( * p. get ( ) ) . recv ( ) } {
886
885
Ok ( t) => return Ok ( t) ,
887
886
Err ( oneshot:: Empty ) => return unreachable ! ( ) ,
888
887
Err ( oneshot:: Disconnected ) => return Err ( ( ) ) ,
889
888
Err ( oneshot:: Upgraded ( rx) ) => rx,
890
889
}
891
890
}
892
- Stream ( ref p) => {
891
+ Flavor :: Stream ( ref p) => {
893
892
match unsafe { ( * p. get ( ) ) . recv ( ) } {
894
893
Ok ( t) => return Ok ( t) ,
895
894
Err ( stream:: Empty ) => return unreachable ! ( ) ,
896
895
Err ( stream:: Disconnected ) => return Err ( ( ) ) ,
897
896
Err ( stream:: Upgraded ( rx) ) => rx,
898
897
}
899
898
}
900
- Shared ( ref p) => {
899
+ Flavor :: Shared ( ref p) => {
901
900
match unsafe { ( * p. get ( ) ) . recv ( ) } {
902
901
Ok ( t) => return Ok ( t) ,
903
902
Err ( shared:: Empty ) => return unreachable ! ( ) ,
904
903
Err ( shared:: Disconnected ) => return Err ( ( ) ) ,
905
904
}
906
905
}
907
- Sync ( ref p) => return unsafe { ( * p. get ( ) ) . recv ( ) }
906
+ Flavor :: Sync ( ref p) => return unsafe { ( * p. get ( ) ) . recv ( ) }
908
907
} ;
909
908
unsafe {
910
909
mem:: swap ( self . inner_mut ( ) , new_port. inner_mut ( ) ) ;
@@ -924,22 +923,22 @@ impl<T: Send> select::Packet for Receiver<T> {
924
923
fn can_recv ( & self ) -> bool {
925
924
loop {
926
925
let new_port = match * unsafe { self . inner ( ) } {
927
- Oneshot ( ref p) => {
926
+ Flavor :: Oneshot ( ref p) => {
928
927
match unsafe { ( * p. get ( ) ) . can_recv ( ) } {
929
928
Ok ( ret) => return ret,
930
929
Err ( upgrade) => upgrade,
931
930
}
932
931
}
933
- Stream ( ref p) => {
932
+ Flavor :: Stream ( ref p) => {
934
933
match unsafe { ( * p. get ( ) ) . can_recv ( ) } {
935
934
Ok ( ret) => return ret,
936
935
Err ( upgrade) => upgrade,
937
936
}
938
937
}
939
- Shared ( ref p) => {
938
+ Flavor :: Shared ( ref p) => {
940
939
return unsafe { ( * p. get ( ) ) . can_recv ( ) } ;
941
940
}
942
- Sync ( ref p) => {
941
+ Flavor :: Sync ( ref p) => {
943
942
return unsafe { ( * p. get ( ) ) . can_recv ( ) } ;
944
943
}
945
944
} ;
@@ -953,24 +952,24 @@ impl<T: Send> select::Packet for Receiver<T> {
953
952
fn start_selection ( & self , mut token : SignalToken ) -> StartResult {
954
953
loop {
955
954
let ( t, new_port) = match * unsafe { self . inner ( ) } {
956
- Oneshot ( ref p) => {
955
+ Flavor :: Oneshot ( ref p) => {
957
956
match unsafe { ( * p. get ( ) ) . start_selection ( token) } {
958
957
oneshot:: SelSuccess => return Installed ,
959
958
oneshot:: SelCanceled => return Abort ,
960
959
oneshot:: SelUpgraded ( t, rx) => ( t, rx) ,
961
960
}
962
961
}
963
- Stream ( ref p) => {
962
+ Flavor :: Stream ( ref p) => {
964
963
match unsafe { ( * p. get ( ) ) . start_selection ( token) } {
965
964
stream:: SelSuccess => return Installed ,
966
965
stream:: SelCanceled => return Abort ,
967
966
stream:: SelUpgraded ( t, rx) => ( t, rx) ,
968
967
}
969
968
}
970
- Shared ( ref p) => {
969
+ Flavor :: Shared ( ref p) => {
971
970
return unsafe { ( * p. get ( ) ) . start_selection ( token) } ;
972
971
}
973
- Sync ( ref p) => {
972
+ Flavor :: Sync ( ref p) => {
974
973
return unsafe { ( * p. get ( ) ) . start_selection ( token) } ;
975
974
}
976
975
} ;
@@ -985,14 +984,14 @@ impl<T: Send> select::Packet for Receiver<T> {
985
984
let mut was_upgrade = false ;
986
985
loop {
987
986
let result = match * unsafe { self . inner ( ) } {
988
- Oneshot ( ref p) => unsafe { ( * p. get ( ) ) . abort_selection ( ) } ,
989
- Stream ( ref p) => unsafe {
987
+ Flavor :: Oneshot ( ref p) => unsafe { ( * p. get ( ) ) . abort_selection ( ) } ,
988
+ Flavor :: Stream ( ref p) => unsafe {
990
989
( * p. get ( ) ) . abort_selection ( was_upgrade)
991
990
} ,
992
- Shared ( ref p) => return unsafe {
991
+ Flavor :: Shared ( ref p) => return unsafe {
993
992
( * p. get ( ) ) . abort_selection ( was_upgrade)
994
993
} ,
995
- Sync ( ref p) => return unsafe {
994
+ Flavor :: Sync ( ref p) => return unsafe {
996
995
( * p. get ( ) ) . abort_selection ( )
997
996
} ,
998
997
} ;
@@ -1015,10 +1014,10 @@ impl<'a, T: Send> Iterator<T> for Messages<'a, T> {
1015
1014
impl < T : Send > Drop for Receiver < T > {
1016
1015
fn drop ( & mut self ) {
1017
1016
match * unsafe { self . inner_mut ( ) } {
1018
- Oneshot ( ref mut p) => unsafe { ( * p. get ( ) ) . drop_port ( ) ; } ,
1019
- Stream ( ref mut p) => unsafe { ( * p. get ( ) ) . drop_port ( ) ; } ,
1020
- Shared ( ref mut p) => unsafe { ( * p. get ( ) ) . drop_port ( ) ; } ,
1021
- Sync ( ref mut p) => unsafe { ( * p. get ( ) ) . drop_port ( ) ; } ,
1017
+ Flavor :: Oneshot ( ref mut p) => unsafe { ( * p. get ( ) ) . drop_port ( ) ; } ,
1018
+ Flavor :: Stream ( ref mut p) => unsafe { ( * p. get ( ) ) . drop_port ( ) ; } ,
1019
+ Flavor :: Shared ( ref mut p) => unsafe { ( * p. get ( ) ) . drop_port ( ) ; } ,
1020
+ Flavor :: Sync ( ref mut p) => unsafe { ( * p. get ( ) ) . drop_port ( ) ; } ,
1022
1021
}
1023
1022
}
1024
1023
}
0 commit comments