about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2014-05-19 18:08:33 -0700
committerAlex Crichton <alex@alexcrichton.com>2014-05-19 18:12:18 -0700
commit5e10d373b597192f101b52060c95adaa83c48663 (patch)
treedc803b35763316b670b398040164d6a169de794b
parent88b322c5fdcdf5b3dc2bb635dd9696a58ec48ea2 (diff)
downloadrust-5e10d373b597192f101b52060c95adaa83c48663.tar.gz
rust-5e10d373b597192f101b52060c95adaa83c48663.zip
rustuv: Remove usage of UnsafeArc
-rw-r--r--src/librustuv/access.rs9
-rw-r--r--src/librustuv/lib.rs1
-rw-r--r--src/librustuv/queue.rs33
-rw-r--r--src/librustuv/rc.rs7
4 files changed, 23 insertions, 27 deletions
diff --git a/src/librustuv/access.rs b/src/librustuv/access.rs
index 81ddc9d32eb..63d9aa7ead0 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>,
+    inner: Arc<Unsafe<Inner>>,
 }
 
 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 a9b449e63be..0a6a305a3b7 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 57b5e7105b2..98ae865cb1d 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<State>,
+    queue: Arc<State>,
     refcnt: uint,
 }
 
 /// This type is used to send messages back to the original event loop.
 pub struct Queue {
-    queue: UnsafeArc<State>,
+    queue: Arc<State>,
 }
 
 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<QueuePool> {
         let handle = UvHandle::alloc(None::<AsyncWatcher>, 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 86c6c44238c..2a1a6b9f26d 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<uint>,
+    rc: Arc<Unsafe<uint>>,
 }
 
 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) {