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  }