aboutsummaryrefslogtreecommitdiff
path: root/v_windows/v/vlib/builtin/linux_bare/memory_managment.v
blob: 9c23dcfc32fe0d6c1951734c4bf07e0ee54d1e1e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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))
	}
}