From c78563d5dd098d51acd8968d0196af8a856d7f78 Mon Sep 17 00:00:00 2001 From: Shirou WAKAYAMA Date: Thu, 3 Jul 2014 17:39:21 +0900 Subject: [PATCH] mem_linux: VirtualMemory() is now from /proc/meminfo, not syscall. --- mem_linux.go | 49 +++++++++++++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/mem_linux.go b/mem_linux.go index 2ff2603..9703d23 100644 --- a/mem_linux.go +++ b/mem_linux.go @@ -3,35 +3,44 @@ package gopsutil import ( + "strings" "syscall" ) func VirtualMemory() (*VirtualMemoryStat, error) { - sysinfo := &syscall.Sysinfo_t{} - - if err := syscall.Sysinfo(sysinfo); err != nil { - return nil, err + filename := "/proc/meminfo" + lines, _ := readLines(filename) + + ret := &VirtualMemoryStat{} + for _, line := range lines { + fields := strings.Split(line, ":") + if len(fields) != 2 { + continue + } + key := strings.TrimSpace(fields[0]) + value := strings.TrimSpace(fields[1]) + value = strings.Replace(value, " kB", "", -1) + + switch key { + case "MemTotal": + ret.Total = mustParseUint64(value) + case "MemFree": + ret.Free = mustParseUint64(value) + case "Buffers": + ret.Buffers = mustParseUint64(value) + case "Cached": + ret.Cached = mustParseUint64(value) + case "Active": + ret.Active = mustParseUint64(value) + case "Inactive": + ret.Inactive = mustParseUint64(value) + + } } - - ret := &VirtualMemoryStat{ - Total: uint64(sysinfo.Totalram), - Free: uint64(sysinfo.Freeram), - Shared: uint64(sysinfo.Sharedram), - Buffers: uint64(sysinfo.Bufferram), - } - - // TODO: platform independent ret.Available = ret.Free + ret.Buffers + ret.Cached - ret.Used = ret.Total - ret.Free ret.UsedPercent = float64(ret.Total-ret.Available) / float64(ret.Total) * 100.0 - /* - kern := buffers + cached - ret.ActualFree = ret.Free + kern - ret.ActualUsed = ret.Used - kern - */ - return ret, nil }