50 lines
1016 B
Go
50 lines
1016 B
Go
// +build darwin
|
|
|
|
package memory
|
|
|
|
import (
|
|
"os/exec"
|
|
"regexp"
|
|
"strconv"
|
|
)
|
|
|
|
func sysTotalMemory() uint64 {
|
|
s, err := sysctlUint64("hw.memsize")
|
|
if err != nil {
|
|
return 0
|
|
}
|
|
return s
|
|
}
|
|
|
|
func sysFreeMemory() uint64 {
|
|
cmd := exec.Command("vm_stat")
|
|
outBytes, err := cmd.Output()
|
|
if err != nil {
|
|
return 0
|
|
}
|
|
|
|
rePageSize := regexp.MustCompile("page size of ([0-9]*) bytes")
|
|
reFreePages := regexp.MustCompile("Pages free: *([0-9]*)\\.")
|
|
|
|
// default: page size of 4096 bytes
|
|
matches := rePageSize.FindSubmatchIndex(outBytes)
|
|
pageSize := uint64(4096)
|
|
if len(matches) == 4 {
|
|
pageSize, err = strconv.ParseUint(string(outBytes[matches[2]:matches[3]]), 10, 64)
|
|
if err != nil {
|
|
return 0
|
|
}
|
|
}
|
|
|
|
// ex: Pages free: 1126961.
|
|
matches = reFreePages.FindSubmatchIndex(outBytes)
|
|
freePages := uint64(0)
|
|
if len(matches) == 4 {
|
|
freePages, err = strconv.ParseUint(string(outBytes[matches[2]:matches[3]]), 10, 64)
|
|
if err != nil {
|
|
return 0
|
|
}
|
|
}
|
|
return freePages * pageSize
|
|
}
|