File tree Expand file tree Collapse file tree 3 files changed +65
-8
lines changed
branches/auto/src/libstd/comm Expand file tree Collapse file tree 3 files changed +65
-8
lines changed Original file line number Diff line number Diff line change @@ -13,7 +13,7 @@ refs/heads/try3: 9387340aab40a73e8424c48fd42f0c521a4875c0
13
13
refs/tags/release-0.3.1: 495bae036dfe5ec6ceafd3312b4dca48741e845b
14
14
refs/tags/release-0.4: e828ea2080499553b97dfe33b3f4d472b4562ad7
15
15
refs/tags/release-0.5: 7e3bcfbf21278251ee936ad53e92e9b719702d73
16
- refs/heads/auto: 3316a0e6b2ad9352bab58e7c046ef3d212411d82
16
+ refs/heads/auto: 80f92f5c5fedadd131842977c0b9b21806f3902f
17
17
refs/heads/servo: af82457af293e2a842ba6b7759b70288da276167
18
18
refs/tags/release-0.6: b4ebcfa1812664df5e142f0134a5faea3918544c
19
19
refs/tags/0.1: b19db808c2793fe2976759b85a355c3ad8c8b336
Original file line number Diff line number Diff line change @@ -339,14 +339,19 @@ impl<T: Send> Packet<T> {
339
339
DATA => Ok ( true ) ,
340
340
341
341
// If the other end has hung up, then we have complete ownership
342
- // of the port. We need to check to see if there was an upgrade
343
- // requested, and if so, the other end needs to have its selection
344
- // aborted.
342
+ // of the port. First, check if there was data waiting for us. This
343
+ // is possible if the other end sent something and then hung up.
344
+ //
345
+ // We then need to check to see if there was an upgrade requested,
346
+ // and if so, the upgraded port needs to have its selection aborted.
345
347
DISCONNECTED => {
346
- assert ! ( self . data. is_none( ) ) ;
347
- match mem:: replace ( & mut self . upgrade , SendUsed ) {
348
- GoUp ( port) => Err ( port) ,
349
- _ => Ok ( true ) ,
348
+ if self . data . is_some ( ) {
349
+ Ok ( true )
350
+ } else {
351
+ match mem:: replace ( & mut self . upgrade , SendUsed ) {
352
+ GoUp ( port) => Err ( port) ,
353
+ _ => Ok ( true ) ,
354
+ }
350
355
}
351
356
}
352
357
Original file line number Diff line number Diff line change @@ -597,4 +597,56 @@ mod test {
597
597
unsafe { h. add( ) ; }
598
598
assert_eq!( s. wait2( false ) , h. id) ;
599
599
} )
600
+
601
+ test ! ( fn oneshot_data_waiting( ) {
602
+ let ( p, c) = Chan :: new( ) ;
603
+ let ( p2, c2) = Chan :: new( ) ;
604
+ spawn( proc( ) {
605
+ select! {
606
+ ( ) = p. recv( ) => { }
607
+ }
608
+ c2. send( ( ) ) ;
609
+ } ) ;
610
+
611
+ for _ in range( 0 , 100 ) { task:: deschedule( ) }
612
+ c. send( ( ) ) ;
613
+ p2. recv( ) ;
614
+ } )
615
+
616
+ test ! ( fn stream_data_waiting( ) {
617
+ let ( p, c) = Chan :: new( ) ;
618
+ let ( p2, c2) = Chan :: new( ) ;
619
+ c. send( ( ) ) ;
620
+ c. send( ( ) ) ;
621
+ p. recv( ) ;
622
+ p. recv( ) ;
623
+ spawn( proc( ) {
624
+ select! {
625
+ ( ) = p. recv( ) => { }
626
+ }
627
+ c2. send( ( ) ) ;
628
+ } ) ;
629
+
630
+ for _ in range( 0 , 100 ) { task:: deschedule( ) }
631
+ c. send( ( ) ) ;
632
+ p2. recv( ) ;
633
+ } )
634
+
635
+ test ! ( fn shared_data_waiting( ) {
636
+ let ( p, c) = Chan :: new( ) ;
637
+ let ( p2, c2) = Chan :: new( ) ;
638
+ drop( c. clone( ) ) ;
639
+ c. send( ( ) ) ;
640
+ p. recv( ) ;
641
+ spawn( proc( ) {
642
+ select! {
643
+ ( ) = p. recv( ) => { }
644
+ }
645
+ c2. send( ( ) ) ;
646
+ } ) ;
647
+
648
+ for _ in range( 0 , 100 ) { task:: deschedule( ) }
649
+ c. send( ( ) ) ;
650
+ p2. recv( ) ;
651
+ } )
600
652
}
You can’t perform that action at this time.
0 commit comments