github.com/gofiber/fiber/v2@v2.47.0/internal/gopsutil/mem/mem_darwin_nocgo.go (about) 1 //go:build darwin && !cgo 2 // +build darwin,!cgo 3 4 package mem 5 6 import ( 7 "context" 8 "os/exec" 9 "strconv" 10 "strings" 11 12 "golang.org/x/sys/unix" 13 ) 14 15 // Runs vm_stat and returns Free and inactive pages 16 func getVMStat(vms *VirtualMemoryStat) error { 17 vm_stat, err := exec.LookPath("vm_stat") 18 if err != nil { 19 return err 20 } 21 out, err := invoke.Command(vm_stat) 22 if err != nil { 23 return err 24 } 25 return parseVMStat(string(out), vms) 26 } 27 28 func parseVMStat(out string, vms *VirtualMemoryStat) error { 29 var err error 30 31 lines := strings.Split(out, "\n") 32 pagesize := uint64(unix.Getpagesize()) 33 for _, line := range lines { 34 fields := strings.Split(line, ":") 35 if len(fields) < 2 { 36 continue 37 } 38 key := strings.TrimSpace(fields[0]) 39 value := strings.Trim(fields[1], " .") 40 switch key { 41 case "Pages free": 42 free, e := strconv.ParseUint(value, 10, 64) 43 if e != nil { 44 err = e 45 } 46 vms.Free = free * pagesize 47 case "Pages inactive": 48 inactive, e := strconv.ParseUint(value, 10, 64) 49 if e != nil { 50 err = e 51 } 52 vms.Inactive = inactive * pagesize 53 case "Pages active": 54 active, e := strconv.ParseUint(value, 10, 64) 55 if e != nil { 56 err = e 57 } 58 vms.Active = active * pagesize 59 case "Pages wired down": 60 wired, e := strconv.ParseUint(value, 10, 64) 61 if e != nil { 62 err = e 63 } 64 vms.Wired = wired * pagesize 65 } 66 } 67 return err 68 } 69 70 // VirtualMemory returns VirtualmemoryStat. 71 func VirtualMemory() (*VirtualMemoryStat, error) { 72 return VirtualMemoryWithContext(context.Background()) 73 } 74 75 func VirtualMemoryWithContext(ctx context.Context) (*VirtualMemoryStat, error) { 76 ret := &VirtualMemoryStat{} 77 78 total, err := getHwMemsize() 79 if err != nil { 80 return nil, err 81 } 82 err = getVMStat(ret) 83 if err != nil { 84 return nil, err 85 } 86 87 ret.Available = ret.Free + ret.Inactive 88 ret.Total = total 89 90 ret.Used = ret.Total - ret.Available 91 ret.UsedPercent = 100 * float64(ret.Used) / float64(ret.Total) 92 93 return ret, nil 94 }