30 lines
750 B
V
30 lines
750 B
V
module builtin
|
|
|
|
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
|
|
|
|
a, e := sys_mmap(&byte(0), size + sizeof(u64), mem_prot, map_flags, -1, 0)
|
|
if e == .enoerror {
|
|
unsafe {
|
|
mut ap := &u64(a)
|
|
*ap = size
|
|
x2 := &byte(a + sizeof(u64))
|
|
return x2, e
|
|
}
|
|
}
|
|
return &byte(0), e
|
|
}
|
|
|
|
fn mm_free(addr &byte) Errno {
|
|
unsafe {
|
|
ap := &u64(addr - sizeof(u64))
|
|
size := *ap
|
|
return sys_munmap(addr - sizeof(u64), size + sizeof(u64))
|
|
}
|
|
}
|