v / vlib / runtime / used_memory_freebsd.c.v
62 lines · 51 sloc · 1.25 KB · a87a4d73b9ab25cfff0822f4e94cf2a2d9e64323
Raw
1module runtime
2
3import os
4
5$if tinyc {
6 #include <sys/resource.h>
7}
8struct C.rusage {
9 ru_maxrss int
10 ru_idrss int
11}
12
13fn C.getrusage(who i32, usage &C.rusage) i32
14
15$if !tinyc {
16 #flag -lprocstat
17
18 #include <sys/user.h>
19 #include <libprocstat.h>
20}
21struct C.procstat {}
22
23struct C.kinfo_proc {
24 ki_rssize u64
25}
26
27fn C.procstat_open_sysctl() &C.procstat
28fn C.procstat_close(&C.procstat)
29fn C.procstat_getprocs(&C.procstat, i32, i32, &u32) &C.kinfo_proc
30
31// used_memory retrieves the current physical memory usage of the process.
32pub fn used_memory() !u64 {
33 page_size := usize(C.sysconf(C._SC_PAGESIZE))
34 c_errno_1 := C.errno
35 if page_size == usize(-1) {
36 return error('used_memory: C.sysconf() return error code = ${c_errno_1}')
37 }
38 $if tinyc {
39 mut usage := C.rusage{}
40 x := C.getrusage(0, &usage)
41 if x == -1 {
42 c_errno_2 := C.errno
43 return error('used_memory: C.getrusage() return error code = ${c_errno_2}')
44 }
45 return u64(int_max(1, usage.ru_maxrss)) * 1024
46 } $else {
47 mut proc_status := C.procstat_open_sysctl()
48 defer {
49 C.procstat_close(proc_status)
50 }
51
52 mut count := u32(0)
53
54 kip := C.procstat_getprocs(proc_status, C.KERN_PROC_PID | C.KERN_PROC_INC_THREAD,
55 os.getpid(), &count)
56
57 if kip != 0 {
58 return u64(kip.ki_rssize * page_size)
59 }
60 }
61 return 0
62}
63