about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2014-05-11 17:51:41 -0700
committerbors <bors@rust-lang.org>2014-05-11 17:51:41 -0700
commit72fc4a5eb72b8ba96dba66400c7eecac93b0b252 (patch)
treeb9bea326ff923ff3f5f54e8c57e4350203add0fb /src/libstd
parentb40c3e9d3dd0a6be4d048389d33435f82205d376 (diff)
parentf1735cefcfdee5260ea6961cf785f545a340ff85 (diff)
downloadrust-72fc4a5eb72b8ba96dba66400c7eecac93b0b252.tar.gz
rust-72fc4a5eb72b8ba96dba66400c7eecac93b0b252.zip
auto merge of #14119 : thestinger/rust/heap, r=cmr
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/rc.rs10
-rw-r--r--src/libstd/rt/heap.rs39
-rw-r--r--src/libstd/slice.rs8
3 files changed, 33 insertions, 24 deletions
diff --git a/src/libstd/rc.rs b/src/libstd/rc.rs
index bc489bc399f..87c2f826af5 100644
--- a/src/libstd/rc.rs
+++ b/src/libstd/rc.rs
@@ -33,7 +33,7 @@ use option::{Option, Some, None};
 use ptr;
 use ptr::RawPtr;
 use mem::{min_align_of, size_of};
-use rt::heap::exchange_free;
+use rt::heap::deallocate;
 
 struct RcBox<T> {
     value: T,
@@ -105,8 +105,8 @@ impl<T> Drop for Rc<T> {
                     self.dec_weak();
 
                     if self.weak() == 0 {
-                        exchange_free(self.ptr as *mut u8, size_of::<RcBox<T>>(),
-                                      min_align_of::<RcBox<T>>())
+                        deallocate(self.ptr as *mut u8, size_of::<RcBox<T>>(),
+                                   min_align_of::<RcBox<T>>())
                     }
                 }
             }
@@ -179,8 +179,8 @@ impl<T> Drop for Weak<T> {
                 // the weak count starts at 1, and will only go to
                 // zero if all the strong pointers have disappeared.
                 if self.weak() == 0 {
-                    exchange_free(self.ptr as *mut u8, size_of::<RcBox<T>>(),
-                                  min_align_of::<RcBox<T>>())
+                    deallocate(self.ptr as *mut u8, size_of::<RcBox<T>>(),
+                               min_align_of::<RcBox<T>>())
                 }
             }
         }
diff --git a/src/libstd/rt/heap.rs b/src/libstd/rt/heap.rs
index ffe6dccfa15..b729fb38035 100644
--- a/src/libstd/rt/heap.rs
+++ b/src/libstd/rt/heap.rs
@@ -12,8 +12,9 @@
 // FIXME: #13996: need a way to mark the `allocate` and `reallocate` return values as `noalias`
 
 use intrinsics::{abort, cttz32};
-use libc::{c_int, c_void, size_t};
-use ptr::RawPtr;
+use libc::{c_char, c_int, c_void, size_t};
+use ptr::{RawPtr, mut_null, null};
+use option::{None, Option};
 
 #[link(name = "jemalloc", kind = "static")]
 extern {
@@ -22,6 +23,9 @@ extern {
     fn je_xallocx(ptr: *mut c_void, size: size_t, extra: size_t, flags: c_int) -> size_t;
     fn je_dallocx(ptr: *mut c_void, flags: c_int);
     fn je_nallocx(size: size_t, flags: c_int) -> size_t;
+    fn je_malloc_stats_print(write_cb: Option<extern "C" fn(cbopaque: *mut c_void, *c_char)>,
+                             cbopaque: *mut c_void,
+                             opts: *c_char);
 }
 
 // -lpthread needs to occur after -ljemalloc, the earlier argument isn't enough
@@ -99,6 +103,16 @@ pub fn usable_size(size: uint, align: uint) -> uint {
     unsafe { je_nallocx(size as size_t, mallocx_align(align)) as uint }
 }
 
+/// Print implementation-defined allocator statistics.
+///
+/// These statistics may be inconsistent if other threads use the allocator during the call.
+#[unstable]
+pub fn stats_print() {
+    unsafe {
+        je_malloc_stats_print(None, mut_null(), null())
+    }
+}
+
 /// The allocator for unique pointers.
 #[cfg(stage0)]
 #[lang="exchange_malloc"]
@@ -151,13 +165,8 @@ pub unsafe fn exchange_malloc(size: uint, align: uint) -> *mut u8 {
 #[lang="exchange_free"]
 #[inline]
 // FIXME: #13994 (rustc should pass align and size here)
-pub unsafe fn exchange_free_(ptr: *mut u8) {
-    exchange_free(ptr, 0, 8)
-}
-
-#[inline]
-pub unsafe fn exchange_free(ptr: *mut u8, size: uint, align: uint) {
-    deallocate(ptr, size, align);
+unsafe fn exchange_free(ptr: *mut u8) {
+    deallocate(ptr, 0, 8);
 }
 
 // FIXME: #7496
@@ -179,8 +188,8 @@ unsafe fn closure_exchange_malloc(drop_glue: fn(*mut u8), size: uint, align: uin
 #[doc(hidden)]
 #[deprecated]
 #[cfg(stage0, not(test))]
-pub extern "C" fn rust_malloc(size: uint) -> *mut u8 {
-    unsafe { exchange_malloc(size) }
+pub unsafe extern "C" fn rust_malloc(size: uint) -> *mut u8 {
+    exchange_malloc(size)
 }
 
 // hack for libcore
@@ -188,8 +197,8 @@ pub extern "C" fn rust_malloc(size: uint) -> *mut u8 {
 #[doc(hidden)]
 #[deprecated]
 #[cfg(not(stage0), not(test))]
-pub extern "C" fn rust_malloc(size: uint, align: uint) -> *mut u8 {
-    unsafe { exchange_malloc(size, align) }
+pub unsafe extern "C" fn rust_malloc(size: uint, align: uint) -> *mut u8 {
+    exchange_malloc(size, align)
 }
 
 // hack for libcore
@@ -197,8 +206,8 @@ pub extern "C" fn rust_malloc(size: uint, align: uint) -> *mut u8 {
 #[doc(hidden)]
 #[deprecated]
 #[cfg(not(test))]
-pub extern "C" fn rust_free(ptr: *mut u8, size: uint, align: uint) {
-    unsafe { exchange_free(ptr, size, align) }
+pub unsafe extern "C" fn rust_free(ptr: *mut u8, size: uint, align: uint) {
+    deallocate(ptr, size, align)
 }
 
 #[cfg(test)]
diff --git a/src/libstd/slice.rs b/src/libstd/slice.rs
index b0868dd0daf..3c0d0efa766 100644
--- a/src/libstd/slice.rs
+++ b/src/libstd/slice.rs
@@ -109,7 +109,7 @@ use ops::Drop;
 use option::{None, Option, Some};
 use ptr::RawPtr;
 use ptr;
-use rt::heap::{exchange_malloc, exchange_free};
+use rt::heap::{exchange_malloc, deallocate};
 use unstable::finally::try_finally;
 use vec::Vec;
 
@@ -330,7 +330,7 @@ impl<'a, T: Clone> CloneableVector<T> for &'a [T] {
                         ptr::read(&*p.offset(j));
                     }
                     // FIXME: #13994 (should pass align and size here)
-                    exchange_free(ret as *mut u8, 0, 8);
+                    deallocate(ret as *mut u8, 0, 8);
                 });
             mem::transmute(ret)
         }
@@ -377,7 +377,7 @@ impl<'a, T: Clone> CloneableVector<T> for &'a [T] {
                         ptr::read(&*p.offset(j));
                     }
                     // FIXME: #13994 (should pass align and size here)
-                    exchange_free(ret as *mut u8, 0, 8);
+                    deallocate(ret as *mut u8, 0, 8);
                 });
             mem::transmute(ret)
         }
@@ -817,7 +817,7 @@ impl<T> Drop for MoveItems<T> {
         for _x in *self {}
         unsafe {
             // FIXME: #13994 (should pass align and size here)
-            exchange_free(self.allocation, 0, 8)
+            deallocate(self.allocation, 0, 8)
         }
     }
 }