[process]freebsd: process_freebsd_amd64.go is now generated by cgo godefs.

v1
WAKAYAMA shirou 9 years ago
parent e5c53aa342
commit 37b6b4051f

@ -7,7 +7,6 @@ import (
"encoding/binary" "encoding/binary"
"strings" "strings"
"syscall" "syscall"
"unsafe"
cpu "github.com/shirou/gopsutil/cpu" cpu "github.com/shirou/gopsutil/cpu"
"github.com/shirou/gopsutil/internal/common" "github.com/shirou/gopsutil/internal/common"
@ -41,7 +40,7 @@ func (p *Process) Ppid() (int32, error) {
return 0, err return 0, err
} }
return k.KiPpid, nil return k.Ppid, nil
} }
func (p *Process) Name() (string, error) { func (p *Process) Name() (string, error) {
k, err := p.getKProc() k, err := p.getKProc()
@ -49,7 +48,7 @@ func (p *Process) Name() (string, error) {
return "", err return "", err
} }
return string(k.KiComm[:]), nil return common.IntToString(k.Comm[:]), nil
} }
func (p *Process) Exe() (string, error) { func (p *Process) Exe() (string, error) {
return "", common.NotImplementedError return "", common.NotImplementedError
@ -105,8 +104,25 @@ func (p *Process) Status() (string, error) {
if err != nil { if err != nil {
return "", err 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) { func (p *Process) Uids() ([]int32, error) {
k, err := p.getKProc() k, err := p.getKProc()
@ -116,7 +132,7 @@ func (p *Process) Uids() ([]int32, error) {
uids := make([]int32, 0, 3) 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 return uids, nil
} }
@ -127,7 +143,7 @@ func (p *Process) Gids() ([]int32, error) {
} }
gids := make([]int32, 0, 3) 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 return gids, nil
} }
@ -137,7 +153,7 @@ func (p *Process) Terminal() (string, error) {
return "", err return "", err
} }
ttyNr := uint64(k.KiTdev) ttyNr := uint64(k.Tdev)
termmap, err := getTerminalMap() termmap, err := getTerminalMap()
if err != nil { if err != nil {
@ -162,8 +178,8 @@ func (p *Process) IOCounters() (*IOCountersStat, error) {
return nil, err return nil, err
} }
return &IOCountersStat{ return &IOCountersStat{
ReadCount: uint64(k.KiRusage.Inblock), ReadCount: uint64(k.Rusage.Inblock),
WriteCount: uint64(k.KiRusage.Oublock), WriteCount: uint64(k.Rusage.Oublock),
}, nil }, nil
} }
func (p *Process) NumCtxSwitches() (*NumCtxSwitchesStat, error) { func (p *Process) NumCtxSwitches() (*NumCtxSwitchesStat, error) {
@ -178,7 +194,7 @@ func (p *Process) NumThreads() (int32, error) {
return 0, err return 0, err
} }
return k.KiNumthreads, nil return k.Numthreads, nil
} }
func (p *Process) Threads() (map[string]string, error) { func (p *Process) Threads() (map[string]string, error) {
ret := make(map[string]string, 0) ret := make(map[string]string, 0)
@ -191,8 +207,8 @@ func (p *Process) CPUTimes() (*cpu.CPUTimesStat, error) {
} }
return &cpu.CPUTimesStat{ return &cpu.CPUTimesStat{
CPU: "cpu", CPU: "cpu",
User: float64(k.KiRusage.Utime.Sec) + float64(k.KiRusage.Utime.Usec)/1000000, User: float64(k.Rusage.Utime.Sec) + float64(k.Rusage.Utime.Usec)/1000000,
System: float64(k.KiRusage.Stime.Sec) + float64(k.KiRusage.Stime.Usec)/1000000, System: float64(k.Rusage.Stime.Sec) + float64(k.Rusage.Stime.Usec)/1000000,
}, nil }, nil
} }
func (p *Process) CPUAffinity() ([]int32, error) { func (p *Process) CPUAffinity() ([]int32, error) {
@ -210,8 +226,8 @@ func (p *Process) MemoryInfo() (*MemoryInfoStat, error) {
pageSize := common.LittleEndian.Uint16([]byte(v)) pageSize := common.LittleEndian.Uint16([]byte(v))
return &MemoryInfoStat{ return &MemoryInfoStat{
RSS: uint64(k.KiRssize) * uint64(pageSize), RSS: uint64(k.Rssize) * uint64(pageSize),
VMS: uint64(k.KiSize), VMS: uint64(k.Size),
}, nil }, nil
} }
func (p *Process) MemoryInfoEx() (*MemoryInfoExStat, error) { func (p *Process) MemoryInfoEx() (*MemoryInfoExStat, error) {
@ -254,11 +270,6 @@ func (p *Process) MemoryMaps(grouped bool) (*[]MemoryMapsStat, error) {
return &ret, common.NotImplementedError return &ret, common.NotImplementedError
} }
func copyParams(k *KinfoProc, p *Process) error {
return nil
}
func processes() ([]Process, error) { func processes() ([]Process, error) {
results := make([]Process, 0, 50) results := make([]Process, 0, 50)
@ -269,22 +280,19 @@ func processes() ([]Process, error) {
} }
// get kinfo_proc size // get kinfo_proc size
k := KinfoProc{} count := int(length / uint64(sizeOfKinfoProc))
procinfoLen := int(unsafe.Sizeof(k))
count := int(length / uint64(procinfoLen))
// parse buf to procs // parse buf to procs
for i := 0; i < count; i++ { for i := 0; i < count; i++ {
b := buf[i*procinfoLen : i*procinfoLen+procinfoLen] b := buf[i*sizeOfKinfoProc : (i+1)*sizeOfKinfoProc]
k, err := parseKinfoProc(b) k, err := parseKinfoProc(b)
if err != nil { if err != nil {
continue continue
} }
p, err := NewProcess(int32(k.KiPid)) p, err := NewProcess(int32(k.Pid))
if err != nil { if err != nil {
continue continue
} }
copyParams(&k, p)
results = append(results, *p) results = append(results, *p)
} }
@ -295,7 +303,7 @@ func processes() ([]Process, error) {
func parseKinfoProc(buf []byte) (KinfoProc, error) { func parseKinfoProc(buf []byte) (KinfoProc, error) {
var k KinfoProc var k KinfoProc
br := bytes.NewReader(buf) br := bytes.NewReader(buf)
err := binary.Read(br, binary.LittleEndian, &k) err := common.Read(br, binary.LittleEndian, &k)
return k, err return k, err
} }
@ -306,8 +314,7 @@ func (p *Process) getKProc() (*KinfoProc, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
procK := KinfoProc{} if length != sizeOfKinfoProc {
if length != uint64(unsafe.Sizeof(procK)) {
return nil, err return nil, err
} }
@ -315,7 +322,6 @@ func (p *Process) getKProc() (*KinfoProc, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
return &k, nil return &k, nil
} }

@ -13,6 +13,21 @@ const (
KernProcArgs = 7 // get/set arguments/proctitle 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 { type Timespec struct {
Sec int32 Sec int32
Nsec int32 Nsec int32
@ -44,83 +59,83 @@ type Rusage struct {
// copied from sys/user.h // copied from sys/user.h
type KinfoProc struct { type KinfoProc struct {
KiStructsize int32 Structsize int32
KiLayout int32 Layout int32
KiArgs int32 Args int32
KiPaddr int32 Paddr int32
KiAddr int32 Addr int32
KiTracep int32 Tracep int32
KiTextvp int32 Textvp int32
KiFd int32 Fd int32
KiVmspace int32 Vmspace int32
KiWchan int32 Wchan int32
KiPid int32 Pid int32
KiPpid int32 Ppid int32
KiPgid int32 Pgid int32
KiTpgid int32 Tpgid int32
KiSid int32 Sid int32
KiTsid int32 Tsid int32
KiJobc [2]byte Jobc [2]byte
KiSpareShort1 [2]byte SpareShort1 [2]byte
KiTdev int32 Tdev int32
KiSiglist [16]byte Siglist [16]byte
KiSigmask [16]byte Sigmask [16]byte
KiSigignore [16]byte Sigignore [16]byte
KiSigcatch [16]byte Sigcatch [16]byte
KiUID int32 Uid int32
KiRuid int32 Ruid int32
KiSvuid int32 Svuid int32
KiRgid int32 Rgid int32
KiSvgid int32 Svgid int32
KiNgroups [2]byte Ngroups int16
KiSpareShort2 [2]byte SpareShort2 [2]byte
KiGroups [64]byte Groups [64]byte
KiSize int32 Size int32
KiRssize int32 Rssize int32
KiSwrss int32 Swrss int32
KiTsize int32 Tsize int32
KiDsize int32 Dsize int32
KiSsize int32 Ssize int32
KiXstat [2]byte Xstat [2]byte
KiAcflag [2]byte Acflag [2]byte
KiPctcpu int32 Pctcpu int32
KiEstcpu int32 Estcpu int32
KiSlptime int32 Slptime int32
KiSwtime int32 Swtime int32
KiCow int32 Cow int32
KiRuntime int64 Runtime int64
KiStart [8]byte Start [8]byte
KiChildtime [8]byte Childtime [8]byte
KiFlag int32 Flag int32
KiKflag int32 Kflag int32
KiTraceflag int32 Traceflag int32
KiStat [1]byte Stat int8
KiNice [1]byte Nice [1]byte
KiLock [1]byte Lock [1]byte
KiRqindex [1]byte Rqindex [1]byte
KiOncpu [1]byte Oncpu [1]byte
KiLastcpu [1]byte Lastcpu [1]byte
KiOcomm [17]byte Ocomm [17]byte
KiWmesg [9]byte Wmesg [9]byte
KiLogin [18]byte Login [18]byte
KiLockname [9]byte Lockname [9]byte
KiComm [20]byte Comm [20]int8
KiEmul [17]byte Emul [17]byte
KiSparestrings [68]byte Sparestrings [68]byte
KiSpareints [36]byte Spareints [36]byte
KiCrFlags int32 CrFlags int32
KiJid int32 Jid int32
KiNumthreads int32 Numthreads int32
KiTid int32 Tid int32
KiPri int32 Pri int32
KiRusage Rusage Rusage Rusage
KiRusageCh [72]byte RusageCh [72]byte
KiPcb int32 Pcb int32
KiKstack int32 Kstack int32
KiUdata int32 Udata int32
KiTdaddr int32 Tdaddr int32
KiSpareptrs [24]byte Spareptrs [24]byte
KiSpareint64s [48]byte Spareint64s [48]byte
KiSflag int32 Sflag int32
KiTdflags int32 Tdflags int32
} }

@ -1,125 +1,192 @@
// +build freebsd // Created by cgo -godefs - DO NOT EDIT
// +build amd64 // cgo -godefs types_freebsd.go
package process package process
// copied from sys/sysctl.h
const ( const (
CTLKern = 1 // "high kernel": proc, limits CTLKern = 1
KernProc = 14 // struct: process entries KernProc = 14
KernProcPID = 1 // by process id KernProcPID = 1
KernProcProc = 8 // only return procs KernProcProc = 8
KernProcPathname = 12 // path to executable KernProcPathname = 12
KernProcArgs = 7 // get/set arguments/proctitle 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 { type Timespec struct {
Sec int64 Sec int64
Nsec int64 Nsec int64
} }
type Timeval struct { type Timeval struct {
Sec int64 Sec int64
Usec int64 Usec int64
} }
type Rusage struct { type Rusage struct {
Utime Timeval Utime Timeval
Stime Timeval Stime Timeval
Maxrss int64 Maxrss int64
Ixrss int64 Ixrss int64
Idrss int64 Idrss int64
Isrss int64 Isrss int64
Minflt int64 Minflt int64
Majflt int64 Majflt int64
Nswap int64 Nswap int64
Inblock int64 Inblock int64
Oublock int64 Oublock int64
Msgsnd int64 Msgsnd int64
Msgrcv int64 Msgrcv int64
Nsignals int64 Nsignals int64
Nvcsw int64 Nvcsw int64
Nivcsw int64 Nivcsw int64
}
type Rlimit struct {
Cur int64
Max int64
} }
// copied from sys/user.h
type KinfoProc struct { type KinfoProc struct {
KiStructsize int32 Structsize int32
KiLayout int32 Layout int32
KiArgs int64 Args int64 /* pargs */
KiPaddr int64 Paddr int64 /* proc */
KiAddr int64 Addr int64 /* user */
KiTracep int64 Tracep int64 /* vnode */
KiTextvp int64 Textvp int64 /* vnode */
KiFd int64 Fd int64 /* filedesc */
KiVmspace int64 Vmspace int64 /* vmspace */
KiWchan int64 Wchan int64
KiPid int32 Pid int32
KiPpid int32 Ppid int32
KiPgid int32 Pgid int32
KiTpgid int32 Tpgid int32
KiSid int32 Sid int32
KiTsid int32 Tsid int32
KiJobc [2]byte Jobc int16
KiSpareShort1 [2]byte Spare_short1 int16
KiTdev int32 Tdev uint32
KiSiglist [16]byte Siglist [16]byte /* sigset */
KiSigmask [16]byte Sigmask [16]byte /* sigset */
KiSigignore [16]byte Sigignore [16]byte /* sigset */
KiSigcatch [16]byte Sigcatch [16]byte /* sigset */
KiUID int32 Uid uint32
KiRuid int32 Ruid uint32
KiSvuid int32 Svuid uint32
KiRgid int32 Rgid uint32
KiSvgid int32 Svgid uint32
KiNgroups [2]byte Ngroups int16
KiSpareShort2 [2]byte Spare_short2 int16
KiGroups [64]byte Groups [16]uint32
KiSize int64 Size uint64
KiRssize int64 Rssize int64
KiSwrss int64 Swrss int64
KiTsize int64 Tsize int64
KiDsize int64 Dsize int64
KiSsize int64 Ssize int64
KiXstat [2]byte Xstat uint16
KiAcflag [2]byte Acflag uint16
KiPctcpu int32 Pctcpu uint32
KiEstcpu int32 Estcpu uint32
KiSlptime int32 Slptime uint32
KiSwtime int32 Swtime uint32
KiCow int32 Cow uint32
KiRuntime int64 Runtime uint64
KiStart [16]byte Start Timeval
KiChildtime [16]byte Childtime Timeval
KiFlag int64 Flag int64
KiKflag int64 Kiflag int64
KiTraceflag int32 Traceflag int32
KiStat [1]byte Stat int8
KiNice [1]byte Nice int8
KiLock [1]byte Lock int8
KiRqindex [1]byte Rqindex int8
KiOncpu [1]byte Oncpu uint8
KiLastcpu [1]byte Lastcpu uint8
KiOcomm [17]byte Tdname [17]int8
KiWmesg [9]byte Wmesg [9]int8
KiLogin [18]byte Login [18]int8
KiLockname [9]byte Lockname [9]int8
KiComm [20]byte Comm [20]int8
KiEmul [17]byte Emul [17]int8
KiSparestrings [68]byte Loginclass [18]int8
KiSpareints [36]byte Sparestrings [50]int8
KiCrFlags int32 Spareints [7]int32
KiJid int32 Flag2 int32
KiNumthreads int32 Fibnum int32
KiTid int32 Cr_flags uint32
KiPri int32 Jid int32
KiRusage Rusage Numthreads int32
KiRusageCh [144]byte Tid int32
KiPcb int64 Pri Priority
KiKstack int64 Rusage Rusage
KiUdata int64 Rusage_ch Rusage
KiTdaddr int64 Pcb int64 /* pcb */
KiSpareptrs [48]byte Kstack int64
KiSpareint64s [96]byte Udata int64
KiSflag int64 Tdaddr int64 /* thread */
KiTdflags int64 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
} }

@ -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 <sys/types.h>
#include <sys/user.h>
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
Loading…
Cancel
Save