Browse code

Windows: Implement ReadMemInfo()

Signed-off-by: John Howard <jhoward@microsoft.com>

John Howard authored on 2015/06/02 04:40:33
Showing 2 changed files
... ...
@@ -1,4 +1,4 @@
1
-// +build !linux
1
+// +build !linux,!windows
2 2
 
3 3
 package system
4 4
 
5 5
new file mode 100644
... ...
@@ -0,0 +1,44 @@
0
+package system
1
+
2
+import (
3
+	"syscall"
4
+	"unsafe"
5
+)
6
+
7
+var (
8
+	modkernel32 = syscall.NewLazyDLL("kernel32.dll")
9
+
10
+	procGlobalMemoryStatusEx = modkernel32.NewProc("GlobalMemoryStatusEx")
11
+)
12
+
13
+// https://msdn.microsoft.com/en-us/library/windows/desktop/aa366589(v=vs.85).aspx
14
+// https://msdn.microsoft.com/en-us/library/windows/desktop/aa366770(v=vs.85).aspx
15
+type memorystatusex struct {
16
+	dwLength                uint32
17
+	dwMemoryLoad            uint32
18
+	ullTotalPhys            uint64
19
+	ullAvailPhys            uint64
20
+	ullTotalPageFile        uint64
21
+	ullAvailPageFile        uint64
22
+	ullTotalVirtual         uint64
23
+	ullAvailVirtual         uint64
24
+	ullAvailExtendedVirtual uint64
25
+}
26
+
27
+// ReadMemInfo retrieves memory statistics of the host system and returns a
28
+//  MemInfo type.
29
+func ReadMemInfo() (*MemInfo, error) {
30
+	msi := &memorystatusex{
31
+		dwLength: 64,
32
+	}
33
+	r1, _, _ := procGlobalMemoryStatusEx.Call(uintptr(unsafe.Pointer(msi)))
34
+	if r1 == 0 {
35
+		return &MemInfo{}, nil
36
+	}
37
+	return &MemInfo{
38
+		MemTotal:  int64(msi.ullTotalPhys),
39
+		MemFree:   int64(msi.ullAvailPhys),
40
+		SwapTotal: int64(msi.ullTotalPageFile),
41
+		SwapFree:  int64(msi.ullAvailPageFile),
42
+	}, nil
43
+}