Skip to content

Commit

Permalink
Fork the jemallocator crate, fix for nightly-2018-04-15
Browse files Browse the repository at this point in the history
CC https://github.com/alexcrichton/jemallocator/pull/40,
rust-lang/rust#49669

The new version of jemallocator requires a more recent jemalloc
https://github.com/alexcrichton/jemallocator/pull/34
which doesn’t build on our current Android toolchain
jemalloc/jemalloc#1175.

To avoid blocking on figuring that out, duplicate ~70 lines
from jemallocator and use the older jemalloc-sys directly.
  • Loading branch information
SimonSapin authored and Moggers committed Jun 13, 2018
1 parent 2c14584 commit b41cc6f
Show file tree
Hide file tree
Showing 4 changed files with 81 additions and 21 deletions.
12 changes: 1 addition & 11 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions components/allocator/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@ publish = false
path = "lib.rs"

[features]
unstable = ["kernel32-sys", "jemallocator"]
unstable = ["kernel32-sys", "jemalloc-sys"]

[dependencies]
libc = "0.2" # Only used when 'unstable' is disabled, but looks like Cargo cannot express that.

[target.'cfg(not(windows))'.dependencies]
jemallocator = { version = "0.1.4", optional = true }
jemalloc-sys = { version = "0.1.4", optional = true }

[target.'cfg(windows)'.dependencies]
kernel32-sys = { version = "0.2.1", optional = true }
84 changes: 77 additions & 7 deletions components/allocator/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,7 @@

//! Selecting the default global allocator for Servo

#![cfg_attr(all(feature = "unstable", windows), feature(alloc_system, allocator_api))]
#![cfg_attr(feature = "unstable", feature(global_allocator))]
#![cfg_attr(feature = "unstable", feature(global_allocator, allocator_api, alloc_system))]

#[cfg(feature = "unstable")]
#[global_allocator]
Expand All @@ -16,19 +15,90 @@ pub use platform::*;

#[cfg(all(feature = "unstable", not(windows)))]
mod platform {
extern crate jemallocator;
extern crate jemalloc_sys as ffi;

pub use self::jemallocator::Jemalloc as Allocator;
use std::os::raw::c_void;
use std::alloc::{GlobalAlloc, Layout, Opaque, System};
use std::os::raw::{c_int, c_void};

/// Get the size of a heap block.
pub unsafe extern "C" fn usable_size(ptr: *const c_void) -> usize {
jemallocator::usable_size(ptr)
ffi::malloc_usable_size(ptr as *const _)
}

/// Memory allocation APIs compatible with libc
pub mod libc_compat {
pub use super::jemallocator::ffi::{malloc, realloc, free};
pub use super::ffi::{malloc, realloc, free};
}

pub struct Allocator;

// The minimum alignment guaranteed by the architecture. This value is used to
// add fast paths for low alignment values.
#[cfg(all(any(target_arch = "arm",
target_arch = "mips",
target_arch = "mipsel",
target_arch = "powerpc")))]
const MIN_ALIGN: usize = 8;
#[cfg(all(any(target_arch = "x86",
target_arch = "x86_64",
target_arch = "aarch64",
target_arch = "powerpc64",
target_arch = "powerpc64le",
target_arch = "mips64",
target_arch = "s390x",
target_arch = "sparc64")))]
const MIN_ALIGN: usize = 16;

fn layout_to_flags(align: usize, size: usize) -> c_int {
// If our alignment is less than the minimum alignment they we may not
// have to pass special flags asking for a higher alignment. If the
// alignment is greater than the size, however, then this hits a sort of odd
// case where we still need to ask for a custom alignment. See #25 for more
// info.
if align <= MIN_ALIGN && align <= size {
0
} else {
// Equivalent to the MALLOCX_ALIGN(a) macro.
align.trailing_zeros() as _
}
}

unsafe impl GlobalAlloc for Allocator {
#[inline]
unsafe fn alloc(&self, layout: Layout) -> *mut Opaque {
let flags = layout_to_flags(layout.align(), layout.size());
ffi::mallocx(layout.size(), flags) as *mut Opaque
}

#[inline]
unsafe fn alloc_zeroed(&self, layout: Layout) -> *mut Opaque {
if layout.align() <= MIN_ALIGN && layout.align() <= layout.size() {
ffi::calloc(1, layout.size()) as *mut Opaque
} else {
let flags = layout_to_flags(layout.align(), layout.size()) | ffi::MALLOCX_ZERO;
ffi::mallocx(layout.size(), flags) as *mut Opaque
}
}

#[inline]
unsafe fn dealloc(&self, ptr: *mut Opaque, layout: Layout) {
let flags = layout_to_flags(layout.align(), layout.size());
ffi::sdallocx(ptr as *mut _, layout.size(), flags)
}

#[inline]
unsafe fn realloc(&self,
ptr: *mut Opaque,
layout: Layout,
new_size: usize) -> *mut Opaque {
let flags = layout_to_flags(layout.align(), new_size);
ffi::rallocx(ptr as *mut _, new_size, flags) as *mut Opaque
}

#[inline]
fn oom(&self) -> ! {
System.oom()
}
}
}

Expand Down
2 changes: 1 addition & 1 deletion rust-toolchain
Original file line number Diff line number Diff line change
@@ -1 +1 @@
nightly-2018-04-08
nightly-2018-04-15

0 comments on commit b41cc6f

Please sign in to comment.