diff options
Diffstat (limited to 'components')
-rw-r--r-- | components/allocator/Cargo.toml | 18 | ||||
-rw-r--r-- | components/allocator/lib.rs | 62 | ||||
-rw-r--r-- | components/gfx/Cargo.toml | 1 | ||||
-rw-r--r-- | components/gfx/lib.rs | 4 | ||||
-rw-r--r-- | components/gfx/platform/freetype/font_context.rs | 16 | ||||
-rw-r--r-- | components/layout_thread/Cargo.toml | 1 | ||||
-rw-r--r-- | components/layout_thread/lib.rs | 5 | ||||
-rw-r--r-- | components/malloc_size_of/Cargo.toml | 3 | ||||
-rw-r--r-- | components/malloc_size_of/lib.rs | 31 | ||||
-rw-r--r-- | components/profile/Cargo.toml | 3 | ||||
-rw-r--r-- | components/profile/lib.rs | 7 | ||||
-rw-r--r-- | components/profile/mem.rs | 8 | ||||
-rw-r--r-- | components/script/Cargo.toml | 3 | ||||
-rw-r--r-- | components/script/lib.rs | 1 | ||||
-rw-r--r-- | components/script/script_thread.rs | 4 |
15 files changed, 107 insertions, 60 deletions
diff --git a/components/allocator/Cargo.toml b/components/allocator/Cargo.toml new file mode 100644 index 00000000000..fccec48a5e9 --- /dev/null +++ b/components/allocator/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "servo_allocator" +version = "0.0.1" +authors = ["The Servo Project Developers"] +license = "MPL-2.0" +publish = false + +[lib] +path = "lib.rs" + +[features] +unstable = ["kernel32-sys", "jemallocator"] + +[target.'cfg(not(windows))'.dependencies] +jemallocator = { version = "0.1.3", optional = true } + +[target.'cfg(windows)'.dependencies] +kernel32-sys = { version = "0.2.1", optional = true } diff --git a/components/allocator/lib.rs b/components/allocator/lib.rs new file mode 100644 index 00000000000..e832e485575 --- /dev/null +++ b/components/allocator/lib.rs @@ -0,0 +1,62 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +//! 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(feature = "unstable")] +#[global_allocator] +static ALLOC: platform::Allocator = platform::Allocator; + +pub use platform::usable_size; + + +#[cfg(all(feature = "unstable", not(windows)))] +mod platform { + extern crate jemallocator; + + pub use self::jemallocator::Jemalloc as Allocator; + use std::os::raw::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) + } +} + +#[cfg(all(feature = "unstable", windows))] +mod platform { + extern crate alloc_system; + extern crate kernel32; + + pub use self::alloc_system::System as Allocator; + use self::kernel32::{GetProcessHeap, HeapSize, HeapValidate}; + use std::os::raw::c_void; + + /// Get the size of a heap block. + pub unsafe extern "C" fn usable_size(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 + } +} + +#[cfg(not(feature = "unstable"))] +mod platform { + use std::os::raw::c_void; + + /// Without `#[global_allocator]` we cannot be certain of what allocator is used + /// or how it is linked. We therefore disable memory reporting. (Return zero.) + pub unsafe extern "C" fn usable_size(_ptr: *const c_void) -> usize { + 0 + } +} + + diff --git a/components/gfx/Cargo.toml b/components/gfx/Cargo.toml index 606d17c2908..d28c7b8f44a 100644 --- a/components/gfx/Cargo.toml +++ b/components/gfx/Cargo.toml @@ -53,6 +53,7 @@ core-text = "7.0" [target.'cfg(any(target_os = "linux", target_os = "android"))'.dependencies] freetype = "0.3" +servo_allocator = {path = "../allocator"} [target.'cfg(target_os = "linux")'.dependencies] servo-fontconfig = "0.2.1" diff --git a/components/gfx/lib.rs b/components/gfx/lib.rs index aa0c635bf53..418e8d7f897 100644 --- a/components/gfx/lib.rs +++ b/components/gfx/lib.rs @@ -27,8 +27,8 @@ extern crate fnv; #[cfg(target_os = "linux")] extern crate fontconfig; extern crate fontsan; -#[cfg(any(target_os = "linux", target_os = "android"))] -extern crate freetype; +#[cfg(any(target_os = "linux", target_os = "android"))] extern crate freetype; +#[cfg(any(target_os = "linux", target_os = "android"))] extern crate servo_allocator; extern crate gfx_traits; // Eventually we would like the shaper to be pluggable, as many operating systems have their own diff --git a/components/gfx/platform/freetype/font_context.rs b/components/gfx/platform/freetype/font_context.rs index c7deea5adf8..8456e2cade2 100644 --- a/components/gfx/platform/freetype/font_context.rs +++ b/components/gfx/platform/freetype/font_context.rs @@ -8,7 +8,8 @@ use freetype::freetype::FT_Library; use freetype::freetype::FT_Memory; use freetype::freetype::FT_MemoryRec_; use freetype::freetype::FT_New_Library; -use malloc_size_of::{malloc_size_of, MallocSizeOf, MallocSizeOfOps}; +use malloc_size_of::{MallocSizeOf, MallocSizeOfOps}; +use servo_allocator::usable_size; use std::mem; use std::os::raw::{c_long, c_void}; use std::ptr; @@ -31,7 +32,7 @@ extern fn ft_alloc(mem: FT_Memory, req_size: c_long) -> *mut c_void { mem::forget(vec); unsafe { - let actual_size = malloc_size_of(ptr as *const _); + let actual_size = usable_size(ptr as *const _); let user = (*mem).user as *mut User; (*user).size += actual_size; } @@ -41,7 +42,7 @@ extern fn ft_alloc(mem: FT_Memory, req_size: c_long) -> *mut c_void { extern fn ft_free(mem: FT_Memory, ptr: *mut c_void) { unsafe { - let actual_size = malloc_size_of(ptr as *const _); + let actual_size = usable_size(ptr as *const _); let user = (*mem).user as *mut User; (*user).size -= actual_size; @@ -50,13 +51,14 @@ extern fn ft_free(mem: FT_Memory, ptr: *mut c_void) { } } -extern fn ft_realloc(mem: FT_Memory, _cur_size: c_long, new_req_size: c_long, +extern fn ft_realloc(mem: FT_Memory, old_size: c_long, new_req_size: c_long, old_ptr: *mut c_void) -> *mut c_void { let old_actual_size; let mut vec; unsafe { - old_actual_size = malloc_size_of(old_ptr as *const _); - vec = Vec::<u8>::from_raw_parts(old_ptr as *mut u8, old_actual_size, old_actual_size); + old_actual_size = usable_size(old_ptr as *const _); + let old_size = old_size as usize; + vec = Vec::<u8>::from_raw_parts(old_ptr as *mut u8, old_size, old_size); }; let new_req_size = new_req_size as usize; @@ -71,7 +73,7 @@ extern fn ft_realloc(mem: FT_Memory, _cur_size: c_long, new_req_size: c_long, mem::forget(vec); unsafe { - let new_actual_size = malloc_size_of(new_ptr as *const _); + let new_actual_size = usable_size(new_ptr as *const _); let user = (*mem).user as *mut User; (*user).size += new_actual_size; (*user).size -= old_actual_size; diff --git a/components/layout_thread/Cargo.toml b/components/layout_thread/Cargo.toml index 35336e133ca..8683ad60942 100644 --- a/components/layout_thread/Cargo.toml +++ b/components/layout_thread/Cargo.toml @@ -40,6 +40,7 @@ script_layout_interface = {path = "../script_layout_interface"} script_traits = {path = "../script_traits"} selectors = { path = "../selectors" } serde_json = "1.0" +servo_allocator = {path = "../allocator"} servo_arc = {path = "../servo_arc"} servo_atoms = {path = "../atoms"} servo_config = {path = "../config"} diff --git a/components/layout_thread/lib.rs b/components/layout_thread/lib.rs index e7ce75db5c1..eba6c53b8ab 100644 --- a/components/layout_thread/lib.rs +++ b/components/layout_thread/lib.rs @@ -39,6 +39,7 @@ extern crate script_layout_interface; extern crate script_traits; extern crate selectors; extern crate serde_json; +extern crate servo_allocator; extern crate servo_arc; extern crate servo_atoms; extern crate servo_config; @@ -84,7 +85,7 @@ use layout::webrender_helpers::WebRenderDisplayListConverter; use layout::wrapper::LayoutNodeLayoutData; use layout_traits::LayoutThreadFactory; use libc::c_void; -use malloc_size_of::{malloc_size_of, MallocSizeOf, MallocSizeOfOps}; +use malloc_size_of::{MallocSizeOf, MallocSizeOfOps}; use metrics::{PaintTimeMetrics, ProfilerMetadataFactory}; use msg::constellation_msg::PipelineId; use msg::constellation_msg::TopLevelBrowsingContextId; @@ -775,7 +776,7 @@ impl LayoutThread { let mut reports = vec![]; // Servo uses vanilla jemalloc, which doesn't have a // malloc_enclosing_size_of function. - let mut ops = MallocSizeOfOps::new(malloc_size_of, None, None); + let mut ops = MallocSizeOfOps::new(::servo_allocator::usable_size, None, None); // FIXME(njn): Just measuring the display tree for now. let rw_data = possibly_locked_rw_data.lock(); diff --git a/components/malloc_size_of/Cargo.toml b/components/malloc_size_of/Cargo.toml index afc92cf53a9..05a8f4f4810 100644 --- a/components/malloc_size_of/Cargo.toml +++ b/components/malloc_size_of/Cargo.toml @@ -8,9 +8,6 @@ publish = false [lib] path = "lib.rs" -[target.'cfg(windows)'.dependencies] -kernel32-sys = "0.2.1" - [features] servo = ["js", "string_cache", "url", "webrender_api", "xml5ever"] diff --git a/components/malloc_size_of/lib.rs b/components/malloc_size_of/lib.rs index 48350e6f840..399f1180637 100644 --- a/components/malloc_size_of/lib.rs +++ b/components/malloc_size_of/lib.rs @@ -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 { diff --git a/components/profile/Cargo.toml b/components/profile/Cargo.toml index d00c0f5000d..6923b0540cf 100644 --- a/components/profile/Cargo.toml +++ b/components/profile/Cargo.toml @@ -10,7 +10,7 @@ name = "profile" path = "lib.rs" [features] -unstable = [] +unstable = ["jemalloc-sys"] [dependencies] profile_traits = {path = "../profile_traits"} @@ -31,3 +31,4 @@ regex = "0.2" [target.'cfg(not(target_os = "windows"))'.dependencies] libc = "0.2" +jemalloc-sys = {version = "0.1.3", optional = true} diff --git a/components/profile/lib.rs b/components/profile/lib.rs index 96b8edb7e17..d01aad61cd0 100644 --- a/components/profile/lib.rs +++ b/components/profile/lib.rs @@ -2,17 +2,14 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#![cfg_attr(all(feature = "unstable", not(target_os = "windows")), feature(alloc_jemalloc))] - #![deny(unsafe_code)] #[allow(unused_extern_crates)] -#[cfg(all(feature = "unstable", not(target_os = "windows")))] -extern crate alloc_jemalloc; extern crate heartbeats_simple; extern crate influent; extern crate ipc_channel; -#[allow(unused_extern_crates)] +#[cfg(all(feature = "unstable", not(target_os = "windows")))] +extern crate jemalloc_sys; #[cfg(not(target_os = "windows"))] extern crate libc; #[macro_use] diff --git a/components/profile/mem.rs b/components/profile/mem.rs index 39d3f3ad084..0c9a50ad99d 100644 --- a/components/profile/mem.rs +++ b/components/profile/mem.rs @@ -354,7 +354,7 @@ impl ReportsForest { mod system_reporter { #[cfg(all(feature = "unstable", not(target_os = "windows")))] - use libc::{c_char, c_void, size_t}; + use libc::{c_void, size_t}; #[cfg(target_os = "linux")] use libc::c_int; use profile_traits::mem::{Report, ReportKind, ReporterRequest}; @@ -460,11 +460,7 @@ mod system_reporter { } #[cfg(all(feature = "unstable", not(target_os = "windows")))] - extern { - #[cfg_attr(any(target_os = "macos", target_os = "android"), link_name = "je_mallctl")] - fn mallctl(name: *const c_char, oldp: *mut c_void, oldlenp: *mut size_t, - newp: *mut c_void, newlen: size_t) -> ::libc::c_int; - } + use jemalloc_sys::mallctl; #[cfg(all(feature = "unstable", not(target_os = "windows")))] fn jemalloc_stat(value_name: &str) -> Option<usize> { diff --git a/components/script/Cargo.toml b/components/script/Cargo.toml index 8c9e9613ede..191a325f60a 100644 --- a/components/script/Cargo.toml +++ b/components/script/Cargo.toml @@ -13,7 +13,7 @@ path = "lib.rs" [features] debugmozjs = ['js/debugmozjs'] -unstable = [] +unstable = ["servo_allocator/unstable"] [build-dependencies] cmake = "0.1" @@ -77,6 +77,7 @@ script_plugins = {path = "../script_plugins"} script_traits = {path = "../script_traits"} selectors = { path = "../selectors" } serde = "1.0" +servo_allocator = {path = "../allocator"} servo_arc = {path = "../servo_arc"} servo_atoms = {path = "../atoms"} servo_config = {path = "../config"} diff --git a/components/script/lib.rs b/components/script/lib.rs index edf954d4c96..df9679bcaf2 100644 --- a/components/script/lib.rs +++ b/components/script/lib.rs @@ -78,6 +78,7 @@ extern crate script_layout_interface; extern crate script_traits; extern crate selectors; extern crate serde; +extern crate servo_allocator; extern crate servo_arc; #[macro_use] extern crate servo_atoms; extern crate servo_config; diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index 354cc1928f7..8f17afaf9a7 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -73,7 +73,7 @@ use js::jsapi::{JSAutoCompartment, JSContext, JS_SetWrapObjectCallbacks}; use js::jsapi::{JSTracer, SetWindowProxyClass}; use js::jsval::UndefinedValue; use js::rust::Runtime; -use malloc_size_of::{malloc_size_of, MallocSizeOfOps}; +use malloc_size_of::MallocSizeOfOps; use mem::malloc_size_of_including_self; use metrics::PaintTimeMetrics; use microtask::{MicrotaskQueue, Microtask}; @@ -1506,7 +1506,7 @@ impl ScriptThread { let mut reports = vec![]; // Servo uses vanilla jemalloc, which doesn't have a // malloc_enclosing_size_of function. - let mut ops = MallocSizeOfOps::new(malloc_size_of, None, None); + let mut ops = MallocSizeOfOps::new(::servo_allocator::usable_size, None, None); for (_, document) in self.documents.borrow().iter() { let current_url = document.url(); |