summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJakob Borg <jakob@nym.se>2014-06-12 20:47:46 +0200
committerJakob Borg <jakob@nym.se>2014-06-12 20:47:46 +0200
commit46e963443dee03ab8d99a9bbbefa8c0169a0cf2d (patch)
treea83385d8e7cf0b6daf4f38841eda09a92205ff33
parent66d4e9e5d7f99528fff4c3032499ad6318e5ab30 (diff)
Include system RAM size in usage report
-rw-r--r--cmd/syncthing/memsize_darwin.go25
-rw-r--r--cmd/syncthing/memsize_linux.go33
-rw-r--r--cmd/syncthing/memsize_unimpl.go9
-rw-r--r--cmd/syncthing/memsize_windows.go25
-rw-r--r--cmd/syncthing/usage_report.go5
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
}