From d2a1378ed8dd3693511836fdee656d8f79089a73 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Sat, 18 May 2013 01:38:44 -0700 Subject: [PATCH] core::rt: Add MessageQueue type This is the queue used to send messages to Schedulers --- src/libcore/rt/message_queue.rs | 44 +++++++++++++++++++++++++++++++++ src/libcore/rt/mod.rs | 5 +++- 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 src/libcore/rt/message_queue.rs diff --git a/src/libcore/rt/message_queue.rs b/src/libcore/rt/message_queue.rs new file mode 100644 index 000000000000..014e71d3de68 --- /dev/null +++ b/src/libcore/rt/message_queue.rs @@ -0,0 +1,44 @@ +// Copyright 2013 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +use container::Container; +use kinds::Owned; +use vec::OwnedVector; +use cell::Cell; +use option::*; +use unstable::sync::{Exclusive, exclusive}; + +pub struct MessageQueue { + // XXX: Another mystery bug fixed by boxing this lock + priv queue: ~Exclusive<~[T]> +} + +impl MessageQueue { + pub fn new() -> MessageQueue { + MessageQueue { + queue: ~exclusive(~[]) + } + } + + pub fn push(&mut self, value: T) { + let value = Cell(value); + self.queue.with(|q| q.push(value.take()) ); + } + + pub fn pop(&mut self) -> Option { + do self.queue.with |q| { + if !q.is_empty() { + Some(q.shift()) + } else { + None + } + } + } +} \ No newline at end of file diff --git a/src/libcore/rt/mod.rs b/src/libcore/rt/mod.rs index 4dce9da505b5..3d51345336f3 100644 --- a/src/libcore/rt/mod.rs +++ b/src/libcore/rt/mod.rs @@ -91,9 +91,12 @@ pub mod uv; /// Bindings to pthread/windows thread-local storage. pub mod thread_local_storage; -/// A parallel work-stealing dequeue. +/// A parallel work-stealing deque. mod work_queue; +/// A parallel queue. +mod message_queue; + /// Stack segments and caching. mod stack;