Skip to content

jemalloc improvements #14119

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
May 12, 2014
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,4 @@
src/etc/pkg/rust-logo.ico binary
src/etc/pkg/rust-logo.png binary
src/rt/msvc/* -whitespace
src/rt/vg/* -whitespace
src/rt/valgrind/* -whitespace
2 changes: 1 addition & 1 deletion mk/dist.mk
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ LICENSE.txt: $(S)COPYRIGHT $(S)LICENSE-APACHE $(S)LICENSE-MIT
PKG_TAR = dist/$(PKG_NAME).tar.gz

PKG_GITMODULES := $(S)src/libuv $(S)src/llvm $(S)src/gyp $(S)src/compiler-rt \
$(S)src/rt/hoedown
$(S)src/rt/hoedown $(S)src/jemalloc
PKG_FILES := \
$(S)COPYRIGHT \
$(S)LICENSE-APACHE \
Expand Down
1 change: 1 addition & 0 deletions mk/rt.mk
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,7 @@ $$(JEMALLOC_LIB_$(1)): $$(JEMALLOC_DEPS) $$(MKFILE_DEPS)
CC="$$(CC_$(1))" \
AR="$$(AR_$(1))" \
RANLIB="$$(AR_$(1)) s" \
CPPFLAGS="-I $(S)src/rt/" \
EXTRA_CFLAGS="$$(CFG_CFLAGS_$(1))"
$$(Q)$$(MAKE) -C "$$(JEMALLOC_BUILD_DIR_$(1))" build_lib_static
$$(Q)cp $$(JEMALLOC_BUILD_DIR_$(1))/lib/$$(JEMALLOC_REAL_NAME_$(1)) $$(JEMALLOC_LIB_$(1))
Expand Down
4 changes: 2 additions & 2 deletions mk/tests.mk
Original file line number Diff line number Diff line change
Expand Up @@ -227,8 +227,8 @@ ALL_HS := $(wildcard $(S)src/rt/*.h \
$(S)src/rt/*/*.h \
$(S)src/rt/*/*/*.h \
$(S)src/rustllvm/*.h)
ALL_HS := $(filter-out $(S)src/rt/vg/valgrind.h \
$(S)src/rt/vg/memcheck.h \
ALL_HS := $(filter-out $(S)src/rt/valgrind/valgrind.h \
$(S)src/rt/valgrind/memcheck.h \
$(S)src/rt/msvc/typeof.h \
$(S)src/rt/msvc/stdint.h \
$(S)src/rt/msvc/inttypes.h \
Expand Down
10 changes: 5 additions & 5 deletions src/libstd/rc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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>>())
}
}
}
Expand Down Expand Up @@ -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>>())
}
}
}
Expand Down
39 changes: 24 additions & 15 deletions src/libstd/rt/heap.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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
Expand Down Expand Up @@ -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() {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Future improvement: maybe this could take a &mut Writer; possibly with a helper function that passes &mut std::io::stderr() (or stdout)?

(This would allow it to be "logged" rather than just dumped to console.)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, that would make sense. The je_mallctl function would also be useful as an #[unstable] unsafe function along with some safe (and possibly not forever #[unstable]) wrappers.

unsafe {
je_malloc_stats_print(None, mut_null(), null())
}
}

/// The allocator for unique pointers.
#[cfg(stage0)]
#[lang="exchange_malloc"]
Expand Down Expand Up @@ -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
Expand All @@ -179,26 +188,26 @@ 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
#[no_mangle]
#[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
#[no_mangle]
#[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)]
Expand Down
8 changes: 4 additions & 4 deletions src/libstd/slice.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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)
}
Expand Down Expand Up @@ -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)
}
Expand Down Expand Up @@ -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)
}
}
}
Expand Down
10 changes: 5 additions & 5 deletions src/libsync/arc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@

use std::mem;
use std::ptr;
use std::rt::heap::exchange_free;
use std::rt::heap::deallocate;
use std::sync::atomics;
use std::mem::{min_align_of, size_of};

Expand Down Expand Up @@ -191,8 +191,8 @@ impl<T: Share + Send> Drop for Arc<T> {

if self.inner().weak.fetch_sub(1, atomics::Release) == 1 {
atomics::fence(atomics::Acquire);
unsafe { exchange_free(self.x as *mut u8, size_of::<ArcInner<T>>(),
min_align_of::<ArcInner<T>>()) }
unsafe { deallocate(self.x as *mut u8, size_of::<ArcInner<T>>(),
min_align_of::<ArcInner<T>>()) }
}
}
}
Expand Down Expand Up @@ -242,8 +242,8 @@ impl<T: Share + Send> Drop for Weak<T> {
// the memory orderings
if self.inner().weak.fetch_sub(1, atomics::Release) == 1 {
atomics::fence(atomics::Acquire);
unsafe { exchange_free(self.x as *mut u8, size_of::<ArcInner<T>>(),
min_align_of::<ArcInner<T>>()) }
unsafe { deallocate(self.x as *mut u8, size_of::<ArcInner<T>>(),
min_align_of::<ArcInner<T>>()) }
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/rt/rust_builtin.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

/* Foreign builtins. */

#include "vg/valgrind.h"
#include "valgrind/valgrind.h"

#include <stdint.h>
#include <time.h>
Expand Down
File renamed without changes.
File renamed without changes.