v / vlib / runtime / free_memory_impl_freebsd.c.v
38 lines · 36 sloc · 1.02 KB · a87a4d73b9ab25cfff0822f4e94cf2a2d9e64323
Raw
1module runtime
2
3fn C.sysctlnametomib(name charptr, mib &int, len &usize) i32
4
5fn free_memory_impl() !usize {
6 $if cross ? {
7 return error('free_memory: not implemented')
8 }
9 $if !cross ? {
10 $if freebsd {
11 page_size := usize(C.sysconf(C._SC_PAGESIZE))
12 c_errno_1 := C.errno
13 if page_size == usize(-1) {
14 return error('free_memory: `C.sysconf()` return error code = ${c_errno_1}')
15 }
16 mut mib := [4]int{}
17 mut len := usize(4)
18 retval_2 := unsafe {
19 C.sysctlnametomib(c'vm.stats.vm.v_free_count', &mib[0], &len)
20 }
21 c_errno_2 := C.errno
22 if retval_2 == -1 {
23 return error('free_memory: `C.sysctlnametomib()` return error code = ${c_errno_2}')
24 }
25 mut free_pages := int(0)
26 bufsize := usize(4)
27 retval_3 := unsafe {
28 C.sysctl(&mib[0], mib.len, &free_pages, &bufsize, 0, 0)
29 }
30 c_errno_3 := C.errno
31 if retval_3 == -1 {
32 return error('free_memory: `C.sysctl()` return error code = ${c_errno_3}')
33 }
34 return page_size * usize(free_pages)
35 }
36 }
37 return error('free_memory: not implemented')
38}
39