Clean up malloc
This commit is contained in:
+18
-20
@@ -310,27 +310,10 @@ pub extern "C" fn lrand48() -> c_long {
|
||||
unimplemented!();
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn malloc(size: size_t) -> *mut c_void {
|
||||
let align = 8;
|
||||
let ptr = ralloc::alloc(size + 16, align);
|
||||
if !ptr.is_null() {
|
||||
*(ptr as *mut u64) = (size + 16) as u64;
|
||||
*(ptr as *mut u64).offset(1) = align as u64;
|
||||
ptr.offset(16) as *mut c_void
|
||||
} else {
|
||||
ptr as *mut c_void
|
||||
}
|
||||
}
|
||||
unsafe fn malloc_inner(size: usize, offset: usize, align: usize) -> *mut c_void {
|
||||
assert!(offset >= 16);
|
||||
assert!(align >= 8);
|
||||
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn memalign(alignment: size_t, size: size_t) -> *mut c_void {
|
||||
let mut align = 16;
|
||||
while align <= alignment {
|
||||
align *= 2;
|
||||
}
|
||||
|
||||
let offset = align/2;
|
||||
let ptr = ralloc::alloc(size + offset, align);
|
||||
if !ptr.is_null() {
|
||||
*(ptr as *mut u64) = (size + offset) as u64;
|
||||
@@ -341,6 +324,21 @@ pub unsafe extern "C" fn memalign(alignment: size_t, size: size_t) -> *mut c_voi
|
||||
}
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn malloc(size: size_t) -> *mut c_void {
|
||||
malloc_inner(size, 16, 8)
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn memalign(alignment: size_t, size: size_t) -> *mut c_void {
|
||||
let mut align = 16;
|
||||
while align <= alignment as usize {
|
||||
align *= 2;
|
||||
}
|
||||
|
||||
malloc_inner(size, align/2, align)
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn mblen(s: *const c_char, n: size_t) -> c_int {
|
||||
unimplemented!();
|
||||
|
||||
Reference in New Issue
Block a user