mirror of
https://github.com/shirou/gopsutil.git
synced 2025-05-02 22:17:08 +08:00
Merge pull request #947 from Lomanic/issue925
[process][darwin] Fix #925 properly and improve some tests
This commit is contained in:
commit
42136c7364
@ -12,7 +12,6 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
"unsafe"
|
|
||||||
|
|
||||||
"github.com/shirou/gopsutil/cpu"
|
"github.com/shirou/gopsutil/cpu"
|
||||||
"github.com/shirou/gopsutil/internal/common"
|
"github.com/shirou/gopsutil/internal/common"
|
||||||
@ -602,24 +601,9 @@ func parseKinfoProc(buf []byte) (KinfoProc, error) {
|
|||||||
// Returns a proc as defined here:
|
// Returns a proc as defined here:
|
||||||
// http://unix.superglobalmegacorp.com/Net2/newsrc/sys/kinfo_proc.h.html
|
// http://unix.superglobalmegacorp.com/Net2/newsrc/sys/kinfo_proc.h.html
|
||||||
func (p *Process) getKProc() (*KinfoProc, error) {
|
func (p *Process) getKProc() (*KinfoProc, error) {
|
||||||
return p.getKProcWithContext(context.Background())
|
buf, err := unix.SysctlRaw("kern.proc.pid", int(p.Pid))
|
||||||
}
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
func (p *Process) getKProcWithContext(ctx context.Context) (*KinfoProc, error) {
|
|
||||||
mib := []int32{CTLKern, KernProc, KernProcPID, p.Pid}
|
|
||||||
procK := KinfoProc{}
|
|
||||||
length := uint64(unsafe.Sizeof(procK))
|
|
||||||
buf := make([]byte, length)
|
|
||||||
_, _, syserr := unix.Syscall6(
|
|
||||||
202, // unix.SYS___SYSCTL https://github.com/golang/sys/blob/76b94024e4b621e672466e8db3d7f084e7ddcad2/unix/zsysnum_darwin_amd64.go#L146
|
|
||||||
uintptr(unsafe.Pointer(&mib[0])),
|
|
||||||
uintptr(len(mib)),
|
|
||||||
uintptr(unsafe.Pointer(&buf[0])),
|
|
||||||
uintptr(unsafe.Pointer(&length)),
|
|
||||||
0,
|
|
||||||
0)
|
|
||||||
if syserr != 0 {
|
|
||||||
return nil, syserr
|
|
||||||
}
|
}
|
||||||
k, err := parseKinfoProc(buf)
|
k, err := parseKinfoProc(buf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -181,6 +181,10 @@ func Test_Process_Ppid(t *testing.T) {
|
|||||||
if v == 0 {
|
if v == 0 {
|
||||||
t.Errorf("return value is 0 %v", v)
|
t.Errorf("return value is 0 %v", v)
|
||||||
}
|
}
|
||||||
|
expected := os.Getppid()
|
||||||
|
if v != int32(expected) {
|
||||||
|
t.Errorf("return value is %v, expected %v", v, expected)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func Test_Process_Status(t *testing.T) {
|
func Test_Process_Status(t *testing.T) {
|
||||||
@ -658,3 +662,24 @@ func Test_AllProcesses_cmdLine(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func BenchmarkNewProcess(b *testing.B) {
|
||||||
|
checkPid := os.Getpid()
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
NewProcess(int32(checkPid))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func BenchmarkProcessName(b *testing.B) {
|
||||||
|
p := testGetProcess()
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
p.Name()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func BenchmarkProcessPpid(b *testing.B) {
|
||||||
|
p := testGetProcess()
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
p.Ppid()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user