about summary refs log tree commit diff
path: root/src/libstd/rt/message_queue.rs
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2013-05-21 18:24:42 -0700
committerPatrick Walton <pcwalton@mimiga.net>2013-05-22 21:57:11 -0700
commit18df18c817b5e109710c58f512a2cc5ad14fa8b2 (patch)
tree09cb14a7fa03754cc978d4824a47979acc6d836e /src/libstd/rt/message_queue.rs
parentee52865c8848657e737e3c2071728b062ec9c8de (diff)
downloadrust-18df18c817b5e109710c58f512a2cc5ad14fa8b2.tar.gz
rust-18df18c817b5e109710c58f512a2cc5ad14fa8b2.zip
libstd: Fix merge fallout.
Diffstat (limited to 'src/libstd/rt/message_queue.rs')
-rw-r--r--src/libstd/rt/message_queue.rs53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/libstd/rt/message_queue.rs b/src/libstd/rt/message_queue.rs
new file mode 100644
index 00000000000..eaab9288ac8
--- /dev/null
+++ b/src/libstd/rt/message_queue.rs
@@ -0,0 +1,53 @@
+// 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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, 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};
+use clone::Clone;
+
+pub struct MessageQueue<T> {
+    // XXX: Another mystery bug fixed by boxing this lock
+    priv queue: ~Exclusive<~[T]>
+}
+
+impl<T: Owned> MessageQueue<T> {
+    pub fn new() -> MessageQueue<T> {
+        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<T> {
+        do self.queue.with |q| {
+            if !q.is_empty() {
+                Some(q.shift())
+            } else {
+                None
+            }
+        }
+    }
+}
+
+impl<T> Clone for MessageQueue<T> {
+    fn clone(&self) -> MessageQueue<T> {
+        MessageQueue {
+            queue: self.queue.clone()
+        }
+    }
+}