diff --git a/src/librustuv/access.rs b/src/librustuv/access.rs index 81ddc9d32eb2..63d9aa7ead0a 100644 --- a/src/librustuv/access.rs +++ b/src/librustuv/access.rs @@ -14,15 +14,16 @@ /// It is assumed that all invocations of this struct happen on the same thread /// (the uv event loop). +use alloc::arc::Arc; use std::mem; use std::rt::local::Local; use std::rt::task::{BlockedTask, Task}; -use std::sync::arc::UnsafeArc; +use std::ty::Unsafe; use homing::HomingMissile; pub struct Access { - inner: UnsafeArc, + inner: Arc>, } pub struct Guard<'a> { @@ -39,11 +40,11 @@ struct Inner { impl Access { pub fn new() -> Access { Access { - inner: UnsafeArc::new(Inner { + inner: Arc::new(Unsafe::new(Inner { queue: vec![], held: false, closed: false, - }) + })) } } diff --git a/src/librustuv/lib.rs b/src/librustuv/lib.rs index a9b449e63be4..0a6a305a3b78 100644 --- a/src/librustuv/lib.rs +++ b/src/librustuv/lib.rs @@ -46,6 +46,7 @@ via `close` and `delete` methods. #[cfg(test)] extern crate green; #[cfg(test)] extern crate realrustuv = "rustuv"; extern crate libc; +extern crate alloc; use libc::{c_int, c_void}; use std::fmt; diff --git a/src/librustuv/queue.rs b/src/librustuv/queue.rs index 57b5e7105b20..98ae865cb1da 100644 --- a/src/librustuv/queue.rs +++ b/src/librustuv/queue.rs @@ -20,10 +20,10 @@ #![allow(dead_code)] +use alloc::arc::Arc; use libc::c_void; use std::mem; use std::rt::task::BlockedTask; -use std::sync::arc::UnsafeArc; use std::unstable::mutex::NativeMutex; use mpsc = std::sync::mpsc_queue; @@ -46,20 +46,20 @@ struct State { /// This structure is intended to be stored next to the event loop, and it is /// used to create new `Queue` structures. pub struct QueuePool { - queue: UnsafeArc, + queue: Arc, refcnt: uint, } /// This type is used to send messages back to the original event loop. pub struct Queue { - queue: UnsafeArc, + queue: Arc, } extern fn async_cb(handle: *uvll::uv_async_t) { let pool: &mut QueuePool = unsafe { mem::transmute(uvll::get_data_for_uv_handle(handle)) }; - let state: &mut State = unsafe { mem::transmute(pool.queue.get()) }; + let state: &State = &*pool.queue; // Remember that there is no guarantee about how many times an async // callback is called with relation to the number of sends, so process the @@ -109,7 +109,7 @@ extern fn async_cb(handle: *uvll::uv_async_t) { impl QueuePool { pub fn new(loop_: &mut Loop) -> Box { let handle = UvHandle::alloc(None::, uvll::UV_ASYNC); - let state = UnsafeArc::new(State { + let state = Arc::new(State { handle: handle, lock: unsafe {NativeMutex::new()}, queue: mpsc::Queue::new(), @@ -132,24 +132,20 @@ impl QueuePool { pub fn queue(&mut self) -> Queue { unsafe { if self.refcnt == 0 { - uvll::uv_ref((*self.queue.get()).handle); + uvll::uv_ref(self.queue.handle); } self.refcnt += 1; } Queue { queue: self.queue.clone() } } - pub fn handle(&self) -> *uvll::uv_async_t { - unsafe { (*self.queue.get()).handle } - } + pub fn handle(&self) -> *uvll::uv_async_t { self.queue.handle } } impl Queue { pub fn push(&mut self, task: BlockedTask) { - unsafe { - (*self.queue.get()).queue.push(Task(task)); - uvll::uv_async_send((*self.queue.get()).handle); - } + self.queue.queue.push(Task(task)); + unsafe { uvll::uv_async_send(self.queue.handle); } } } @@ -160,9 +156,7 @@ impl Clone for Queue { // that the count is at least one (because we have a queue right here), // and if the queue is dropped later on it'll see the increment for the // decrement anyway. - unsafe { - (*self.queue.get()).queue.push(Increment); - } + self.queue.queue.push(Increment); Queue { queue: self.queue.clone() } } } @@ -172,10 +166,9 @@ impl Drop for Queue { // See the comments in the async_cb function for why there is a lock // that is acquired only on a drop. unsafe { - let state = self.queue.get(); - let _l = (*state).lock.lock(); - (*state).queue.push(Decrement); - uvll::uv_async_send((*state).handle); + let _l = self.queue.lock.lock(); + self.queue.queue.push(Decrement); + uvll::uv_async_send(self.queue.handle); } } } diff --git a/src/librustuv/rc.rs b/src/librustuv/rc.rs index 86c6c44238c0..2a1a6b9f26d4 100644 --- a/src/librustuv/rc.rs +++ b/src/librustuv/rc.rs @@ -16,16 +16,17 @@ /// the same underlying uv object, hence Rc is not used and this simple counter /// should suffice. -use std::sync::arc::UnsafeArc; +use alloc::arc::Arc; +use std::ty::Unsafe; pub struct Refcount { - rc: UnsafeArc, + rc: Arc>, } impl Refcount { /// Creates a new refcount of 1 pub fn new() -> Refcount { - Refcount { rc: UnsafeArc::new(1) } + Refcount { rc: Arc::new(Unsafe::new(1)) } } fn increment(&self) {