diff --git a/README.rst b/README.rst index 728ed45..3e9e19f 100644 --- a/README.rst +++ b/README.rst @@ -46,7 +46,7 @@ Note: gopsutil.v2 breaks compatibility. If you want to stay with compatibility, import ( "fmt" - mem "gopkg.in/shirou/gopsutil.v2" + mem "gopkg.in/shirou/gopsutil.v2/mem" ) func main() { @@ -185,8 +185,8 @@ exe x x x uids x x x gids x x x terminal x x x -io_counters x -nice x x x +io_counters x x +nice x x x x num_fds x num_ctx_switches x num_threads x x x x diff --git a/disk/disk_freebsd.go b/disk/disk_freebsd.go index 18a543d..4ec2d6e 100644 --- a/disk/disk_freebsd.go +++ b/disk/disk_freebsd.go @@ -99,14 +99,12 @@ func IOCounters() (map[string]IOCountersStat, error) { buf := []byte(r) length := len(buf) - ds := Devstat{} - devstatLen := int(unsafe.Sizeof(ds)) - count := int(uint64(length) / uint64(devstatLen)) + count := int(uint64(length) / uint64(sizeOfDevstat)) buf = buf[8:] // devstat.all has version in the head. // parse buf to Devstat for i := 0; i < count; i++ { - b := buf[i*devstatLen : i*devstatLen+devstatLen] + b := buf[i*sizeOfDevstat : i*sizeOfDevstat+sizeOfDevstat] d, err := parseDevstat(b) if err != nil { continue diff --git a/disk/disk_freebsd_amd64.go b/disk/disk_freebsd_amd64.go index 4e4165e..89b617c 100644 --- a/disk/disk_freebsd_amd64.go +++ b/disk/disk_freebsd_amd64.go @@ -39,6 +39,10 @@ const ( MNT_SUSPEND = 4 ) +const ( + sizeOfDevstat = 0x120 +) + type ( _C_short int16 _C_int int32 diff --git a/disk/types_freebsd.go b/disk/types_freebsd.go index 4486904..dd6ddc4 100644 --- a/disk/types_freebsd.go +++ b/disk/types_freebsd.go @@ -65,7 +65,10 @@ const ( MNT_NOWAIT = 2 /* start all I/O, but do not wait for it */ MNT_LAZY = 3 /* push data not written by filesystem syncer */ MNT_SUSPEND = 4 /* Suspend file system after sync */ +) +const ( + sizeOfDevstat = C.sizeof_struct_devstat ) // Basic types diff --git a/process/process_freebsd.go b/process/process_freebsd.go index dcde1d6..f8fbfd5 100644 --- a/process/process_freebsd.go +++ b/process/process_freebsd.go @@ -7,7 +7,6 @@ import ( "encoding/binary" "strings" "syscall" - "unsafe" cpu "github.com/shirou/gopsutil/cpu" "github.com/shirou/gopsutil/internal/common" @@ -41,7 +40,7 @@ func (p *Process) Ppid() (int32, error) { return 0, err } - return k.KiPpid, nil + return k.Ppid, nil } func (p *Process) Name() (string, error) { k, err := p.getKProc() @@ -49,7 +48,7 @@ func (p *Process) Name() (string, error) { return "", err } - return string(k.KiComm[:]), nil + return common.IntToString(k.Comm[:]), nil } func (p *Process) Exe() (string, error) { return "", common.NotImplementedError @@ -105,8 +104,25 @@ func (p *Process) Status() (string, error) { if err != nil { return "", err } + var s string + switch k.Stat { + case SIDL: + s = "I" + case SRUN: + s = "R" + case SSLEEP: + s = "S" + case SSTOP: + s = "T" + case SZOMB: + s = "Z" + case SWAIT: + s = "W" + case SLOCK: + s = "L" + } - return string(k.KiStat[:]), nil + return s, nil } func (p *Process) Uids() ([]int32, error) { k, err := p.getKProc() @@ -116,7 +132,7 @@ func (p *Process) Uids() ([]int32, error) { uids := make([]int32, 0, 3) - uids = append(uids, int32(k.KiRuid), int32(k.KiUID), int32(k.KiSvuid)) + uids = append(uids, int32(k.Ruid), int32(k.Uid), int32(k.Svuid)) return uids, nil } @@ -127,7 +143,7 @@ func (p *Process) Gids() ([]int32, error) { } gids := make([]int32, 0, 3) - gids = append(gids, int32(k.KiRgid), int32(k.KiNgroups[0]), int32(k.KiSvuid)) + gids = append(gids, int32(k.Rgid), int32(k.Ngroups), int32(k.Svgid)) return gids, nil } @@ -137,7 +153,7 @@ func (p *Process) Terminal() (string, error) { return "", err } - ttyNr := uint64(k.KiTdev) + ttyNr := uint64(k.Tdev) termmap, err := getTerminalMap() if err != nil { @@ -147,7 +163,11 @@ func (p *Process) Terminal() (string, error) { return termmap[ttyNr], nil } func (p *Process) Nice() (int32, error) { - return 0, common.NotImplementedError + k, err := p.getKProc() + if err != nil { + return 0, err + } + return int32(k.Nice), nil } func (p *Process) IOnice() (int32, error) { return 0, common.NotImplementedError @@ -162,8 +182,8 @@ func (p *Process) IOCounters() (*IOCountersStat, error) { return nil, err } return &IOCountersStat{ - ReadCount: uint64(k.KiRusage.Inblock), - WriteCount: uint64(k.KiRusage.Oublock), + ReadCount: uint64(k.Rusage.Inblock), + WriteCount: uint64(k.Rusage.Oublock), }, nil } func (p *Process) NumCtxSwitches() (*NumCtxSwitchesStat, error) { @@ -178,7 +198,7 @@ func (p *Process) NumThreads() (int32, error) { return 0, err } - return k.KiNumthreads, nil + return k.Numthreads, nil } func (p *Process) Threads() (map[string]string, error) { ret := make(map[string]string, 0) @@ -191,8 +211,8 @@ func (p *Process) Times() (*cpu.TimesStat, error) { } return &cpu.TimesStat{ CPU: "cpu", - User: float64(k.KiRusage.Utime.Sec) + float64(k.KiRusage.Utime.Usec)/1000000, - System: float64(k.KiRusage.Stime.Sec) + float64(k.KiRusage.Stime.Usec)/1000000, + User: float64(k.Rusage.Utime.Sec) + float64(k.Rusage.Utime.Usec)/1000000, + System: float64(k.Rusage.Stime.Sec) + float64(k.Rusage.Stime.Usec)/1000000, }, nil } func (p *Process) CPUAffinity() ([]int32, error) { @@ -210,8 +230,8 @@ func (p *Process) MemoryInfo() (*MemoryInfoStat, error) { pageSize := common.LittleEndian.Uint16([]byte(v)) return &MemoryInfoStat{ - RSS: uint64(k.KiRssize) * uint64(pageSize), - VMS: uint64(k.KiSize), + RSS: uint64(k.Rssize) * uint64(pageSize), + VMS: uint64(k.Size), }, nil } func (p *Process) MemoryInfoEx() (*MemoryInfoExStat, error) { @@ -254,11 +274,6 @@ func (p *Process) MemoryMaps(grouped bool) (*[]MemoryMapsStat, error) { return &ret, common.NotImplementedError } -func copyParams(k *KinfoProc, p *Process) error { - - return nil -} - func processes() ([]Process, error) { results := make([]Process, 0, 50) @@ -269,22 +284,19 @@ func processes() ([]Process, error) { } // get kinfo_proc size - k := KinfoProc{} - procinfoLen := int(unsafe.Sizeof(k)) - count := int(length / uint64(procinfoLen)) + count := int(length / uint64(sizeOfKinfoProc)) // parse buf to procs for i := 0; i < count; i++ { - b := buf[i*procinfoLen : i*procinfoLen+procinfoLen] + b := buf[i*sizeOfKinfoProc : (i+1)*sizeOfKinfoProc] k, err := parseKinfoProc(b) if err != nil { continue } - p, err := NewProcess(int32(k.KiPid)) + p, err := NewProcess(int32(k.Pid)) if err != nil { continue } - copyParams(&k, p) results = append(results, *p) } @@ -295,7 +307,7 @@ func processes() ([]Process, error) { func parseKinfoProc(buf []byte) (KinfoProc, error) { var k KinfoProc br := bytes.NewReader(buf) - err := binary.Read(br, binary.LittleEndian, &k) + err := common.Read(br, binary.LittleEndian, &k) return k, err } @@ -306,8 +318,7 @@ func (p *Process) getKProc() (*KinfoProc, error) { if err != nil { return nil, err } - procK := KinfoProc{} - if length != uint64(unsafe.Sizeof(procK)) { + if length != sizeOfKinfoProc { return nil, err } @@ -315,7 +326,6 @@ func (p *Process) getKProc() (*KinfoProc, error) { if err != nil { return nil, err } - return &k, nil } diff --git a/process/process_freebsd_386.go b/process/process_freebsd_386.go index 6b3bdfc..201f714 100644 --- a/process/process_freebsd_386.go +++ b/process/process_freebsd_386.go @@ -13,6 +13,21 @@ const ( KernProcArgs = 7 // get/set arguments/proctitle ) +const ( + SIDL = 1 + SRUN = 2 + SSLEEP = 3 + SSTOP = 4 + SZOMB = 5 + SWAIT = 6 + SLOCK = 7 +) + +const ( + sizeOfKinfoVmentry = 0x244 // TODO: really? + sizeOfKinfoProc = 0x220 +) + type Timespec struct { Sec int32 Nsec int32 @@ -44,83 +59,83 @@ type Rusage struct { // copied from sys/user.h type KinfoProc struct { - KiStructsize int32 - KiLayout int32 - KiArgs int32 - KiPaddr int32 - KiAddr int32 - KiTracep int32 - KiTextvp int32 - KiFd int32 - KiVmspace int32 - KiWchan int32 - KiPid int32 - KiPpid int32 - KiPgid int32 - KiTpgid int32 - KiSid int32 - KiTsid int32 - KiJobc [2]byte - KiSpareShort1 [2]byte - KiTdev int32 - KiSiglist [16]byte - KiSigmask [16]byte - KiSigignore [16]byte - KiSigcatch [16]byte - KiUID int32 - KiRuid int32 - KiSvuid int32 - KiRgid int32 - KiSvgid int32 - KiNgroups [2]byte - KiSpareShort2 [2]byte - KiGroups [64]byte - KiSize int32 - KiRssize int32 - KiSwrss int32 - KiTsize int32 - KiDsize int32 - KiSsize int32 - KiXstat [2]byte - KiAcflag [2]byte - KiPctcpu int32 - KiEstcpu int32 - KiSlptime int32 - KiSwtime int32 - KiCow int32 - KiRuntime int64 - KiStart [8]byte - KiChildtime [8]byte - KiFlag int32 - KiKflag int32 - KiTraceflag int32 - KiStat [1]byte - KiNice [1]byte - KiLock [1]byte - KiRqindex [1]byte - KiOncpu [1]byte - KiLastcpu [1]byte - KiOcomm [17]byte - KiWmesg [9]byte - KiLogin [18]byte - KiLockname [9]byte - KiComm [20]byte - KiEmul [17]byte - KiSparestrings [68]byte - KiSpareints [36]byte - KiCrFlags int32 - KiJid int32 - KiNumthreads int32 - KiTid int32 - KiPri int32 - KiRusage Rusage - KiRusageCh [72]byte - KiPcb int32 - KiKstack int32 - KiUdata int32 - KiTdaddr int32 - KiSpareptrs [24]byte - KiSpareint64s [48]byte - KiSflag int32 - KiTdflags int32 + Structsize int32 + Layout int32 + Args int32 + Paddr int32 + Addr int32 + Tracep int32 + Textvp int32 + Fd int32 + Vmspace int32 + Wchan int32 + Pid int32 + Ppid int32 + Pgid int32 + Tpgid int32 + Sid int32 + Tsid int32 + Jobc [2]byte + SpareShort1 [2]byte + Tdev int32 + Siglist [16]byte + Sigmask [16]byte + Sigignore [16]byte + Sigcatch [16]byte + Uid int32 + Ruid int32 + Svuid int32 + Rgid int32 + Svgid int32 + Ngroups int16 + SpareShort2 [2]byte + Groups [64]byte + Size int32 + Rssize int32 + Swrss int32 + Tsize int32 + Dsize int32 + Ssize int32 + Xstat [2]byte + Acflag [2]byte + Pctcpu int32 + Estcpu int32 + Slptime int32 + Swtime int32 + Cow int32 + Runtime int64 + Start [8]byte + Childtime [8]byte + Flag int32 + Kflag int32 + Traceflag int32 + Stat int8 + Nice [1]byte + Lock [1]byte + Rqindex [1]byte + Oncpu [1]byte + Lastcpu [1]byte + Ocomm [17]byte + Wmesg [9]byte + Login [18]byte + Lockname [9]byte + Comm [20]int8 + Emul [17]byte + Sparestrings [68]byte + Spareints [36]byte + CrFlags int32 + Jid int32 + Numthreads int32 + Tid int32 + Pri int32 + Rusage Rusage + RusageCh [72]byte + Pcb int32 + Kstack int32 + Udata int32 + Tdaddr int32 + Spareptrs [24]byte + Spareint64s [48]byte + Sflag int32 + Tdflags int32 } diff --git a/process/process_freebsd_amd64.go b/process/process_freebsd_amd64.go index 69a352f..79e2ba8 100644 --- a/process/process_freebsd_amd64.go +++ b/process/process_freebsd_amd64.go @@ -1,125 +1,192 @@ -// +build freebsd -// +build amd64 +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_freebsd.go + package process -// copied from sys/sysctl.h const ( - CTLKern = 1 // "high kernel": proc, limits - KernProc = 14 // struct: process entries - KernProcPID = 1 // by process id - KernProcProc = 8 // only return procs - KernProcPathname = 12 // path to executable - KernProcArgs = 7 // get/set arguments/proctitle + CTLKern = 1 + KernProc = 14 + KernProcPID = 1 + KernProcProc = 8 + KernProcPathname = 12 + KernProcArgs = 7 +) + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 +) + +const ( + sizeOfKinfoVmentry = 0x488 + sizeOfKinfoProc = 0x440 +) + +const ( + SIDL = 1 + SRUN = 2 + SSLEEP = 3 + SSTOP = 4 + SZOMB = 5 + SWAIT = 6 + SLOCK = 7 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 ) type Timespec struct { - Sec int64 - Nsec int64 + Sec int64 + Nsec int64 } type Timeval struct { - Sec int64 - Usec int64 + Sec int64 + Usec int64 } type Rusage struct { - Utime Timeval - Stime Timeval - Maxrss int64 - Ixrss int64 - Idrss int64 - Isrss int64 - Minflt int64 - Majflt int64 - Nswap int64 - Inblock int64 - Oublock int64 - Msgsnd int64 - Msgrcv int64 - Nsignals int64 - Nvcsw int64 - Nivcsw int64 + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur int64 + Max int64 } -// copied from sys/user.h type KinfoProc struct { - KiStructsize int32 - KiLayout int32 - KiArgs int64 - KiPaddr int64 - KiAddr int64 - KiTracep int64 - KiTextvp int64 - KiFd int64 - KiVmspace int64 - KiWchan int64 - KiPid int32 - KiPpid int32 - KiPgid int32 - KiTpgid int32 - KiSid int32 - KiTsid int32 - KiJobc [2]byte - KiSpareShort1 [2]byte - KiTdev int32 - KiSiglist [16]byte - KiSigmask [16]byte - KiSigignore [16]byte - KiSigcatch [16]byte - KiUID int32 - KiRuid int32 - KiSvuid int32 - KiRgid int32 - KiSvgid int32 - KiNgroups [2]byte - KiSpareShort2 [2]byte - KiGroups [64]byte - KiSize int64 - KiRssize int64 - KiSwrss int64 - KiTsize int64 - KiDsize int64 - KiSsize int64 - KiXstat [2]byte - KiAcflag [2]byte - KiPctcpu int32 - KiEstcpu int32 - KiSlptime int32 - KiSwtime int32 - KiCow int32 - KiRuntime int64 - KiStart [16]byte - KiChildtime [16]byte - KiFlag int64 - KiKflag int64 - KiTraceflag int32 - KiStat [1]byte - KiNice [1]byte - KiLock [1]byte - KiRqindex [1]byte - KiOncpu [1]byte - KiLastcpu [1]byte - KiOcomm [17]byte - KiWmesg [9]byte - KiLogin [18]byte - KiLockname [9]byte - KiComm [20]byte - KiEmul [17]byte - KiSparestrings [68]byte - KiSpareints [36]byte - KiCrFlags int32 - KiJid int32 - KiNumthreads int32 - KiTid int32 - KiPri int32 - KiRusage Rusage - KiRusageCh [144]byte - KiPcb int64 - KiKstack int64 - KiUdata int64 - KiTdaddr int64 - KiSpareptrs [48]byte - KiSpareint64s [96]byte - KiSflag int64 - KiTdflags int64 + Structsize int32 + Layout int32 + Args int64 /* pargs */ + Paddr int64 /* proc */ + Addr int64 /* user */ + Tracep int64 /* vnode */ + Textvp int64 /* vnode */ + Fd int64 /* filedesc */ + Vmspace int64 /* vmspace */ + Wchan int64 + Pid int32 + Ppid int32 + Pgid int32 + Tpgid int32 + Sid int32 + Tsid int32 + Jobc int16 + Spare_short1 int16 + Tdev uint32 + Siglist [16]byte /* sigset */ + Sigmask [16]byte /* sigset */ + Sigignore [16]byte /* sigset */ + Sigcatch [16]byte /* sigset */ + Uid uint32 + Ruid uint32 + Svuid uint32 + Rgid uint32 + Svgid uint32 + Ngroups int16 + Spare_short2 int16 + Groups [16]uint32 + Size uint64 + Rssize int64 + Swrss int64 + Tsize int64 + Dsize int64 + Ssize int64 + Xstat uint16 + Acflag uint16 + Pctcpu uint32 + Estcpu uint32 + Slptime uint32 + Swtime uint32 + Cow uint32 + Runtime uint64 + Start Timeval + Childtime Timeval + Flag int64 + Kiflag int64 + Traceflag int32 + Stat int8 + Nice int8 + Lock int8 + Rqindex int8 + Oncpu uint8 + Lastcpu uint8 + Tdname [17]int8 + Wmesg [9]int8 + Login [18]int8 + Lockname [9]int8 + Comm [20]int8 + Emul [17]int8 + Loginclass [18]int8 + Sparestrings [50]int8 + Spareints [7]int32 + Flag2 int32 + Fibnum int32 + Cr_flags uint32 + Jid int32 + Numthreads int32 + Tid int32 + Pri Priority + Rusage Rusage + Rusage_ch Rusage + Pcb int64 /* pcb */ + Kstack int64 + Udata int64 + Tdaddr int64 /* thread */ + Spareptrs [6]int64 + Sparelongs [12]int64 + Sflag int64 + Tdflags int64 +} + +type Priority struct { + Class uint8 + Level uint8 + Native uint8 + User uint8 +} + +type KinfoVmentry struct { + Structsize int32 + Type int32 + Start uint64 + End uint64 + Offset uint64 + Vn_fileid uint64 + Vn_fsid uint32 + Flags int32 + Resident int32 + Private_resident int32 + Protection int32 + Ref_count int32 + Shadow_count int32 + Vn_type int32 + Vn_size uint64 + Vn_rdev uint32 + Vn_mode uint16 + Status uint16 + X_kve_ispare [12]int32 + Path [1024]int8 } diff --git a/process/types_freebsd.go b/process/types_freebsd.go new file mode 100644 index 0000000..aa7b346 --- /dev/null +++ b/process/types_freebsd.go @@ -0,0 +1,95 @@ +// +build ignore + +// We still need editing by hands. +// go tool cgo -godefs types_freebsd.go | sed 's/\*int64/int64/' | sed 's/\*byte/int64/' > process_freebsd_amd64.go + +/* +Input to cgo -godefs. +*/ + +// +godefs map struct_pargs int64 /* pargs */ +// +godefs map struct_proc int64 /* proc */ +// +godefs map struct_user int64 /* user */ +// +godefs map struct_vnode int64 /* vnode */ +// +godefs map struct_vnode int64 /* vnode */ +// +godefs map struct_filedesc int64 /* filedesc */ +// +godefs map struct_vmspace int64 /* vmspace */ +// +godefs map struct_pcb int64 /* pcb */ +// +godefs map struct_thread int64 /* thread */ +// +godefs map struct___sigset [16]byte /* sigset */ + +package process + +/* +#include +#include + +enum { + sizeofPtr = sizeof(void*), +}; + + +*/ +import "C" + +// Machine characteristics; for internal use. + +const ( + CTLKern = 1 // "high kernel": proc, limits + KernProc = 14 // struct: process entries + KernProcPID = 1 // by process id + KernProcProc = 8 // only return procs + KernProcPathname = 12 // path to executable + KernProcArgs = 7 // get/set arguments/proctitle +) + +const ( + sizeofPtr = C.sizeofPtr + sizeofShort = C.sizeof_short + sizeofInt = C.sizeof_int + sizeofLong = C.sizeof_long + sizeofLongLong = C.sizeof_longlong +) + +const ( + sizeOfKinfoVmentry = C.sizeof_struct_kinfo_vmentry + sizeOfKinfoProc = C.sizeof_struct_kinfo_proc +) + +// from sys/proc.h +const ( + SIDL = 1 /* Process being created by fork. */ + SRUN = 2 /* Currently runnable. */ + SSLEEP = 3 /* Sleeping on an address. */ + SSTOP = 4 /* Process debugging or suspension. */ + SZOMB = 5 /* Awaiting collection by parent. */ + SWAIT = 6 /* Waiting for interrupt. */ + SLOCK = 7 /* Blocked on a lock. */ +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type KinfoProc C.struct_kinfo_proc + +type Priority C.struct_priority + +type KinfoVmentry C.struct_kinfo_vmentry