From 75014f7b1790e7ebdf13d38acc04dfdab6e450e9 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Wed, 4 Jun 2014 00:01:40 -0700 Subject: libs: Fix miscellaneous fallout of librustrt --- src/libgreen/basic.rs | 53 +++++++++++++++++++-------------------------------- 1 file changed, 20 insertions(+), 33 deletions(-) (limited to 'src/libgreen/basic.rs') diff --git a/src/libgreen/basic.rs b/src/libgreen/basic.rs index 1ebebbe555e..7f033a1bc61 100644 --- a/src/libgreen/basic.rs +++ b/src/libgreen/basic.rs @@ -20,7 +20,7 @@ use std::sync::atomics; use std::mem; use std::rt::rtio::{EventLoop, IoFactory, RemoteCallback}; use std::rt::rtio::{PausableIdleCallback, Callback}; -use std::unstable::sync::Exclusive; +use std::rt::exclusive::Exclusive; /// This is the only exported function from this module. pub fn event_loop() -> Box { @@ -31,7 +31,7 @@ struct BasicLoop { work: Vec, // pending work remotes: Vec<(uint, Box)>, next_remote: uint, - messages: Exclusive>, + messages: Arc>>, idle: Option>, idle_active: Option>, } @@ -46,7 +46,7 @@ impl BasicLoop { idle_active: None, next_remote: 0, remotes: vec![], - messages: Exclusive::new(vec![]), + messages: Arc::new(Exclusive::new(Vec::new())), } } @@ -61,19 +61,10 @@ impl BasicLoop { fn remote_work(&mut self) { let messages = unsafe { - self.messages.with(|messages| { - if messages.len() > 0 { - Some(mem::replace(messages, vec![])) - } else { - None - } - }) - }; - let messages = match messages { - Some(m) => m, None => return + mem::replace(&mut *self.messages.lock(), Vec::new()) }; - for message in messages.iter() { - self.message(*message); + for message in messages.move_iter() { + self.message(message); } } @@ -125,13 +116,13 @@ impl EventLoop for BasicLoop { } unsafe { + let mut messages = self.messages.lock(); // We block here if we have no messages to process and we may // receive a message at a later date - self.messages.hold_and_wait(|messages| { - self.remotes.len() > 0 && - messages.len() == 0 && - self.work.len() == 0 - }) + if self.remotes.len() > 0 && messages.len() == 0 && + self.work.len() == 0 { + messages.wait() + } } } } @@ -165,33 +156,29 @@ impl EventLoop for BasicLoop { } struct BasicRemote { - queue: Exclusive>, + queue: Arc>>, id: uint, } impl BasicRemote { - fn new(queue: Exclusive>, id: uint) -> BasicRemote { + fn new(queue: Arc>>, id: uint) -> BasicRemote { BasicRemote { queue: queue, id: id } } } impl RemoteCallback for BasicRemote { fn fire(&mut self) { - unsafe { - self.queue.hold_and_signal(|queue| { - queue.push(RunRemote(self.id)); - }) - } + let mut queue = unsafe { self.queue.lock() }; + queue.push(RunRemote(self.id)); + queue.signal(); } } impl Drop for BasicRemote { fn drop(&mut self) { - unsafe { - self.queue.hold_and_signal(|queue| { - queue.push(RemoveRemote(self.id)); - }) - } + let mut queue = unsafe { self.queue.lock() }; + queue.push(RemoveRemote(self.id)); + queue.signal(); } } @@ -216,7 +203,7 @@ impl Drop for BasicPausable { #[cfg(test)] mod test { - use std::task::TaskOpts; + use std::rt::task::TaskOpts; use basic; use PoolConfig; -- cgit 1.4.1-3-g733a5