mirror of
https://github.com/servo/servo.git
synced 2025-08-05 05:30:08 +01:00
Stop relying on linking details of std’s default allocator
We’ve been bitten before by symbol names changing: https://github.com/servo/heapsize/pull/46 and upstream is planning to stop using jemalloc by default: https://github.com/rust-lang/rust/issues/33082#issuecomment-309781465 So use the (relatively) new `#[global_allocator]` attribute to explicitly select the system allocator on Windows and jemalloc (now in an external crate) on other platforms. This choice matches current defaults.
This commit is contained in:
parent
4c538b642e
commit
959ce482dd
20 changed files with 158 additions and 62 deletions
|
@ -49,8 +49,6 @@ extern crate euclid;
|
|||
extern crate hashglobe;
|
||||
#[cfg(feature = "servo")]
|
||||
extern crate js;
|
||||
#[cfg(target_os = "windows")]
|
||||
extern crate kernel32;
|
||||
extern crate servo_arc;
|
||||
extern crate smallbitvec;
|
||||
extern crate smallvec;
|
||||
|
@ -63,8 +61,6 @@ extern crate webrender_api;
|
|||
#[cfg(feature = "servo")]
|
||||
extern crate xml5ever;
|
||||
|
||||
#[cfg(target_os = "windows")]
|
||||
use kernel32::{GetProcessHeap, HeapSize, HeapValidate};
|
||||
use std::hash::{BuildHasher, Hash};
|
||||
use std::mem::size_of;
|
||||
use std::ops::Range;
|
||||
|
@ -146,33 +142,6 @@ impl MallocSizeOfOps {
|
|||
}
|
||||
}
|
||||
|
||||
/// Get the size of a heap block.
|
||||
#[cfg(not(target_os = "windows"))]
|
||||
pub unsafe extern "C" fn malloc_size_of(ptr: *const c_void) -> usize {
|
||||
// The C prototype is `je_malloc_usable_size(JEMALLOC_USABLE_SIZE_CONST void *ptr)`. On some
|
||||
// platforms `JEMALLOC_USABLE_SIZE_CONST` is `const` and on some it is empty. But in practice
|
||||
// this function doesn't modify the contents of the block that `ptr` points to, so we use
|
||||
// `*const c_void` here.
|
||||
extern "C" {
|
||||
#[cfg_attr(any(prefixed_jemalloc, target_os = "macos", target_os = "ios", target_os = "android"),
|
||||
link_name = "je_malloc_usable_size")]
|
||||
fn malloc_usable_size(ptr: *const c_void) -> usize;
|
||||
}
|
||||
malloc_usable_size(ptr)
|
||||
}
|
||||
|
||||
/// Get the size of a heap block.
|
||||
#[cfg(target_os = "windows")]
|
||||
pub unsafe extern "C" fn malloc_size_of(mut ptr: *const c_void) -> usize {
|
||||
let heap = GetProcessHeap();
|
||||
|
||||
if HeapValidate(heap, 0, ptr) == 0 {
|
||||
ptr = *(ptr as *const *const c_void).offset(-1);
|
||||
}
|
||||
|
||||
HeapSize(heap, 0, ptr) as usize
|
||||
}
|
||||
|
||||
/// Trait for measuring the "deep" heap usage of a data structure. This is the
|
||||
/// most commonly-used of the traits.
|
||||
pub trait MallocSizeOf {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue