about summary refs log tree commit diff
path: root/src/libstd/arc.rs
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2012-05-25 16:22:29 -0700
committerBrian Anderson <banderson@mozilla.com>2012-05-25 16:22:29 -0700
commitd89b4c8c61b4995559c2e5b963d58b5dd599fdf3 (patch)
treee85a5ce094dda17882ea5074abb3ebf624d6c5c9 /src/libstd/arc.rs
parent174f789e0b98cc98d4ba08076c61ef7a4b03a687 (diff)
downloadrust-d89b4c8c61b4995559c2e5b963d58b5dd599fdf3.tar.gz
rust-d89b4c8c61b4995559c2e5b963d58b5dd599fdf3.zip
std: Modify arc to tolerate upcoming change to uniques
Diffstat (limited to 'src/libstd/arc.rs')
-rw-r--r--src/libstd/arc.rs21
1 files changed, 14 insertions, 7 deletions
diff --git a/src/libstd/arc.rs b/src/libstd/arc.rs
index fce584069dc..30c106298f5 100644
--- a/src/libstd/arc.rs
+++ b/src/libstd/arc.rs
@@ -19,15 +19,17 @@ type arc_data<T> = {
     data: T
 };
 
-resource arc_destruct<T>(data: *arc_data<T>) {
+resource arc_destruct<T>(data: *libc::c_void) {
     unsafe {
-        let ptr = &mut (*data).count;
+        let data: ~arc_data<T> = unsafe::reinterpret_cast(data);
+        let ref_ptr = &mut data.count;
 
-        let new_count = rustrt::rust_atomic_decrement(ptr);
+        let new_count = rustrt::rust_atomic_decrement(ref_ptr);
         assert new_count >= 0;
         if new_count == 0 {
-            let _ptr : ~arc_data<T> = unsafe::reinterpret_cast(data);
             // drop glue takes over.
+        } else {
+            unsafe::forget(data);
         }
     }
 }
@@ -48,7 +50,11 @@ fn arc<T>(-data: T) -> arc<T> {
  wrapper."]
 fn get<T>(rc: &a.arc<T>) -> &a.T {
     unsafe {
-        &(***rc).data
+        let ptr: ~arc_data<T> = unsafe::reinterpret_cast(**rc);
+        // Cast us back into the correct region
+        let r = unsafe::reinterpret_cast(&ptr.data);
+        unsafe::forget(ptr);
+        ret r;
     }
 }
 
@@ -58,9 +64,10 @@ The resulting two `arc` objects will point to the same underlying data
 object. However, one of the `arc` objects can be sent to another task,
 allowing them to share the underlying data."]
 fn clone<T>(rc: &arc<T>) -> arc<T> {
-    let data = **rc;
     unsafe {
-        rustrt::rust_atomic_increment(&mut (*data).count);
+        let ptr: ~arc_data<T> = unsafe::reinterpret_cast(**rc);
+        rustrt::rust_atomic_increment(&mut ptr.count);
+        unsafe::forget(ptr);
     }
     arc_destruct(**rc)
 }