aboutsummaryrefslogtreecommitdiffstats
path: root/components/util/workqueue.rs
diff options
context:
space:
mode:
authorLalehB <laghabab@uci.edu>2014-09-27 15:12:22 -0700
committerClark Gaebel <cgaebel@mozilla.com>2014-10-27 14:14:21 -0700
commitb0d16462ff4e214ade8357b1a9e40b943a74ae5b (patch)
tree527042df9fa3a37edf06824f82f138ec0e20e167 /components/util/workqueue.rs
parent005cfed6e99069e0d7f50414db7aab32411872a8 (diff)
downloadservo-b0d16462ff4e214ade8357b1a9e40b943a74ae5b.tar.gz
servo-b0d16462ff4e214ade8357b1a9e40b943a74ae5b.zip
Adding back-off instead of busy-spinning
Also changed the total number of spinning similar to Cilk
Diffstat (limited to 'components/util/workqueue.rs')
-rw-r--r--components/util/workqueue.rs9
1 files changed, 8 insertions, 1 deletions
diff --git a/components/util/workqueue.rs b/components/util/workqueue.rs
index 3a0b3e32f91..c2b81741e0c 100644
--- a/components/util/workqueue.rs
+++ b/components/util/workqueue.rs
@@ -16,6 +16,7 @@ use std::rand::weak_rng;
use std::sync::atomics::{AtomicUint, SeqCst};
use std::sync::deque::{Abort, BufferPool, Data, Empty, Stealer, Worker};
use std::task::TaskBuilder;
+use libc::funcs::posix88::unistd::usleep;
/// A unit of work.
///
@@ -70,7 +71,7 @@ struct WorkerThread<QueueData, WorkData> {
rng: XorShiftRng,
}
-static SPIN_COUNT: uint = 1000;
+static SPIN_COUNT: uint = 128;
impl<QueueData: Send, WorkData: Send> WorkerThread<QueueData, WorkData> {
/// The main logic. This function starts up the worker and listens for
@@ -87,6 +88,7 @@ impl<QueueData: Send, WorkData: Send> WorkerThread<QueueData, WorkData> {
// We're off!
//
// FIXME(pcwalton): Can't use labeled break or continue cross-crate due to a Rust bug.
+ let mut back_off_sleep = 0 as u32;
loop {
// FIXME(pcwalton): Nasty workaround for the lack of labeled break/continue
// cross-crate.
@@ -107,10 +109,15 @@ impl<QueueData: Send, WorkData: Send> WorkerThread<QueueData, WorkData> {
}
Data(work) => {
work_unit = work;
+ back_off_sleep = 0 as u32;
break
}
}
+ if (i>100) {
+ unsafe {usleep(back_off_sleep as u32)};
+ back_off_sleep = back_off_sleep + 5;
+ }
if i == SPIN_COUNT {
match self.port.try_recv() {
Ok(StopMsg) => {