From 054e63cb3fa4e5183eed4576badc7e29e1f087c8 Mon Sep 17 00:00:00 2001 From: wwqgtxx Date: Mon, 10 Nov 2025 00:13:58 +0800 Subject: [PATCH] chore: remove depend of purego --- component/memory/memory_darwin.go | 47 ++++++++++++++++---------- component/memory/memory_darwin_amd64.s | 9 +++++ component/memory/memory_darwin_arm64.s | 9 +++++ go.mod | 1 - go.sum | 2 -- 5 files changed, 47 insertions(+), 21 deletions(-) create mode 100644 component/memory/memory_darwin_amd64.s create mode 100644 component/memory/memory_darwin_arm64.s diff --git a/component/memory/memory_darwin.go b/component/memory/memory_darwin.go index 1dd33af3..63356fe5 100644 --- a/component/memory/memory_darwin.go +++ b/component/memory/memory_darwin.go @@ -1,9 +1,9 @@ package memory import ( + "syscall" "unsafe" - - "github.com/ebitengine/purego" + _ "unsafe" ) const PROC_PIDTASKINFO = 4 @@ -29,24 +29,12 @@ type ProcTaskInfo struct { Priority int32 } -const System = "/usr/lib/libSystem.B.dylib" - -type ProcPidInfoFunc func(pid, flavor int32, arg uint64, buffer uintptr, bufferSize int32) int32 - -const ProcPidInfoSym = "proc_pidinfo" - func GetMemoryInfo(pid int32) (*MemoryInfoStat, error) { - lib, err := purego.Dlopen(System, purego.RTLD_LAZY|purego.RTLD_GLOBAL) - if err != nil { - return nil, err - } - defer purego.Dlclose(lib) - - var procPidInfo ProcPidInfoFunc - purego.RegisterLibFunc(&procPidInfo, lib, ProcPidInfoSym) - var ti ProcTaskInfo - procPidInfo(pid, PROC_PIDTASKINFO, 0, uintptr(unsafe.Pointer(&ti)), int32(unsafe.Sizeof(ti))) + _, _, errno := syscall_syscall6(proc_pidinfo_trampoline_addr, uintptr(pid), PROC_PIDTASKINFO, 0, uintptr(unsafe.Pointer(&ti)), unsafe.Sizeof(ti), 0) + if errno != 0 { + return nil, errno + } ret := &MemoryInfoStat{ RSS: uint64(ti.Resident_size), @@ -54,3 +42,26 @@ func GetMemoryInfo(pid int32) (*MemoryInfoStat, error) { } return ret, nil } + +var proc_pidinfo_trampoline_addr uintptr + +//go:cgo_import_dynamic proc_pidinfo proc_pidinfo "/usr/lib/libSystem.B.dylib" + +// from golang.org/x/sys@v0.30.0/unix/syscall_darwin_libSystem.go + +// Implemented in the runtime package (runtime/sys_darwin.go) +func syscall_syscall(fn, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) +func syscall_syscall6(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) +func syscall_syscall6X(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) +func syscall_syscall9(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) // 32-bit only +func syscall_rawSyscall(fn, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) +func syscall_rawSyscall6(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) +func syscall_syscallPtr(fn, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) + +//go:linkname syscall_syscall syscall.syscall +//go:linkname syscall_syscall6 syscall.syscall6 +//go:linkname syscall_syscall6X syscall.syscall6X +//go:linkname syscall_syscall9 syscall.syscall9 +//go:linkname syscall_rawSyscall syscall.rawSyscall +//go:linkname syscall_rawSyscall6 syscall.rawSyscall6 +//go:linkname syscall_syscallPtr syscall.syscallPtr diff --git a/component/memory/memory_darwin_amd64.s b/component/memory/memory_darwin_amd64.s new file mode 100644 index 00000000..4c17419a --- /dev/null +++ b/component/memory/memory_darwin_amd64.s @@ -0,0 +1,9 @@ +// go run mkasm.go darwin amd64 +// Code generated by the command above; DO NOT EDIT. + +#include "textflag.h" + +TEXT proc_pidinfo_trampoline<>(SB),NOSPLIT,$0-0 + JMP proc_pidinfo(SB) +GLOBL ·proc_pidinfo_trampoline_addr(SB), RODATA, $8 +DATA ·proc_pidinfo_trampoline_addr(SB)/8, $proc_pidinfo_trampoline<>(SB) diff --git a/component/memory/memory_darwin_arm64.s b/component/memory/memory_darwin_arm64.s new file mode 100644 index 00000000..645bc680 --- /dev/null +++ b/component/memory/memory_darwin_arm64.s @@ -0,0 +1,9 @@ +// go run mkasm.go darwin arm64 +// Code generated by the command above; DO NOT EDIT. + +#include "textflag.h" + +TEXT proc_pidinfo_trampoline<>(SB),NOSPLIT,$0-0 + JMP proc_pidinfo(SB) +GLOBL ·proc_pidinfo_trampoline_addr(SB), RODATA, $8 +DATA ·proc_pidinfo_trampoline_addr(SB)/8, $proc_pidinfo_trampoline<>(SB) diff --git a/go.mod b/go.mod index 17f18b2d..d203eb64 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,6 @@ require ( github.com/bahlo/generic-list-go v0.2.0 github.com/coreos/go-iptables v0.8.0 github.com/dlclark/regexp2 v1.11.5 - github.com/ebitengine/purego v0.9.1 github.com/enfein/mieru/v3 v3.22.1 github.com/go-chi/chi/v5 v5.2.3 github.com/go-chi/render v1.0.3 diff --git a/go.sum b/go.sum index d8e51c5a..4670178e 100644 --- a/go.sum +++ b/go.sum @@ -23,8 +23,6 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dlclark/regexp2 v1.11.5 h1:Q/sSnsKerHeCkc/jSTNq1oCm7KiVgUMZRDUoRu0JQZQ= github.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= -github.com/ebitengine/purego v0.9.1 h1:a/k2f2HQU3Pi399RPW1MOaZyhKJL9w/xFpKAg4q1s0A= -github.com/ebitengine/purego v0.9.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/enfein/mieru/v3 v3.22.1 h1:/XGYYXpEhEJlxosmtbpEJkhtRLHB8IToG7LB8kU2ZDY= github.com/enfein/mieru/v3 v3.22.1/go.mod h1:zJBUCsi5rxyvHM8fjFf+GLaEl4OEjjBXr1s5F6Qd3hM= github.com/ericlagergren/aegis v0.0.0-20250325060835-cd0defd64358 h1:kXYqH/sL8dS/FdoFjr12ePjnLPorPo2FsnrHNuXSDyo=