2021-04-14 08:50:50 +03:00
|
|
|
module builtin
|
|
|
|
|
2022-01-06 15:10:37 +03:00
|
|
|
import dlmalloc
|
|
|
|
|
2021-04-14 08:50:50 +03:00
|
|
|
fn mm_alloc(size u64) (&byte, Errno) {
|
|
|
|
// BEGIN CONSTS
|
|
|
|
// the constants need to be here, since the initialization of other constants,
|
|
|
|
// which happen before these ones would, require malloc
|
|
|
|
mem_prot := MemProt(int(MemProt.prot_read) | int(MemProt.prot_write))
|
|
|
|
map_flags := MapFlags(int(MapFlags.map_private) | int(MapFlags.map_anonymous))
|
|
|
|
// END CONSTS
|
|
|
|
|
2022-04-15 14:58:56 +03:00
|
|
|
a, e := sys_mmap(&u8(0), size + sizeof(u64), mem_prot, map_flags, -1, 0)
|
2021-04-14 08:50:50 +03:00
|
|
|
if e == .enoerror {
|
|
|
|
unsafe {
|
|
|
|
mut ap := &u64(a)
|
|
|
|
*ap = size
|
2022-04-15 14:58:56 +03:00
|
|
|
x2 := &u8(a + sizeof(u64))
|
2021-04-14 08:50:50 +03:00
|
|
|
return x2, e
|
|
|
|
}
|
|
|
|
}
|
2022-04-15 14:58:56 +03:00
|
|
|
return &u8(0), e
|
2021-04-14 08:50:50 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
fn mm_free(addr &byte) Errno {
|
|
|
|
unsafe {
|
|
|
|
ap := &u64(addr - sizeof(u64))
|
|
|
|
size := *ap
|
|
|
|
return sys_munmap(addr - sizeof(u64), size + sizeof(u64))
|
|
|
|
}
|
|
|
|
}
|
2022-01-06 15:10:37 +03:00
|
|
|
|
|
|
|
fn system_alloc(_ voidptr, size usize) (voidptr, usize, u32) {
|
|
|
|
// BEGIN CONSTS
|
|
|
|
// the constants need to be here, since the initialization of other constants,
|
|
|
|
// which happen before these ones would, require malloc
|
|
|
|
mem_prot := MemProt(int(MemProt.prot_read) | int(MemProt.prot_write))
|
|
|
|
map_flags := MapFlags(int(MapFlags.map_private) | int(MapFlags.map_anonymous))
|
|
|
|
// END CONSTS
|
|
|
|
|
2022-04-15 14:58:56 +03:00
|
|
|
a, e := sys_mmap(&u8(0), u64(size), mem_prot, map_flags, -1, 0)
|
2022-01-06 15:10:37 +03:00
|
|
|
|
|
|
|
if e == .enoerror {
|
|
|
|
return a, size, 0
|
|
|
|
}
|
|
|
|
return voidptr(0), 0, 0
|
|
|
|
}
|
|
|
|
|
|
|
|
fn system_remap(_ voidptr, ptr voidptr, oldsize usize, newsize usize, can_move bool) voidptr {
|
|
|
|
return voidptr(0)
|
|
|
|
}
|
|
|
|
|
|
|
|
fn system_free_part(_ voidptr, ptr voidptr, oldsize usize, newsize usize) bool {
|
|
|
|
_, e := sys_mremap(ptr, u64(oldsize), u64(newsize), 0)
|
|
|
|
if e == .enoerror {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
e2 := sys_munmap(voidptr(usize(ptr) + newsize), u64(oldsize - newsize))
|
|
|
|
|
|
|
|
return e2 == .enoerror
|
|
|
|
}
|
|
|
|
|
|
|
|
fn system_free(_ voidptr, ptr voidptr, size usize) bool {
|
|
|
|
unsafe {
|
|
|
|
return sys_munmap(ptr, u64(size)) == .enoerror
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn system_can_release_part(_ voidptr, _ u32) bool {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
fn system_allocates_zeros(_ voidptr) bool {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
fn system_page_size(_ voidptr) usize {
|
|
|
|
return 4096
|
|
|
|
}
|
|
|
|
|
|
|
|
fn get_linux_allocator() dlmalloc.Allocator {
|
|
|
|
return dlmalloc.Allocator{
|
|
|
|
alloc: system_alloc
|
|
|
|
remap: system_remap
|
|
|
|
free_part: system_free_part
|
|
|
|
free_: system_free
|
|
|
|
can_release_part: system_can_release_part
|
|
|
|
allocates_zeros: system_allocates_zeros
|
|
|
|
page_size: system_page_size
|
|
|
|
data: voidptr(0)
|
|
|
|
}
|
|
|
|
}
|