73 lines
1.1 KiB
Go
73 lines
1.1 KiB
Go
// +build darwin
|
|
|
|
package ps
|
|
|
|
// #include "process_darwin.h"
|
|
import "C"
|
|
|
|
import (
|
|
"sync"
|
|
)
|
|
|
|
// This lock is what verifies that C calling back into Go is only
|
|
// modifying data once at a time.
|
|
var darwinLock sync.Mutex
|
|
var darwinProcs []Process
|
|
|
|
type DarwinProcess struct {
|
|
pid int
|
|
ppid int
|
|
binary string
|
|
}
|
|
|
|
func (p *DarwinProcess) Pid() int {
|
|
return p.pid
|
|
}
|
|
|
|
func (p *DarwinProcess) PPid() int {
|
|
return p.ppid
|
|
}
|
|
|
|
func (p *DarwinProcess) Executable() string {
|
|
return p.binary
|
|
}
|
|
|
|
//export go_darwin_append_proc
|
|
func go_darwin_append_proc(pid C.pid_t, ppid C.pid_t, comm *C.char) {
|
|
proc := &DarwinProcess{
|
|
pid: int(pid),
|
|
ppid: int(ppid),
|
|
binary: C.GoString(comm),
|
|
}
|
|
|
|
darwinProcs = append(darwinProcs, proc)
|
|
}
|
|
|
|
func findProcess(pid int) (Process, error) {
|
|
ps, err := processes()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
for _, p := range ps {
|
|
if p.Pid() == pid {
|
|
return p, nil
|
|
}
|
|
}
|
|
|
|
return nil, nil
|
|
}
|
|
|
|
func processes() ([]Process, error) {
|
|
darwinLock.Lock()
|
|
defer darwinLock.Unlock()
|
|
darwinProcs = make([]Process, 0, 50)
|
|
|
|
_, err := C.darwinProcesses()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return darwinProcs, nil
|
|
}
|