| 1 | module runtime |
| 2 | |
| 3 | #include <sys/sysctl.h> |
| 4 | #include <uvm/uvmexp.h> |
| 5 | |
| 6 | struct C.uvmexp { |
| 7 | pagesize int |
| 8 | free int |
| 9 | } |
| 10 | |
| 11 | fn free_memory_impl() !usize { |
| 12 | $if cross ? { |
| 13 | return error('free_memory: not implemented') |
| 14 | } |
| 15 | $if !cross ? { |
| 16 | $if openbsd { |
| 17 | mib := [C.CTL_VM, C.VM_UVMEXP]! |
| 18 | mut uvm := C.uvmexp{0, 0} |
| 19 | mut len := usize(sizeof(C.uvmexp)) |
| 20 | retval := unsafe { C.sysctl(&mib[0], mib.len, &uvm, &len, C.NULL, 0) } |
| 21 | c_errno := C.errno |
| 22 | if retval == -1 { |
| 23 | return error('free_memory: `C.sysctl()` return error code = ${c_errno}') |
| 24 | } |
| 25 | return usize(uvm.pagesize) * usize(uvm.free) |
| 26 | } |
| 27 | } |
| 28 | return error('free_memory: not implemented') |
| 29 | } |
| 30 | |