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