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 alloc:: arc:: Arc ;
275
+
274
276
use cell:: Cell ;
275
277
use clone:: Clone ;
276
278
use iter:: Iterator ;
@@ -283,7 +285,6 @@ use owned::Box;
283
285
use result:: { Ok , Err , Result } ;
284
286
use rt:: local:: Local ;
285
287
use rt:: task:: { Task , BlockedTask } ;
286
- use sync:: arc:: UnsafeArc ;
287
288
use ty:: Unsafe ;
288
289
289
290
pub use comm:: select:: { Select , Handle } ;
@@ -352,7 +353,7 @@ pub struct Sender<T> {
352
353
/// The sending-half of Rust's synchronous channel type. This half can only be
353
354
/// owned by one task, but it can be cloned to send to other tasks.
354
355
pub struct SyncSender < T > {
355
- inner : UnsafeArc < sync:: Packet < T > > ,
356
+ inner : Arc < Unsafe < sync:: Packet < T > > > ,
356
357
// can't share in an arc
357
358
marker : marker:: NoShare ,
358
359
}
@@ -386,10 +387,10 @@ pub enum TrySendError<T> {
386
387
}
387
388
388
389
enum Flavor < T > {
389
- Oneshot ( UnsafeArc < oneshot:: Packet < T > > ) ,
390
- Stream ( UnsafeArc < stream:: Packet < T > > ) ,
391
- Shared ( UnsafeArc < shared:: Packet < T > > ) ,
392
- Sync ( UnsafeArc < sync:: Packet < T > > ) ,
390
+ Oneshot ( Arc < Unsafe < oneshot:: Packet < T > > > ) ,
391
+ Stream ( Arc < Unsafe < stream:: Packet < T > > > ) ,
392
+ Shared ( Arc < Unsafe < shared:: Packet < T > > > ) ,
393
+ Sync ( Arc < Unsafe < sync:: Packet < T > > > ) ,
393
394
}
394
395
395
396
#[ doc( hidden) ]
@@ -435,8 +436,8 @@ impl<T> UnsafeFlavor<T> for Receiver<T> {
435
436
/// println!("{}", rx.recv());
436
437
/// ```
437
438
pub fn channel < T : Send > ( ) -> ( Sender < T > , Receiver < T > ) {
438
- let ( a , b ) = UnsafeArc :: new2 ( oneshot:: Packet :: new ( ) ) ;
439
- ( Sender :: new ( Oneshot ( b ) ) , Receiver :: new ( Oneshot ( a) ) )
439
+ let a = Arc :: new ( Unsafe :: new ( oneshot:: Packet :: new ( ) ) ) ;
440
+ ( Sender :: new ( Oneshot ( a . clone ( ) ) ) , Receiver :: new ( Oneshot ( a) ) )
440
441
}
441
442
442
443
/// Creates a new synchronous, bounded channel.
@@ -471,8 +472,8 @@ pub fn channel<T: Send>() -> (Sender<T>, Receiver<T>) {
471
472
/// assert_eq!(rx.recv(), 2);
472
473
/// ```
473
474
pub fn sync_channel < T : Send > ( bound : uint ) -> ( SyncSender < T > , Receiver < T > ) {
474
- let ( a , b ) = UnsafeArc :: new2 ( sync:: Packet :: new ( bound) ) ;
475
- ( SyncSender :: new ( a) , Receiver :: new ( Sync ( b ) ) )
475
+ let a = Arc :: new ( Unsafe :: new ( sync:: Packet :: new ( bound) ) ) ;
476
+ ( SyncSender :: new ( a. clone ( ) ) , Receiver :: new ( Sync ( a ) ) )
476
477
}
477
478
478
479
////////////////////////////////////////////////////////////////////////////////
@@ -557,13 +558,13 @@ impl<T: Send> Sender<T> {
557
558
558
559
let ( new_inner, ret) = match * unsafe { self . inner ( ) } {
559
560
Oneshot ( ref p) => {
560
- let p = p. get ( ) ;
561
561
unsafe {
562
+ let p = p. get ( ) ;
562
563
if !( * p) . sent ( ) {
563
564
return ( * p) . send ( t) ;
564
565
} else {
565
- let ( a , b ) = UnsafeArc :: new2 ( stream:: Packet :: new ( ) ) ;
566
- match ( * p) . upgrade ( Receiver :: new ( Stream ( b ) ) ) {
566
+ let a = Arc :: new ( Unsafe :: new ( stream:: Packet :: new ( ) ) ) ;
567
+ match ( * p) . upgrade ( Receiver :: new ( Stream ( a . clone ( ) ) ) ) {
567
568
oneshot:: UpSuccess => {
568
569
let ret = ( * a. get ( ) ) . send ( t) ;
569
570
( a, ret)
@@ -598,17 +599,21 @@ impl<T: Send> Clone for Sender<T> {
598
599
fn clone ( & self ) -> Sender < T > {
599
600
let ( packet, sleeper) = match * unsafe { self . inner ( ) } {
600
601
Oneshot ( ref p) => {
601
- let ( a, b) = UnsafeArc :: new2 ( shared:: Packet :: new ( ) ) ;
602
- match unsafe { ( * p. get ( ) ) . upgrade ( Receiver :: new ( Shared ( a) ) ) } {
603
- oneshot:: UpSuccess | oneshot:: UpDisconnected => ( b, None ) ,
604
- oneshot:: UpWoke ( task) => ( b, Some ( task) )
602
+ let a = Arc :: new ( Unsafe :: new ( shared:: Packet :: new ( ) ) ) ;
603
+ match unsafe {
604
+ ( * p. get ( ) ) . upgrade ( Receiver :: new ( Shared ( a. clone ( ) ) ) )
605
+ } {
606
+ oneshot:: UpSuccess | oneshot:: UpDisconnected => ( a, None ) ,
607
+ oneshot:: UpWoke ( task) => ( a, Some ( task) )
605
608
}
606
609
}
607
610
Stream ( ref p) => {
608
- let ( a, b) = UnsafeArc :: new2 ( shared:: Packet :: new ( ) ) ;
609
- match unsafe { ( * p. get ( ) ) . upgrade ( Receiver :: new ( Shared ( a) ) ) } {
610
- stream:: UpSuccess | stream:: UpDisconnected => ( b, None ) ,
611
- stream:: UpWoke ( task) => ( b, Some ( task) ) ,
611
+ let a = Arc :: new ( Unsafe :: new ( shared:: Packet :: new ( ) ) ) ;
612
+ match unsafe {
613
+ ( * p. get ( ) ) . upgrade ( Receiver :: new ( Shared ( a. clone ( ) ) ) )
614
+ } {
615
+ stream:: UpSuccess | stream:: UpDisconnected => ( a, None ) ,
616
+ stream:: UpWoke ( task) => ( a, Some ( task) ) ,
612
617
}
613
618
}
614
619
Shared ( ref p) => {
@@ -645,7 +650,7 @@ impl<T: Send> Drop for Sender<T> {
645
650
////////////////////////////////////////////////////////////////////////////////
646
651
647
652
impl < T : Send > SyncSender < T > {
648
- fn new ( inner : UnsafeArc < sync:: Packet < T > > ) -> SyncSender < T > {
653
+ fn new ( inner : Arc < Unsafe < sync:: Packet < T > > > ) -> SyncSender < T > {
649
654
SyncSender { inner : inner, marker : marker:: NoShare }
650
655
}
651
656
0 commit comments