Skip to content

Commit 6ee946b

Browse files
committed
---
yaml --- r: 96926 b: refs/heads/dist-snap c: 8be66e2 h: refs/heads/master v: v3
1 parent f98adae commit 6ee946b

File tree

2 files changed

+21
-6
lines changed

2 files changed

+21
-6
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ refs/heads/try: c274a6888410ce3e357e014568b43310ed787d36
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
88
refs/heads/try2: 147ecfdd8221e4a4d4e090486829a06da1e0ca3c
9-
refs/heads/dist-snap: 14caf00c92b40e3f62094db54f325196c8a05d5a
9+
refs/heads/dist-snap: 8be66e212b37045b927138965a76abe3608325ca
1010
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
1111
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503
1212
refs/heads/try3: 9387340aab40a73e8424c48fd42f0c521a4875c0

branches/dist-snap/src/libstd/comm/mod.rs

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,6 @@ use rt::local::Local;
238238
use rt::task::{Task, BlockedTask};
239239
use rt::thread::Thread;
240240
use sync::atomics::{AtomicInt, AtomicBool, SeqCst, Relaxed};
241-
use task;
242241
use vec::{ImmutableVector, OwnedVector};
243242

244243
use spsc = sync::spsc_queue;
@@ -346,6 +345,7 @@ struct Packet {
346345
selection_id: uint,
347346
select_next: *mut Packet,
348347
select_prev: *mut Packet,
348+
recv_cnt: int,
349349
}
350350

351351
///////////////////////////////////////////////////////////////////////////////
@@ -367,6 +367,7 @@ impl Packet {
367367
selection_id: 0,
368368
select_next: 0 as *mut Packet,
369369
select_prev: 0 as *mut Packet,
370+
recv_cnt: 0,
370371
}
371372
}
372373

@@ -611,8 +612,9 @@ impl<T: Send> Chan<T> {
611612
// the TLS overhead can be a bit much.
612613
n => {
613614
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();
616618
}
617619
true
618620
}
@@ -704,8 +706,9 @@ impl<T: Send> SharedChan<T> {
704706
DISCONNECTED => {} // oh well, we tried
705707
-1 => { (*packet).wakeup(can_resched); }
706708
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();
709712
}
710713
}
711714
}
@@ -773,6 +776,18 @@ impl<T: Send> Port<T> {
773776
// This is a "best effort" situation, so if a queue is inconsistent just
774777
// don't worry about it.
775778
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+
776791
let ret = match this.queue {
777792
SPSC(ref mut queue) => queue.pop(),
778793
MPSC(ref mut queue) => match queue.pop() {

0 commit comments

Comments
 (0)