[process]windows: implement process.MemoryInfo (but no swap)

pull/197/head
WAKAYAMA Shirou 9 years ago
parent cf454998dc
commit 903277ce2f

@ -23,6 +23,11 @@ const (
MaxPathLength = 260 MaxPathLength = 260
) )
var (
modpsapi = syscall.NewLazyDLL("psapi.dll")
procGetProcessMemoryInfo = modpsapi.NewProc("GetProcessMemoryInfo")
)
type SystemProcessInformation struct { type SystemProcessInformation struct {
NextEntryOffset uint64 NextEntryOffset uint64
NumberOfThreads uint64 NumberOfThreads uint64
@ -75,7 +80,7 @@ type Win32_Process struct {
PeakPageFileUsage uint32 PeakPageFileUsage uint32
PeakVirtualSize uint64 PeakVirtualSize uint64
PeakWorkingSetSize uint32 PeakWorkingSetSize uint32
PrivatePageCount uint64 PrivatePageCount uint64
ReadOperationCount uint64 ReadOperationCount uint64
ReadTransferCount uint64 ReadTransferCount uint64
Status *string Status *string
@ -234,7 +239,17 @@ func (p *Process) CPUAffinity() ([]int32, error) {
return nil, common.ErrNotImplementedError return nil, common.ErrNotImplementedError
} }
func (p *Process) MemoryInfo() (*MemoryInfoStat, error) { func (p *Process) MemoryInfo() (*MemoryInfoStat, error) {
return nil, common.ErrNotImplementedError mem, err := getMemoryInfo(p.Pid)
if err != nil {
return nil, err
}
ret := &MemoryInfoStat{
RSS: mem.WorkingSetSize,
VMS: mem.PagefileUsage,
}
return ret, nil
} }
func (p *Process) MemoryInfoEx() (*MemoryInfoExStat, error) { func (p *Process) MemoryInfoEx() (*MemoryInfoExStat, error) {
return nil, common.ErrNotImplementedError return nil, common.ErrNotImplementedError
@ -355,3 +370,29 @@ func getProcInfo(pid int32) (*SystemProcessInformation, error) {
return &sysProcInfo, nil return &sysProcInfo, nil
} }
func getMemoryInfo(pid int32) (PROCESS_MEMORY_COUNTERS, error) {
var mem PROCESS_MEMORY_COUNTERS
c, err := syscall.OpenProcess(syscall.PROCESS_QUERY_INFORMATION, false, uint32(pid))
if err != nil {
return mem, err
}
defer syscall.CloseHandle(c)
if err := getProcessMemoryInfo(c, &mem); err != nil {
return mem, err
}
return mem, err
}
func getProcessMemoryInfo(h syscall.Handle, mem *PROCESS_MEMORY_COUNTERS) (err error) {
r1, _, e1 := syscall.Syscall(procGetProcessMemoryInfo.Addr(), 3, uintptr(h), uintptr(unsafe.Pointer(mem)), uintptr(unsafe.Sizeof(*mem)))
if r1 == 0 {
if e1 != 0 {
err = error(e1)
} else {
err = syscall.EINVAL
}
}
return
}

@ -0,0 +1,16 @@
// +build windows
package process
type PROCESS_MEMORY_COUNTERS struct {
CB uint32
PageFaultCount uint32
PeakWorkingSetSize uint32
WorkingSetSize uint32
QuotaPeakPagedPoolUsage uint32
QuotaPagedPoolUsage uint32
QuotaPeakNonPagedPoolUsage uint32
QuotaNonPagedPoolUsage uint32
PagefileUsage uint32
PeakPagefileUsage uint32
}

@ -0,0 +1,16 @@
// +build windows
package process
type PROCESS_MEMORY_COUNTERS struct {
CB uint32
PageFaultCount uint32
PeakWorkingSetSize uint64
WorkingSetSize uint64
QuotaPeakPagedPoolUsage uint64
QuotaPagedPoolUsage uint64
QuotaPeakNonPagedPoolUsage uint64
QuotaNonPagedPoolUsage uint64
PagefileUsage uint64
PeakPagefileUsage uint64
}
Loading…
Cancel
Save