// 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. //! 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::{Exclusive, exclusive}; use clone::Clone; 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) { unsafe { let value = Cell::new(value); self.queue.with(|q| q.push(value.take()) ); } } pub fn pop(&mut self) -> Option { unsafe { do self.queue.with |q| { if !q.is_empty() { Some(q.shift()) } else { None } } } } } impl Clone for MessageQueue { fn clone(&self) -> MessageQueue { MessageQueue { queue: self.queue.clone() } } }