--- src/apple/ram.cpp 2026-07-01 06:43:12.000000000 +0800 +++ src/apple/ram.cpp 2026-07-01 18:09:30.000000000 +0800 @@ -10,6 +10,7 @@ #include #include #include +#include #include @@ -34,24 +34,28 @@ // _____________________________________________________________________________________________________________________ uint64_t Memory::size() const { - uint64_t sum = 0; - for (const auto& module : _modules) { - sum += module._size_bytes; + // If module info is not populated, fall back to the system total. + if (!_modules.empty()) { + uint64_t sum = 0; + for (const auto& module : _modules) { + sum += module._size_bytes; + } + return sum; } - return sum; + return getMemSize(); } // _____________________________________________________________________________________________________________________ uint64_t Memory::free() const { + vm_size_t pageSize; + host_page_size(mach_host_self(), &pageSize); +#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 && !defined(__i386__) && !defined(__ppc__) vm_statistics64_data_t vmStats; mach_msg_type_number_t infoCount = HOST_VM_INFO64_COUNT; kern_return_t kernReturn = host_statistics64(mach_host_self(), HOST_VM_INFO64, reinterpret_cast(&vmStats), &infoCount); if (kernReturn == KERN_SUCCESS) { - vm_size_t pageSize; - host_page_size(mach_host_self(), &pageSize); - int64_t totalMemory = getMemSize(); if (totalMemory == -1) return -1; @@ -64,18 +76,40 @@ const int64_t usedMemory = appMemory + wiredMemory + compressedMemory; return totalMemory - usedMemory; } +#else + vm_statistics_data_t vmStats; + mach_msg_type_number_t infoCount = HOST_VM_INFO_COUNT; + kern_return_t kernReturn = + host_statistics(mach_host_self(), HOST_VM_INFO, reinterpret_cast(&vmStats), &infoCount); + + if (kernReturn == KERN_SUCCESS) { + return static_cast(vmStats.free_count) * static_cast(pageSize); + } +#endif return 0; } // _____________________________________________________________________________________________________________________ uint64_t Memory::available() const { +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1060 || defined(__i386__) || defined(__ppc__) + vm_size_t pageSize; + host_page_size(mach_host_self(), &pageSize); + vm_statistics_data_t vmStats; + mach_msg_type_number_t infoCount = HOST_VM_INFO_COUNT; + + if (host_statistics(mach_host_self(), HOST_VM_INFO, + reinterpret_cast(&vmStats), &infoCount) == KERN_SUCCESS) { + return static_cast(vmStats.free_count + vmStats.inactive_count) * static_cast(pageSize); + } +#else int64_t usableMemSize; size_t size = sizeof(usableMemSize); if (sysctlbyname("hw.memsize_usable", &usableMemSize, &size, nullptr, 0) == 0) { return usableMemSize; } +#endif return 0; }