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
@@ -318,19 +318,14 @@ mod stream;
318
318
mod shared;
319
319
mod sync;
320
320
321
- // FIXME #13933: Remove/justify all `&T` to `&mut T` transmutes
322
- unsafe fn transmute_mut < ' a , T > ( x : & ' a T ) -> & ' a mut T {
323
- cast:: transmute :: < & _ , & mut _ > ( x)
324
- }
325
-
326
321
// Use a power of 2 to allow LLVM to optimize to something that's not a
327
322
// division, this is hit pretty regularly.
328
323
static RESCHED_FREQ : int = 256 ;
329
324
330
325
/// The receiving-half of Rust's channel type. This half can only be owned by
331
326
/// one task
332
327
pub struct Receiver < T > {
333
- inner : Flavor < T > ,
328
+ inner : Unsafe < Flavor < T > > ,
334
329
receives : Cell < uint > ,
335
330
// can't share in an arc
336
331
marker : marker:: NoShare ,
@@ -346,7 +341,7 @@ pub struct Messages<'a, T> {
346
341
/// The sending-half of Rust's asynchronous channel type. This half can only be
347
342
/// owned by one task, but it can be cloned to send to other tasks.
348
343
pub struct Sender < T > {
349
- inner : Flavor < T > ,
344
+ inner : Unsafe < Flavor < T > > ,
350
345
sends : Cell < uint > ,
351
346
// can't share in an arc
352
347
marker : marker:: NoShare ,
@@ -395,6 +390,27 @@ enum Flavor<T> {
395
390
Sync ( UnsafeArc < sync:: Packet < T > > ) ,
396
391
}
397
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
+
398
414
/// Creates a new asynchronous channel, returning the sender/receiver halves.
399
415
///
400
416
/// All data sent on the sender will become available on the receiver, and no
@@ -463,7 +479,7 @@ pub fn sync_channel<T: Send>(bound: uint) -> (SyncSender<T>, Receiver<T>) {
463
479
464
480
impl < T : Send > Sender < T > {
465
481
fn new ( inner : Flavor < T > ) -> Sender < T > {
466
- Sender { inner : inner, sends : Cell :: new ( 0 ) , marker : marker:: NoShare }
482
+ Sender { inner : Unsafe :: new ( inner) , sends : Cell :: new ( 0 ) , marker : marker:: NoShare }
467
483
}
468
484
469
485
/// Sends a value along this channel to be received by the corresponding
@@ -537,7 +553,7 @@ impl<T: Send> Sender<T> {
537
553
task. map ( |t| t. maybe_yield ( ) ) ;
538
554
}
539
555
540
- let ( new_inner, ret) = match self . inner {
556
+ let ( new_inner, ret) = match * unsafe { self . inner ( ) } {
541
557
Oneshot ( ref p) => {
542
558
let p = p. get ( ) ;
543
559
unsafe {
@@ -569,16 +585,16 @@ impl<T: Send> Sender<T> {
569
585
} ;
570
586
571
587
unsafe {
572
- let mut tmp = Sender :: new ( Stream ( new_inner) ) ;
573
- mem:: swap ( & mut transmute_mut ( self ) . inner , & mut tmp. inner ) ;
588
+ let tmp = Sender :: new ( Stream ( new_inner) ) ;
589
+ mem:: swap ( self . mut_inner ( ) , tmp. mut_inner ( ) ) ;
574
590
}
575
591
return ret;
576
592
}
577
593
}
578
594
579
595
impl < T : Send > Clone for Sender < T > {
580
596
fn clone ( & self ) -> Sender < T > {
581
- let ( packet, sleeper) = match self . inner {
597
+ let ( packet, sleeper) = match * unsafe { self . inner ( ) } {
582
598
Oneshot ( ref p) => {
583
599
let ( a, b) = UnsafeArc :: new2 ( shared:: Packet :: new ( ) ) ;
584
600
match unsafe { ( * p. get ( ) ) . upgrade ( Receiver :: new ( Shared ( a) ) ) } {
@@ -603,8 +619,8 @@ impl<T: Send> Clone for Sender<T> {
603
619
unsafe {
604
620
( * packet. get ( ) ) . inherit_blocker ( sleeper) ;
605
621
606
- let mut tmp = Sender :: new ( Shared ( packet. clone ( ) ) ) ;
607
- mem:: swap ( & mut transmute_mut ( self ) . inner , & mut tmp. inner ) ;
622
+ let tmp = Sender :: new ( Shared ( packet. clone ( ) ) ) ;
623
+ mem:: swap ( self . mut_inner ( ) , tmp. mut_inner ( ) ) ;
608
624
}
609
625
Sender :: new ( Shared ( packet) )
610
626
}
@@ -613,7 +629,7 @@ impl<T: Send> Clone for Sender<T> {
613
629
#[ unsafe_destructor]
614
630
impl < T : Send > Drop for Sender < T > {
615
631
fn drop ( & mut self ) {
616
- match self . inner {
632
+ match * unsafe { self . mut_inner ( ) } {
617
633
Oneshot ( ref mut p) => unsafe { ( * p. get ( ) ) . drop_chan ( ) ; } ,
618
634
Stream ( ref mut p) => unsafe { ( * p. get ( ) ) . drop_chan ( ) ; } ,
619
635
Shared ( ref mut p) => unsafe { ( * p. get ( ) ) . drop_chan ( ) ; } ,
@@ -710,7 +726,7 @@ impl<T: Send> Drop for SyncSender<T> {
710
726
711
727
impl < T : Send > Receiver < T > {
712
728
fn new ( inner : Flavor < T > ) -> Receiver < T > {
713
- Receiver { inner : inner, receives : Cell :: new ( 0 ) , marker : marker:: NoShare }
729
+ Receiver { inner : Unsafe :: new ( inner) , receives : Cell :: new ( 0 ) , marker : marker:: NoShare }
714
730
}
715
731
716
732
/// Blocks waiting for a value on this receiver
@@ -762,7 +778,7 @@ impl<T: Send> Receiver<T> {
762
778
}
763
779
764
780
loop {
765
- let mut new_port = match self . inner {
781
+ let new_port = match * unsafe { self . inner ( ) } {
766
782
Oneshot ( ref p) => {
767
783
match unsafe { ( * p. get ( ) ) . try_recv ( ) } {
768
784
Ok ( t) => return Ok ( t) ,
@@ -795,8 +811,8 @@ impl<T: Send> Receiver<T> {
795
811
}
796
812
} ;
797
813
unsafe {
798
- mem:: swap ( & mut transmute_mut ( self ) . inner ,
799
- & mut new_port. inner ) ;
814
+ mem:: swap ( self . mut_inner ( ) ,
815
+ new_port. mut_inner ( ) ) ;
800
816
}
801
817
}
802
818
}
@@ -815,7 +831,7 @@ impl<T: Send> Receiver<T> {
815
831
/// the value found on the receiver is returned.
816
832
pub fn recv_opt ( & self ) -> Result < T , ( ) > {
817
833
loop {
818
- let mut new_port = match self . inner {
834
+ let new_port = match * unsafe { self . inner ( ) } {
819
835
Oneshot ( ref p) => {
820
836
match unsafe { ( * p. get ( ) ) . recv ( ) } {
821
837
Ok ( t) => return Ok ( t) ,
@@ -842,8 +858,7 @@ impl<T: Send> Receiver<T> {
842
858
Sync ( ref p) => return unsafe { ( * p. get ( ) ) . recv ( ) }
843
859
} ;
844
860
unsafe {
845
- mem:: swap ( & mut transmute_mut ( self ) . inner ,
846
- & mut new_port. inner ) ;
861
+ mem:: swap ( self . mut_inner ( ) , new_port. mut_inner ( ) ) ;
847
862
}
848
863
}
849
864
}
@@ -858,7 +873,7 @@ impl<T: Send> Receiver<T> {
858
873
impl < T : Send > select:: Packet for Receiver < T > {
859
874
fn can_recv ( & self ) -> bool {
860
875
loop {
861
- let mut new_port = match self . inner {
876
+ let new_port = match * unsafe { self . inner ( ) } {
862
877
Oneshot ( ref p) => {
863
878
match unsafe { ( * p. get ( ) ) . can_recv ( ) } {
864
879
Ok ( ret) => return ret,
@@ -879,15 +894,15 @@ impl<T: Send> select::Packet for Receiver<T> {
879
894
}
880
895
} ;
881
896
unsafe {
882
- mem:: swap ( & mut transmute_mut ( self ) . inner ,
883
- & mut new_port. inner ) ;
897
+ mem:: swap ( self . mut_inner ( ) ,
898
+ new_port. mut_inner ( ) ) ;
884
899
}
885
900
}
886
901
}
887
902
888
903
fn start_selection ( & self , mut task : BlockedTask ) -> Result < ( ) , BlockedTask > {
889
904
loop {
890
- let ( t, mut new_port) = match self . inner {
905
+ let ( t, new_port) = match * unsafe { self . inner ( ) } {
891
906
Oneshot ( ref p) => {
892
907
match unsafe { ( * p. get ( ) ) . start_selection ( task) } {
893
908
oneshot:: SelSuccess => return Ok ( ( ) ) ,
@@ -911,16 +926,16 @@ impl<T: Send> select::Packet for Receiver<T> {
911
926
} ;
912
927
task = t;
913
928
unsafe {
914
- mem:: swap ( & mut transmute_mut ( self ) . inner ,
915
- & mut new_port. inner ) ;
929
+ mem:: swap ( self . mut_inner ( ) ,
930
+ new_port. mut_inner ( ) ) ;
916
931
}
917
932
}
918
933
}
919
934
920
935
fn abort_selection ( & self ) -> bool {
921
936
let mut was_upgrade = false ;
922
937
loop {
923
- let result = match self . inner {
938
+ let result = match * unsafe { self . inner ( ) } {
924
939
Oneshot ( ref p) => unsafe { ( * p. get ( ) ) . abort_selection ( ) } ,
925
940
Stream ( ref p) => unsafe {
926
941
( * p. get ( ) ) . abort_selection ( was_upgrade)
@@ -932,11 +947,11 @@ impl<T: Send> select::Packet for Receiver<T> {
932
947
( * p. get ( ) ) . abort_selection ( )
933
948
} ,
934
949
} ;
935
- 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 } ;
936
951
was_upgrade = true ;
937
952
unsafe {
938
- mem:: swap ( & mut transmute_mut ( self ) . inner ,
939
- & mut new_port. inner ) ;
953
+ mem:: swap ( self . mut_inner ( ) ,
954
+ new_port. mut_inner ( ) ) ;
940
955
}
941
956
}
942
957
}
@@ -949,7 +964,7 @@ impl<'a, T: Send> Iterator<T> for Messages<'a, T> {
949
964
#[ unsafe_destructor]
950
965
impl < T : Send > Drop for Receiver < T > {
951
966
fn drop ( & mut self ) {
952
- match self . inner {
967
+ match * unsafe { self . mut_inner ( ) } {
953
968
Oneshot ( ref mut p) => unsafe { ( * p. get ( ) ) . drop_port ( ) ; } ,
954
969
Stream ( ref mut p) => unsafe { ( * p. get ( ) ) . drop_port ( ) ; } ,
955
970
Shared ( ref mut p) => unsafe { ( * p. get ( ) ) . drop_port ( ) ; } ,
0 commit comments