зеркало из https://github.com/mozilla/gecko-dev.git
72 строки
2.1 KiB
Rust
72 строки
2.1 KiB
Rust
/* 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: Allocator = Allocator;
|
|
|
|
pub use platform::*;
|
|
|
|
|
|
#[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)
|
|
}
|
|
|
|
/// Memory allocation APIs compatible with libc
|
|
pub mod libc_compat {
|
|
pub use super::jemallocator::ffi::{malloc, realloc, free};
|
|
}
|
|
}
|
|
|
|
#[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
|
|
}
|
|
|
|
/// Memory allocation APIs compatible with libc
|
|
pub mod libc_compat {
|
|
extern crate libc;
|
|
pub use self::libc::{malloc, realloc, free};
|
|
}
|
|
}
|