in metric/memory/memory_openbsd.go [160:208]
func get(_ resolve.Resolver) (Memory, error) {
memData := Memory{}
n := uintptr(0)
var uvmexp Uvmexp
mib := [2]int32{C.CTL_VM, C.VM_UVMEXP}
n = uintptr(0)
// First we determine how much memory we'll need to pass later on (via `n`)
_, _, errno := syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 2, 0, uintptr(unsafe.Pointer(&n)), 0, 0)
if errno != 0 || n == 0 {
return memData, fmt.Errorf("Error in size VM_UVMEXP sysctl call, errno %d", errno)
}
_, _, errno = syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 2, uintptr(unsafe.Pointer(&uvmexp)), uintptr(unsafe.Pointer(&n)), 0, 0)
if errno != 0 || n == 0 {
return memData, fmt.Errorf("Error in VM_UVMEXP sysctl call, errno %d", errno)
}
var bcachestats Bcachestats
mib3 := [3]int32{C.CTL_VFS, C.VFS_GENERIC, C.VFS_BCACHESTAT}
n = uintptr(0)
_, _, errno = syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib3[0])), 3, 0, uintptr(unsafe.Pointer(&n)), 0, 0)
if errno != 0 || n == 0 {
return memData, fmt.Errorf("Error in size VFS_BCACHESTAT sysctl call, errno %d", errno)
}
_, _, errno = syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib3[0])), 3, uintptr(unsafe.Pointer(&bcachestats)), uintptr(unsafe.Pointer(&n)), 0, 0)
if errno != 0 || n == 0 {
return memData, fmt.Errorf("Error in VFS_BCACHESTAT sysctl call, errno %d", errno)
}
memFree := uint64(uvmexp.free) << uvmexp.pageshift
memUsed := uint64(uvmexp.npages-uvmexp.free) << uvmexp.pageshift
memData.Total = opt.UintWith(uint64(uvmexp.npages) << uvmexp.pageshift)
memData.Used.Bytes = opt.UintWith(memUsed)
memData.Free = opt.UintWith(memFree)
memData.Actual.Free = opt.UintWith(memFree + (uint64(bcachestats.numbufpages) << uvmexp.pageshift))
memData.Actual.Used.Bytes = opt.UintWith(memUsed - (uint64(bcachestats.numbufpages) << uvmexp.pageshift))
var err error
memData.Swap, err = getSwap()
if err != nil {
return memData, fmt.Errorf("error getting swap data: %w", err)
}
return memData, nil
}