From 46e963443dee03ab8d99a9bbbefa8c0169a0cf2d Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Thu, 12 Jun 2014 20:47:46 +0200 Subject: [PATCH] Include system RAM size in usage report --- cmd/syncthing/memsize_darwin.go | 25 ++++++++++++++++++++++++ cmd/syncthing/memsize_linux.go | 33 ++++++++++++++++++++++++++++++++ cmd/syncthing/memsize_unimpl.go | 9 +++++++++ cmd/syncthing/memsize_windows.go | 25 ++++++++++++++++++++++++ cmd/syncthing/usage_report.go | 5 +++++ 5 files changed, 97 insertions(+) create mode 100644 cmd/syncthing/memsize_darwin.go create mode 100644 cmd/syncthing/memsize_linux.go create mode 100644 cmd/syncthing/memsize_unimpl.go create mode 100644 cmd/syncthing/memsize_windows.go diff --git a/cmd/syncthing/memsize_darwin.go b/cmd/syncthing/memsize_darwin.go new file mode 100644 index 00000000..8bbbf99d --- /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 00000000..48c20fc8 --- /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 00000000..63c4223d --- /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 00000000..a71a5067 --- /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 d22f089b..9bbb2d27 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 }