diff options
author | Jakob Borg <jakob@nym.se> | 2014-06-12 20:47:46 +0200 |
---|---|---|
committer | Jakob Borg <jakob@nym.se> | 2014-06-12 20:47:46 +0200 |
commit | 46e963443dee03ab8d99a9bbbefa8c0169a0cf2d (patch) | |
tree | a83385d8e7cf0b6daf4f38841eda09a92205ff33 /cmd | |
parent | 66d4e9e5d7f99528fff4c3032499ad6318e5ab30 (diff) |
Include system RAM size in usage report
Diffstat (limited to 'cmd')
-rw-r--r-- | cmd/syncthing/memsize_darwin.go | 25 | ||||
-rw-r--r-- | cmd/syncthing/memsize_linux.go | 33 | ||||
-rw-r--r-- | cmd/syncthing/memsize_unimpl.go | 9 | ||||
-rw-r--r-- | cmd/syncthing/memsize_windows.go | 25 | ||||
-rw-r--r-- | cmd/syncthing/usage_report.go | 5 |
5 files changed, 97 insertions, 0 deletions
diff --git a/cmd/syncthing/memsize_darwin.go b/cmd/syncthing/memsize_darwin.go new file mode 100644 index 0000000000..8bbbf99d0a --- /dev/null +++ b/cmd/syncthing/memsize_darwin.go @@ -0,0 +1,25 @@ +package main + +import ( + "errors" + "os/exec" + "strconv" + "strings" +) + +func memorySize() (uint64, error) { + cmd := exec.Command("sysctl", "hw.memsize") + out, err := cmd.Output() + if err != nil { + return 0, err + } + fs := strings.Fields(string(out)) + if len(fs) != 2 { + return 0, errors.New("sysctl parse error") + } + bytes, err := strconv.ParseUint(fs[1], 10, 64) + if err != nil { + return 0, err + } + return bytes, nil +} diff --git a/cmd/syncthing/memsize_linux.go b/cmd/syncthing/memsize_linux.go new file mode 100644 index 0000000000..48c20fc85b --- /dev/null +++ b/cmd/syncthing/memsize_linux.go @@ -0,0 +1,33 @@ +package main + +import ( + "bufio" + "errors" + "os" + "strconv" + "strings" +) + +func memorySize() (uint64, error) { + f, err := os.Open("/proc/meminfo") + if err != nil { + return 0, err + } + + s := bufio.NewScanner(f) + if !s.Scan() { + return 0, errors.New("/proc/meminfo parse error 1") + } + + l := s.Text() + fs := strings.Fields(l) + if len(fs) != 3 || fs[2] != "kB" { + return 0, errors.New("/proc/meminfo parse error 2") + } + + kb, err := strconv.ParseUint(fs[1], 10, 64) + if err != nil { + return 0, err + } + return kb * 1024, nil +} diff --git a/cmd/syncthing/memsize_unimpl.go b/cmd/syncthing/memsize_unimpl.go new file mode 100644 index 0000000000..63c4223dd3 --- /dev/null +++ b/cmd/syncthing/memsize_unimpl.go @@ -0,0 +1,9 @@ +// +build freebsd solaris + +package main + +import "errors" + +func memorySize() (uint64, error) { + return 0, errors.New("not implemented") +} diff --git a/cmd/syncthing/memsize_windows.go b/cmd/syncthing/memsize_windows.go new file mode 100644 index 0000000000..a71a5067c7 --- /dev/null +++ b/cmd/syncthing/memsize_windows.go @@ -0,0 +1,25 @@ +package main + +import ( + "encoding/binary" + "syscall" + "unsafe" +) + +var ( + kernel32, _ = syscall.LoadLibrary("kernel32.dll") + globalMemoryStatusEx, _ = syscall.GetProcAddress(kernel32, "GlobalMemoryStatusEx") +) + +func memorySize() (uint64, error) { + var memoryStatusEx [64]byte + binary.LittleEndian.PutUint32(memoryStatusEx[:], 64) + p := uintptr(unsafe.Pointer(&memoryStatusEx[0])) + + ret, _, callErr := syscall.Syscall(uintptr(globalMemoryStatusEx), 1, p, 0, 0) + if ret == 0 { + return 0, callErr + } + + return binary.LittleEndian.Uint64(memoryStatusEx[8:]), nil +} diff --git a/cmd/syncthing/usage_report.go b/cmd/syncthing/usage_report.go index d22f089bc0..9bbb2d2738 100644 --- a/cmd/syncthing/usage_report.go +++ b/cmd/syncthing/usage_report.go @@ -61,6 +61,11 @@ func reportData(m *model.Model) map[string]interface{} { } res["sha256Perf"] = perf + bytes, err := memorySize() + if err == nil { + res["memorySize"] = bytes / 1024 / 1024 + } + return res } |