about summary refs log tree commit diff
path: root/src/libstd/sync
diff options
context:
space:
mode:
authorDaniel Micay <danielmicay@gmail.com>2014-05-11 05:34:06 -0400
committerDaniel Micay <danielmicay@gmail.com>2014-05-11 13:54:53 -0400
commit420708f38992b488570bc8702a887593a57d746f (patch)
tree1c770fc1391000678a3e13d371132b5ac916a6f1 /src/libstd/sync
parent7da24ea1a9466ef3af3e86da65fcccd8f17f1ae5 (diff)
downloadrust-420708f38992b488570bc8702a887593a57d746f.tar.gz
rust-420708f38992b488570bc8702a887593a57d746f.zip
sync::deque: port to the new allocator API
Diffstat (limited to 'src/libstd/sync')
-rw-r--r--src/libstd/sync/deque.rs34
1 files changed, 19 insertions, 15 deletions
diff --git a/src/libstd/sync/deque.rs b/src/libstd/sync/deque.rs
index 175bb03d262..30b95ffb34f 100644
--- a/src/libstd/sync/deque.rs
+++ b/src/libstd/sync/deque.rs
@@ -51,8 +51,7 @@
 use clone::Clone;
 use iter::{range, Iterator};
 use kinds::Send;
-use libc;
-use mem;
+use mem::{forget, min_align_of, size_of, transmute};
 use ops::Drop;
 use option::{Option, Some, None};
 use owned::Box;
@@ -62,6 +61,7 @@ use slice::ImmutableVector;
 use sync::arc::UnsafeArc;
 use sync::atomics::{AtomicInt, AtomicPtr, SeqCst};
 use unstable::sync::Exclusive;
+use rt::heap::{allocate, deallocate};
 use vec::Vec;
 
 // Once the queue is less than 1/K full, then it will be downsized. Note that
@@ -229,7 +229,7 @@ impl<T: Send> Deque<T> {
         Deque {
             bottom: AtomicInt::new(0),
             top: AtomicInt::new(0),
-            array: AtomicPtr::new(unsafe { mem::transmute(buf) }),
+            array: AtomicPtr::new(unsafe { transmute(buf) }),
             pool: pool,
         }
     }
@@ -271,7 +271,7 @@ impl<T: Send> Deque<T> {
             return Some(data);
         } else {
             self.bottom.store(t + 1, SeqCst);
-            mem::forget(data); // someone else stole this value
+            forget(data); // someone else stole this value
             return None;
         }
     }
@@ -293,7 +293,7 @@ impl<T: Send> Deque<T> {
         if self.top.compare_and_swap(t, t + 1, SeqCst) == t {
             Data(data)
         } else {
-            mem::forget(data); // someone else stole this value
+            forget(data); // someone else stole this value
             Abort
         }
     }
@@ -314,7 +314,7 @@ impl<T: Send> Deque<T> {
     // continue to be read after we flag this buffer for reclamation.
     unsafe fn swap_buffer(&mut self, b: int, old: *mut Buffer<T>,
                           buf: Buffer<T>) -> *mut Buffer<T> {
-        let newbuf: *mut Buffer<T> = mem::transmute(box buf);
+        let newbuf: *mut Buffer<T> = transmute(box buf);
         self.array.store(newbuf, SeqCst);
         let ss = (*newbuf).size();
         self.bottom.store(b + ss, SeqCst);
@@ -322,7 +322,7 @@ impl<T: Send> Deque<T> {
         if self.top.compare_and_swap(t, t + ss, SeqCst) != t {
             self.bottom.store(b, SeqCst);
         }
-        self.pool.free(mem::transmute(old));
+        self.pool.free(transmute(old));
         return newbuf;
     }
 }
@@ -339,15 +339,19 @@ impl<T: Send> Drop for Deque<T> {
         for i in range(t, b) {
             let _: T = unsafe { (*a).get(i) };
         }
-        self.pool.free(unsafe { mem::transmute(a) });
+        self.pool.free(unsafe { transmute(a) });
     }
 }
 
+#[inline]
+fn buffer_alloc_size<T>(log_size: int) -> uint {
+    (1 << log_size) * size_of::<T>()
+}
+
 impl<T: Send> Buffer<T> {
     unsafe fn new(log_size: int) -> Buffer<T> {
-        let size = (1 << log_size) * mem::size_of::<T>();
-        let buffer = libc::malloc(size as libc::size_t);
-        assert!(!buffer.is_null());
+        let size = buffer_alloc_size::<T>(log_size);
+        let buffer = allocate(size, min_align_of::<T>());
         Buffer {
             storage: buffer as *T,
             log_size: log_size,
@@ -372,7 +376,7 @@ impl<T: Send> Buffer<T> {
     unsafe fn put(&mut self, i: int, t: T) {
         let ptr = self.storage.offset(i & self.mask());
         ptr::copy_nonoverlapping_memory(ptr as *mut T, &t as *T, 1);
-        mem::forget(t);
+        forget(t);
     }
 
     // Again, unsafe because this has incredibly dubious ownership violations.
@@ -390,7 +394,8 @@ impl<T: Send> Buffer<T> {
 impl<T: Send> Drop for Buffer<T> {
     fn drop(&mut self) {
         // It is assumed that all buffers are empty on drop.
-        unsafe { libc::free(self.storage as *mut libc::c_void) }
+        let size = buffer_alloc_size::<T>(self.log_size);
+        unsafe { deallocate(self.storage as *mut u8, size, min_align_of::<T>()) }
     }
 }
 
@@ -606,8 +611,7 @@ mod tests {
             let s = s.clone();
             let unique_box = box AtomicUint::new(0);
             let thread_box = unsafe {
-                *mem::transmute::<&Box<AtomicUint>,
-                                   **mut AtomicUint>(&unique_box)
+                *mem::transmute::<&Box<AtomicUint>, **mut AtomicUint>(&unique_box)
             };
             (Thread::start(proc() {
                 unsafe {