github.com/isyscore/isc-gobase@v1.5.3-0.20231218061332-cbc7451899e9/system/mem/mem_darwin_cgo.go (about) 1 //go:build darwin && cgo 2 3 package mem 4 5 /* 6 #include <mach/mach_host.h> 7 */ 8 import "C" 9 10 import ( 11 "context" 12 "fmt" 13 "unsafe" 14 15 "golang.org/x/sys/unix" 16 ) 17 18 // VirtualMemory returns VirtualmemoryStat. 19 func VirtualMemory() (*VirtualMemoryStat, error) { 20 return VirtualMemoryWithContext(context.Background()) 21 } 22 23 func VirtualMemoryWithContext(ctx context.Context) (*VirtualMemoryStat, error) { 24 count := C.mach_msg_type_number_t(C.HOST_VM_INFO_COUNT) 25 var vmstat C.vm_statistics_data_t 26 27 status := C.host_statistics(C.host_t(C.mach_host_self()), 28 C.HOST_VM_INFO, 29 C.host_info_t(unsafe.Pointer(&vmstat)), 30 &count) 31 32 if status != C.KERN_SUCCESS { 33 return nil, fmt.Errorf("host_statistics error=%d", int(status)) 34 } 35 36 pageSize := uint64(unix.Getpagesize()) 37 total, err := getHwMemsize() 38 if err != nil { 39 return nil, err 40 } 41 totalCount := C.natural_t(total / pageSize) 42 43 availableCount := vmstat.inactive_count + vmstat.free_count 44 usedPercent := 100 * float64(totalCount-availableCount) / float64(totalCount) 45 46 usedCount := totalCount - availableCount 47 48 return &VirtualMemoryStat{ 49 Total: total, 50 Available: pageSize * uint64(availableCount), 51 Used: pageSize * uint64(usedCount), 52 UsedPercent: usedPercent, 53 Free: pageSize * uint64(vmstat.free_count), 54 Active: pageSize * uint64(vmstat.active_count), 55 Inactive: pageSize * uint64(vmstat.inactive_count), 56 Wired: pageSize * uint64(vmstat.wire_count), 57 }, nil 58 }