5 pub unsafe fn alloc(size
: usize) -> (*mut u8, usize, u32) {
6 let addr
= libc
::mmap(0 as *mut _
,
8 libc
::PROT_WRITE
| libc
::PROT_READ
,
9 libc
::MAP_ANONYMOUS
| libc
::MAP_PRIVATE
,
12 if addr
== libc
::MAP_FAILED
{
13 (ptr
::null_mut(), 0, 0)
15 (addr
as *mut u8, size
, 0)
19 pub unsafe fn remap(ptr
: *mut u8, oldsize
: usize, newsize
: usize, can_move
: bool
)
22 let flags
= if can_move { libc::MREMAP_MAYMOVE }
else { 0 }
;
23 let ptr
= libc
::mremap(ptr
as *mut _
, oldsize
, newsize
, flags
);
24 if ptr
== libc
::MAP_FAILED
{
31 pub unsafe fn free_part(ptr
: *mut u8, oldsize
: usize, newsize
: usize) -> bool
{
32 let rc
= libc
::mremap(ptr
as *mut _
, oldsize
, newsize
, 0);
33 if rc
!= libc
::MAP_FAILED
{
36 libc
::munmap(ptr
.offset(newsize
as isize) as *mut _
, oldsize
- newsize
) == 0
39 pub unsafe fn free(ptr
: *mut u8, size
: usize) -> bool
{
40 libc
::munmap(ptr
as *mut _
, size
) == 0
43 pub fn can_release_part(_flags
: u32) -> bool
{
47 static mut LOCK
: libc
::pthread_mutex_t
= libc
::PTHREAD_MUTEX_INITIALIZER
;
49 pub fn acquire_global_lock() {
51 assert_eq
!(libc
::pthread_mutex_lock(&mut LOCK
), 0)
55 pub fn release_global_lock() {
57 assert_eq
!(libc
::pthread_mutex_unlock(&mut LOCK
), 0)
61 pub fn allocates_zeros() -> bool
{
65 pub fn page_size() -> usize {