panicbit
8 years ago
2 changed files with 101 additions and 0 deletions
@ -0,0 +1,100 @@ |
|||||||
|
// Copyright 2014-2015 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
use alloc::allocator::{Alloc,Layout,AllocErr,Excess,CannotReallocInPlace}; |
||||||
|
use alloc::heap; |
||||||
|
|
||||||
|
/// Heap allocator that delegates to the default liballoc heap allocator.
|
||||||
|
/// Its purpose is to override methods while still using the standard alloc api.
|
||||||
|
#[derive(Copy, Clone, Default, Debug)] |
||||||
|
pub struct Heap; |
||||||
|
|
||||||
|
unsafe impl Alloc for Heap { |
||||||
|
#[inline] |
||||||
|
unsafe fn alloc(&mut self, layout: Layout) -> Result<*mut u8, AllocErr> { |
||||||
|
heap::Heap.alloc(layout) |
||||||
|
} |
||||||
|
|
||||||
|
// A nicer handler for out-of-memory situations than the default one. This
|
||||||
|
// one prints a message to stderr before aborting. It is critical that this
|
||||||
|
// code does not allocate any memory since we are in an OOM situation. Any
|
||||||
|
// errors are ignored while printing since there's nothing we can do about
|
||||||
|
// them and we are about to exit anyways.
|
||||||
|
#[inline] |
||||||
|
fn oom(&mut self, err: AllocErr) -> ! { |
||||||
|
use intrinsics; |
||||||
|
use libc::{self, STDERR_FILENO, c_void}; |
||||||
|
|
||||||
|
let msg = err.description(); |
||||||
|
unsafe { |
||||||
|
libc::write(STDERR_FILENO, msg.as_ptr() as *const c_void, msg.len()); |
||||||
|
libc::write(STDERR_FILENO, "\n".as_ptr() as *const c_void, 1); |
||||||
|
intrinsics::abort(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
#[inline] |
||||||
|
unsafe fn dealloc(&mut self, ptr: *mut u8, layout: Layout) { |
||||||
|
heap::Heap.dealloc(ptr, layout) |
||||||
|
} |
||||||
|
|
||||||
|
#[inline] |
||||||
|
fn usable_size(&self, layout: &Layout) -> (usize, usize) { |
||||||
|
heap::Heap.usable_size(layout) |
||||||
|
} |
||||||
|
|
||||||
|
#[inline] |
||||||
|
unsafe fn realloc(&mut self, |
||||||
|
ptr: *mut u8, |
||||||
|
layout: Layout, |
||||||
|
new_layout: Layout) |
||||||
|
-> Result<*mut u8, AllocErr> |
||||||
|
{ |
||||||
|
heap::Heap.realloc(ptr, layout, new_layout) |
||||||
|
} |
||||||
|
|
||||||
|
#[inline] |
||||||
|
unsafe fn alloc_zeroed(&mut self, layout: Layout) -> Result<*mut u8, AllocErr> { |
||||||
|
heap::Heap.alloc_zeroed(layout) |
||||||
|
} |
||||||
|
|
||||||
|
#[inline] |
||||||
|
unsafe fn alloc_excess(&mut self, layout: Layout) -> Result<Excess, AllocErr> { |
||||||
|
heap::Heap.alloc_excess(layout) |
||||||
|
} |
||||||
|
|
||||||
|
#[inline] |
||||||
|
unsafe fn realloc_excess(&mut self, |
||||||
|
ptr: *mut u8, |
||||||
|
layout: Layout, |
||||||
|
new_layout: Layout) -> Result<Excess, AllocErr> |
||||||
|
{ |
||||||
|
heap::Heap.realloc_excess(ptr, layout, new_layout) |
||||||
|
} |
||||||
|
|
||||||
|
#[inline] |
||||||
|
unsafe fn grow_in_place(&mut self, |
||||||
|
ptr: *mut u8, |
||||||
|
layout: Layout, |
||||||
|
new_layout: Layout) |
||||||
|
-> Result<(), CannotReallocInPlace> |
||||||
|
{ |
||||||
|
heap::Heap.grow_in_place(ptr, layout, new_layout) |
||||||
|
} |
||||||
|
|
||||||
|
#[inline] |
||||||
|
unsafe fn shrink_in_place(&mut self, |
||||||
|
ptr: *mut u8, |
||||||
|
layout: Layout, |
||||||
|
new_layout: Layout) -> Result<(), CannotReallocInPlace> |
||||||
|
{ |
||||||
|
heap::Heap.shrink_in_place(ptr, layout, new_layout) |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue