diff --git a/vlib/runtime/used_memory_default.c.v b/vlib/runtime/used_memory_default.c.v index afadb19d91..4594ed7220 100644 --- a/vlib/runtime/used_memory_default.c.v +++ b/vlib/runtime/used_memory_default.c.v @@ -1,8 +1,8 @@ module runtime // used_memory retrieves the current physical memory usage of the process. -// Note: implementation available only on FreeBSD, macOS, Linux and Windows. Otherwise, -// returns 'used_memory: not implemented'. +// Note: implementation available only on FreeBSD, macOS, Linux, OpenBSD and +// Windows. Otherwise, returns 'used_memory: not implemented'. pub fn used_memory() !u64 { return error('used_memory: not implemented') } diff --git a/vlib/runtime/used_memory_openbsd.c.v b/vlib/runtime/used_memory_openbsd.c.v new file mode 100644 index 0000000000..c08acceae9 --- /dev/null +++ b/vlib/runtime/used_memory_openbsd.c.v @@ -0,0 +1,26 @@ +module runtime + +#include + +struct C.rusage { + ru_maxrss int +} + +fn C.getrusage(who int, usage &C.rusage) int + +// used_memory retrieves the current physical memory usage of the process. +pub fn used_memory() !u64 { + page_size := usize(C.sysconf(C._SC_PAGESIZE)) + c_errno_1 := C.errno + if page_size == usize(-1) { + return error('used_memory: C.sysconf() return error code = ${c_errno_1}') + } + + mut usage := C.rusage{} + ret := C.getrusage(C.RUSAGE_SELF, &usage) + if ret == -1 { + c_errno_2 := C.errno + return error('used_memory: C.getrusage() return error code = ${c_errno_2}') + } + return u64(int_max(1, usage.ru_maxrss)) * 1024 +}