271
271
// And now that you've seen all the races that I found and attempted to fix,
272
272
// here's the code for you to find some more!
273
273
274
- use cast;
275
274
use cell:: Cell ;
276
275
use clone:: Clone ;
277
276
use iter:: Iterator ;
@@ -284,6 +283,7 @@ use result::{Ok, Err, Result};
284
283
use rt:: local:: Local ;
285
284
use rt:: task:: { Task , BlockedTask } ;
286
285
use sync:: arc:: UnsafeArc ;
286
+ use ty:: Unsafe ;
287
287
288
288
pub use comm:: select:: { Select , Handle } ;
289
289
@@ -325,7 +325,7 @@ static RESCHED_FREQ: int = 256;
325
325
/// The receiving-half of Rust's channel type. This half can only be owned by
326
326
/// one task
327
327
pub struct Receiver < T > {
328
- inner : Flavor < T > ,
328
+ inner : Unsafe < Flavor < T > > ,
329
329
receives : Cell < uint > ,
330
330
// can't share in an arc
331
331
marker : marker:: NoShare ,
@@ -341,7 +341,7 @@ pub struct Messages<'a, T> {
341
341
/// The sending-half of Rust's asynchronous channel type. This half can only be
342
342
/// owned by one task, but it can be cloned to send to other tasks.
343
343
pub struct Sender < T > {
344
- inner : Flavor < T > ,
344
+ inner : Unsafe < Flavor < T > > ,
345
345
sends : Cell < uint > ,
346
346
// can't share in an arc
347
347
marker : marker:: NoShare ,
@@ -390,6 +390,27 @@ enum Flavor<T> {
390
390
Sync ( UnsafeArc < sync:: Packet < T > > ) ,
391
391
}
392
392
393
+ #[ doc( hidden) ]
394
+ trait UnsafeFlavor < T > {
395
+ fn inner_unsafe < ' a > ( & ' a self ) -> & ' a Unsafe < Flavor < T > > ;
396
+ unsafe fn mut_inner < ' a > ( & ' a self ) -> & ' a mut Flavor < T > {
397
+ & mut * self . inner_unsafe ( ) . get ( )
398
+ }
399
+ unsafe fn inner < ' a > ( & ' a self ) -> & ' a Flavor < T > {
400
+ & * self . inner_unsafe ( ) . get ( )
401
+ }
402
+ }
403
+ impl < T > UnsafeFlavor < T > for Sender < T > {
404
+ fn inner_unsafe < ' a > ( & ' a self ) -> & ' a Unsafe < Flavor < T > > {
405
+ & self . inner
406
+ }
407
+ }
408
+ impl < T > UnsafeFlavor < T > for Receiver < T > {
409
+ fn inner_unsafe < ' a > ( & ' a self ) -> & ' a Unsafe < Flavor < T > > {
410
+ & self . inner
411
+ }
412
+ }
413
+
393
414
/// Creates a new asynchronous channel, returning the sender/receiver halves.
394
415
///
395
416
/// All data sent on the sender will become available on the receiver, and no
@@ -458,7 +479,7 @@ pub fn sync_channel<T: Send>(bound: uint) -> (SyncSender<T>, Receiver<T>) {
458
479
459
480
impl < T : Send > Sender < T > {
460
481
fn new ( inner : Flavor < T > ) -> Sender < T > {
461
- Sender { inner : inner, sends : Cell :: new ( 0 ) , marker : marker:: NoShare }
482
+ Sender { inner : Unsafe :: new ( inner) , sends : Cell :: new ( 0 ) , marker : marker:: NoShare }
462
483
}
463
484
464
485
/// Sends a value along this channel to be received by the corresponding
@@ -532,7 +553,7 @@ impl<T: Send> Sender<T> {
532
553
task. map ( |t| t. maybe_yield ( ) ) ;
533
554
}
534
555
535
- let ( new_inner, ret) = match self . inner {
556
+ let ( new_inner, ret) = match * unsafe { self . inner ( ) } {
536
557
Oneshot ( ref p) => {
537
558
let p = p. get ( ) ;
538
559
unsafe {
@@ -564,16 +585,16 @@ impl<T: Send> Sender<T> {
564
585
} ;
565
586
566
587
unsafe {
567
- let mut tmp = Sender :: new ( Stream ( new_inner) ) ;
568
- mem:: swap ( & mut cast :: transmute_mut ( self ) . inner , & mut tmp. inner ) ;
588
+ let tmp = Sender :: new ( Stream ( new_inner) ) ;
589
+ mem:: swap ( self . mut_inner ( ) , tmp. mut_inner ( ) ) ;
569
590
}
570
591
return ret;
571
592
}
572
593
}
573
594
574
595
impl < T : Send > Clone for Sender < T > {
575
596
fn clone ( & self ) -> Sender < T > {
576
- let ( packet, sleeper) = match self . inner {
597
+ let ( packet, sleeper) = match * unsafe { self . inner ( ) } {
577
598
Oneshot ( ref p) => {
578
599
let ( a, b) = UnsafeArc :: new2 ( shared:: Packet :: new ( ) ) ;
579
600
match unsafe { ( * p. get ( ) ) . upgrade ( Receiver :: new ( Shared ( a) ) ) } {
@@ -598,8 +619,8 @@ impl<T: Send> Clone for Sender<T> {
598
619
unsafe {
599
620
( * packet. get ( ) ) . inherit_blocker ( sleeper) ;
600
621
601
- let mut tmp = Sender :: new ( Shared ( packet. clone ( ) ) ) ;
602
- mem:: swap ( & mut cast :: transmute_mut ( self ) . inner , & mut tmp. inner ) ;
622
+ let tmp = Sender :: new ( Shared ( packet. clone ( ) ) ) ;
623
+ mem:: swap ( self . mut_inner ( ) , tmp. mut_inner ( ) ) ;
603
624
}
604
625
Sender :: new ( Shared ( packet) )
605
626
}
@@ -608,7 +629,7 @@ impl<T: Send> Clone for Sender<T> {
608
629
#[ unsafe_destructor]
609
630
impl < T : Send > Drop for Sender < T > {
610
631
fn drop ( & mut self ) {
611
- match self . inner {
632
+ match * unsafe { self . mut_inner ( ) } {
612
633
Oneshot ( ref mut p) => unsafe { ( * p. get ( ) ) . drop_chan ( ) ; } ,
613
634
Stream ( ref mut p) => unsafe { ( * p. get ( ) ) . drop_chan ( ) ; } ,
614
635
Shared ( ref mut p) => unsafe { ( * p. get ( ) ) . drop_chan ( ) ; } ,
@@ -705,7 +726,7 @@ impl<T: Send> Drop for SyncSender<T> {
705
726
706
727
impl < T : Send > Receiver < T > {
707
728
fn new ( inner : Flavor < T > ) -> Receiver < T > {
708
- Receiver { inner : inner, receives : Cell :: new ( 0 ) , marker : marker:: NoShare }
729
+ Receiver { inner : Unsafe :: new ( inner) , receives : Cell :: new ( 0 ) , marker : marker:: NoShare }
709
730
}
710
731
711
732
/// Blocks waiting for a value on this receiver
@@ -757,7 +778,7 @@ impl<T: Send> Receiver<T> {
757
778
}
758
779
759
780
loop {
760
- let mut new_port = match self . inner {
781
+ let new_port = match * unsafe { self . inner ( ) } {
761
782
Oneshot ( ref p) => {
762
783
match unsafe { ( * p. get ( ) ) . try_recv ( ) } {
763
784
Ok ( t) => return Ok ( t) ,
@@ -790,8 +811,8 @@ impl<T: Send> Receiver<T> {
790
811
}
791
812
} ;
792
813
unsafe {
793
- mem:: swap ( & mut cast :: transmute_mut ( self ) . inner ,
794
- & mut new_port. inner ) ;
814
+ mem:: swap ( self . mut_inner ( ) ,
815
+ new_port. mut_inner ( ) ) ;
795
816
}
796
817
}
797
818
}
@@ -810,7 +831,7 @@ impl<T: Send> Receiver<T> {
810
831
/// the value found on the receiver is returned.
811
832
pub fn recv_opt ( & self ) -> Result < T , ( ) > {
812
833
loop {
813
- let mut new_port = match self . inner {
834
+ let new_port = match * unsafe { self . inner ( ) } {
814
835
Oneshot ( ref p) => {
815
836
match unsafe { ( * p. get ( ) ) . recv ( ) } {
816
837
Ok ( t) => return Ok ( t) ,
@@ -837,8 +858,7 @@ impl<T: Send> Receiver<T> {
837
858
Sync ( ref p) => return unsafe { ( * p. get ( ) ) . recv ( ) }
838
859
} ;
839
860
unsafe {
840
- mem:: swap ( & mut cast:: transmute_mut ( self ) . inner ,
841
- & mut new_port. inner ) ;
861
+ mem:: swap ( self . mut_inner ( ) , new_port. mut_inner ( ) ) ;
842
862
}
843
863
}
844
864
}
@@ -853,7 +873,7 @@ impl<T: Send> Receiver<T> {
853
873
impl < T : Send > select:: Packet for Receiver < T > {
854
874
fn can_recv ( & self ) -> bool {
855
875
loop {
856
- let mut new_port = match self . inner {
876
+ let new_port = match * unsafe { self . inner ( ) } {
857
877
Oneshot ( ref p) => {
858
878
match unsafe { ( * p. get ( ) ) . can_recv ( ) } {
859
879
Ok ( ret) => return ret,
@@ -874,15 +894,15 @@ impl<T: Send> select::Packet for Receiver<T> {
874
894
}
875
895
} ;
876
896
unsafe {
877
- mem:: swap ( & mut cast :: transmute_mut ( self ) . inner ,
878
- & mut new_port. inner ) ;
897
+ mem:: swap ( self . mut_inner ( ) ,
898
+ new_port. mut_inner ( ) ) ;
879
899
}
880
900
}
881
901
}
882
902
883
903
fn start_selection ( & self , mut task : BlockedTask ) -> Result < ( ) , BlockedTask > {
884
904
loop {
885
- let ( t, mut new_port) = match self . inner {
905
+ let ( t, new_port) = match * unsafe { self . inner ( ) } {
886
906
Oneshot ( ref p) => {
887
907
match unsafe { ( * p. get ( ) ) . start_selection ( task) } {
888
908
oneshot:: SelSuccess => return Ok ( ( ) ) ,
@@ -906,16 +926,16 @@ impl<T: Send> select::Packet for Receiver<T> {
906
926
} ;
907
927
task = t;
908
928
unsafe {
909
- mem:: swap ( & mut cast :: transmute_mut ( self ) . inner ,
910
- & mut new_port. inner ) ;
929
+ mem:: swap ( self . mut_inner ( ) ,
930
+ new_port. mut_inner ( ) ) ;
911
931
}
912
932
}
913
933
}
914
934
915
935
fn abort_selection ( & self ) -> bool {
916
936
let mut was_upgrade = false ;
917
937
loop {
918
- let result = match self . inner {
938
+ let result = match * unsafe { self . inner ( ) } {
919
939
Oneshot ( ref p) => unsafe { ( * p. get ( ) ) . abort_selection ( ) } ,
920
940
Stream ( ref p) => unsafe {
921
941
( * p. get ( ) ) . abort_selection ( was_upgrade)
@@ -927,11 +947,11 @@ impl<T: Send> select::Packet for Receiver<T> {
927
947
( * p. get ( ) ) . abort_selection ( )
928
948
} ,
929
949
} ;
930
- let mut new_port = match result { Ok ( b) => return b, Err ( p) => p } ;
950
+ let new_port = match result { Ok ( b) => return b, Err ( p) => p } ;
931
951
was_upgrade = true ;
932
952
unsafe {
933
- mem:: swap ( & mut cast :: transmute_mut ( self ) . inner ,
934
- & mut new_port. inner ) ;
953
+ mem:: swap ( self . mut_inner ( ) ,
954
+ new_port. mut_inner ( ) ) ;
935
955
}
936
956
}
937
957
}
@@ -944,7 +964,7 @@ impl<'a, T: Send> Iterator<T> for Messages<'a, T> {
944
964
#[ unsafe_destructor]
945
965
impl < T : Send > Drop for Receiver < T > {
946
966
fn drop ( & mut self ) {
947
- match self . inner {
967
+ match * unsafe { self . mut_inner ( ) } {
948
968
Oneshot ( ref mut p) => unsafe { ( * p. get ( ) ) . drop_port ( ) ; } ,
949
969
Stream ( ref mut p) => unsafe { ( * p. get ( ) ) . drop_port ( ) ; } ,
950
970
Shared ( ref mut p) => unsafe { ( * p. get ( ) ) . drop_port ( ) ; } ,
0 commit comments