diff options
| author | bors <bors@rust-lang.org> | 2013-10-27 20:21:29 -0700 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2013-10-27 20:21:29 -0700 |
| commit | d664ca26357fad84b4bc48f903f4795d491ccfd1 (patch) | |
| tree | 0450d420bb1e359aecfc0a9d7a9e3fa8800476b9 /src/libstd/rt/message_queue.rs | |
| parent | a1200118271ae6f14847baa93d0bfc1d7750b3bb (diff) | |
| parent | a849c476f5a62bdf5af546b603a5d7038fcb5e52 (diff) | |
| download | rust-d664ca26357fad84b4bc48f903f4795d491ccfd1.tar.gz rust-d664ca26357fad84b4bc48f903f4795d491ccfd1.zip | |
auto merge of #10080 : brson/rust/sched_queue, r=brson
Rebase and update of #9710
Diffstat (limited to 'src/libstd/rt/message_queue.rs')
| -rw-r--r-- | src/libstd/rt/message_queue.rs | 60 |
1 files changed, 11 insertions, 49 deletions
diff --git a/src/libstd/rt/message_queue.rs b/src/libstd/rt/message_queue.rs index 99b5156b319..10e457368f0 100644 --- a/src/libstd/rt/message_queue.rs +++ b/src/libstd/rt/message_queue.rs @@ -11,83 +11,45 @@ //! A concurrent queue that supports multiple producers and a //! single consumer. -use container::Container; use kinds::Send; use vec::OwnedVector; -use cell::Cell; -use option::*; -use unstable::sync::{UnsafeArc, LittleLock}; +use option::Option; use clone::Clone; +use rt::mpsc_queue::Queue; pub struct MessageQueue<T> { - priv state: UnsafeArc<State<T>> -} - -struct State<T> { - count: uint, - queue: ~[T], - lock: LittleLock + priv queue: Queue<T> } impl<T: Send> MessageQueue<T> { pub fn new() -> MessageQueue<T> { MessageQueue { - state: UnsafeArc::new(State { - count: 0, - queue: ~[], - lock: LittleLock::new() - }) + queue: Queue::new() } } + #[inline] pub fn push(&mut self, value: T) { - unsafe { - let value = Cell::new(value); - let state = self.state.get(); - do (*state).lock.lock { - (*state).count += 1; - (*state).queue.push(value.take()); - } - } + self.queue.push(value) } + #[inline] pub fn pop(&mut self) -> Option<T> { - unsafe { - let state = self.state.get(); - do (*state).lock.lock { - if !(*state).queue.is_empty() { - (*state).count += 1; - Some((*state).queue.shift()) - } else { - None - } - } - } + self.queue.pop() } /// A pop that may sometimes miss enqueued elements, but is much faster /// to give up without doing any synchronization + #[inline] pub fn casual_pop(&mut self) -> Option<T> { - unsafe { - let state = self.state.get(); - // NB: Unsynchronized check - if (*state).count == 0 { return None; } - do (*state).lock.lock { - if !(*state).queue.is_empty() { - (*state).count += 1; - Some((*state).queue.shift()) - } else { - None - } - } - } + self.queue.pop() } } impl<T: Send> Clone for MessageQueue<T> { fn clone(&self) -> MessageQueue<T> { MessageQueue { - state: self.state.clone() + queue: self.queue.clone() } } } |
