diff --git a/component/memory/memory_darwin.go b/component/memory/memory_darwin.go index 3e9e6971..1dd33af3 100644 --- a/component/memory/memory_darwin.go +++ b/component/memory/memory_darwin.go @@ -6,9 +6,7 @@ import ( "github.com/ebitengine/purego" ) -const ( - PROC_PIDTASKINFO = 4 -) +const PROC_PIDTASKINFO = 4 type ProcTaskInfo struct { Virtual_size uint64 @@ -31,89 +29,24 @@ type ProcTaskInfo struct { Priority int32 } -// Library represents a dynamic library loaded by purego. -type Library struct { - addr uintptr - path string - close func() -} +const System = "/usr/lib/libSystem.B.dylib" -func NewLibrary(path string) (*Library, error) { - lib, err := purego.Dlopen(path, purego.RTLD_LAZY|purego.RTLD_GLOBAL) - if err != nil { - return nil, err - } +type ProcPidInfoFunc func(pid, flavor int32, arg uint64, buffer uintptr, bufferSize int32) int32 - closeFunc := func() { - purego.Dlclose(lib) - } - - return &Library{ - addr: lib, - path: path, - close: closeFunc, - }, nil -} - -func (lib *Library) Dlsym(symbol string) (uintptr, error) { - return purego.Dlsym(lib.addr, symbol) -} - -func GetFunc[T any](lib *Library, symbol string) T { - var fptr T - purego.RegisterLibFunc(&fptr, lib.addr, symbol) - return fptr -} - -func (lib *Library) Close() { - lib.close() -} - -// library paths -const ( - System = "/usr/lib/libSystem.B.dylib" -) - -// System functions and symbols. -type ( - ProcPidInfoFunc func(pid, flavor int32, arg uint64, buffer uintptr, bufferSize int32) int32 -) - -const ( - ProcPidInfoSym = "proc_pidinfo" -) - -type dlFuncs struct { - lib *Library - - procPidInfo ProcPidInfoFunc -} - -func loadProcFuncs() (*dlFuncs, error) { - lib, err := NewLibrary(System) - if err != nil { - return nil, err - } - - return &dlFuncs{ - lib: lib, - procPidInfo: GetFunc[ProcPidInfoFunc](lib, ProcPidInfoSym), - }, nil -} - -func (f *dlFuncs) Close() { - f.lib.Close() -} +const ProcPidInfoSym = "proc_pidinfo" func GetMemoryInfo(pid int32) (*MemoryInfoStat, error) { - funcs, err := loadProcFuncs() + lib, err := purego.Dlopen(System, purego.RTLD_LAZY|purego.RTLD_GLOBAL) if err != nil { return nil, err } - defer funcs.Close() + defer purego.Dlclose(lib) + + var procPidInfo ProcPidInfoFunc + purego.RegisterLibFunc(&procPidInfo, lib, ProcPidInfoSym) var ti ProcTaskInfo - funcs.procPidInfo(pid, PROC_PIDTASKINFO, 0, uintptr(unsafe.Pointer(&ti)), int32(unsafe.Sizeof(ti))) + procPidInfo(pid, PROC_PIDTASKINFO, 0, uintptr(unsafe.Pointer(&ti)), int32(unsafe.Sizeof(ti))) ret := &MemoryInfoStat{ RSS: uint64(ti.Resident_size),