// +build darwin package mem import ( "context" "encoding/binary" "strconv" "strings" "github.com/shirou/gopsutil/internal/common" "golang.org/x/sys/unix" ) func getHwMemsize() (uint64, error) { totalString, err := unix.Sysctl("hw.memsize") if err != nil { return 0, err } // unix.sysctl() helpfully assumes the result is a null-terminated string and // removes the last byte of the result if it's 0 :/ totalString += "\x00" total := uint64(binary.LittleEndian.Uint64([]byte(totalString))) return total, nil } // SwapMemory returns swapinfo. func SwapMemory() (*SwapMemoryStat, error) { return SwapMemoryWithContext(context.Background()) } func SwapMemoryWithContext(ctx context.Context) (*SwapMemoryStat, error) { var ret *SwapMemoryStat swapUsage, err := common.DoSysctrlWithContext(ctx, "vm.swapusage") if err != nil { return ret, err } total := strings.Replace(swapUsage[2], "M", "", 1) used := strings.Replace(swapUsage[5], "M", "", 1) free := strings.Replace(swapUsage[8], "M", "", 1) total_v, err := strconv.ParseFloat(total, 64) if err != nil { return nil, err } used_v, err := strconv.ParseFloat(used, 64) if err != nil { return nil, err } free_v, err := strconv.ParseFloat(free, 64) if err != nil { return nil, err } u := float64(0) if total_v != 0 { u = ((total_v - free_v) / total_v) * 100.0 } // vm.swapusage shows "M", multiply 1024 * 1024 to convert bytes. ret = &SwapMemoryStat{ Total: uint64(total_v * 1024 * 1024), Used: uint64(used_v * 1024 * 1024), Free: uint64(free_v * 1024 * 1024), UsedPercent: u, } return ret, nil }