summaryrefslogtreecommitdiff
path: root/vendor/github.com/pbnjay/memory/memory_darwin.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/pbnjay/memory/memory_darwin.go')
-rw-r--r--vendor/github.com/pbnjay/memory/memory_darwin.go49
1 files changed, 49 insertions, 0 deletions
diff --git a/vendor/github.com/pbnjay/memory/memory_darwin.go b/vendor/github.com/pbnjay/memory/memory_darwin.go
new file mode 100644
index 000000000..a3f457699
--- /dev/null
+++ b/vendor/github.com/pbnjay/memory/memory_darwin.go
@@ -0,0 +1,49 @@
+// +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
+}