File tree Expand file tree Collapse file tree 3 files changed +65
-8
lines changed
branches/try2/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 @@ -5,7 +5,7 @@ refs/heads/snap-stage3: 78a7676898d9f80ab540c6df5d4c9ce35bb50463
5
5
refs/heads/try: 519addf6277dbafccbb4159db4b710c37eaa2ec5
6
6
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
7
7
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
8
- refs/heads/try2: 3316a0e6b2ad9352bab58e7c046ef3d212411d82
8
+ refs/heads/try2: 80f92f5c5fedadd131842977c0b9b21806f3902f
9
9
refs/heads/dist-snap: ba4081a5a8573875fed17545846f6f6902c8ba8d
10
10
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
11
11
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503
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