diff options
author | LalehB <laghabab@uci.edu> | 2014-09-27 15:12:22 -0700 |
---|---|---|
committer | Clark Gaebel <cgaebel@mozilla.com> | 2014-10-27 14:14:21 -0700 |
commit | b0d16462ff4e214ade8357b1a9e40b943a74ae5b (patch) | |
tree | 527042df9fa3a37edf06824f82f138ec0e20e167 /components/util/workqueue.rs | |
parent | 005cfed6e99069e0d7f50414db7aab32411872a8 (diff) | |
download | servo-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.rs | 9 |
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) => { |