@@ -238,7 +238,6 @@ use rt::local::Local;
238
238
use rt:: task:: { Task , BlockedTask } ;
239
239
use rt:: thread:: Thread ;
240
240
use sync:: atomics:: { AtomicInt , AtomicBool , SeqCst , Relaxed } ;
241
- use task;
242
241
use vec:: { ImmutableVector , OwnedVector } ;
243
242
244
243
use spsc = sync:: spsc_queue;
@@ -346,6 +345,7 @@ struct Packet {
346
345
selection_id : uint ,
347
346
select_next : * mut Packet ,
348
347
select_prev : * mut Packet ,
348
+ recv_cnt : int ,
349
349
}
350
350
351
351
///////////////////////////////////////////////////////////////////////////////
@@ -367,6 +367,7 @@ impl Packet {
367
367
selection_id : 0 ,
368
368
select_next : 0 as * mut Packet ,
369
369
select_prev : 0 as * mut Packet ,
370
+ recv_cnt : 0 ,
370
371
}
371
372
}
372
373
@@ -611,8 +612,9 @@ impl<T: Send> Chan<T> {
611
612
// the TLS overhead can be a bit much.
612
613
n => {
613
614
assert ! ( n >= 0 ) ;
614
- if can_resched && n > 0 && n % RESCHED_FREQ == 0 {
615
- task:: deschedule ( ) ;
615
+ if n > 0 && n % RESCHED_FREQ == 0 {
616
+ let task: ~Task = Local :: take ( ) ;
617
+ task. maybe_yield ( ) ;
616
618
}
617
619
true
618
620
}
@@ -704,8 +706,9 @@ impl<T: Send> SharedChan<T> {
704
706
DISCONNECTED => { } // oh well, we tried
705
707
-1 => { ( * packet) . wakeup ( can_resched) ; }
706
708
n => {
707
- if can_resched && n > 0 && n % RESCHED_FREQ == 0 {
708
- task:: deschedule ( ) ;
709
+ if n > 0 && n % RESCHED_FREQ == 0 {
710
+ let task: ~Task = Local :: take ( ) ;
711
+ task. maybe_yield ( ) ;
709
712
}
710
713
}
711
714
}
@@ -773,6 +776,18 @@ impl<T: Send> Port<T> {
773
776
// This is a "best effort" situation, so if a queue is inconsistent just
774
777
// don't worry about it.
775
778
let this = unsafe { cast:: transmute_mut ( self ) } ;
779
+
780
+ // See the comment about yielding on sends, but the same applies here.
781
+ // If a thread is spinning in try_recv we should try
782
+ unsafe {
783
+ let packet = this. queue . packet ( ) ;
784
+ ( * packet) . recv_cnt += 1 ;
785
+ if ( * packet) . recv_cnt % RESCHED_FREQ == 0 {
786
+ let task: ~Task = Local :: take ( ) ;
787
+ task. maybe_yield ( ) ;
788
+ }
789
+ }
790
+
776
791
let ret = match this. queue {
777
792
SPSC ( ref mut queue) => queue. pop ( ) ,
778
793
MPSC ( ref mut queue) => match queue. pop ( ) {
0 commit comments