From e904e17af7361e65c0daf1082de4a3f87bfa71c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pa=CC=84vels=20Nadtoc=CC=8Cajevs?= <7645683+bruvzg@users.noreply.github.com> Date: Wed, 30 Jul 2025 09:43:08 +0300 Subject: [PATCH] [iOS/macOS] Improve OS.get_memory_info --- drivers/unix/os_unix.cpp | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/drivers/unix/os_unix.cpp b/drivers/unix/os_unix.cpp index 31f7392d9b4..71ccd86460c 100644 --- a/drivers/unix/os_unix.cpp +++ b/drivers/unix/os_unix.cpp @@ -45,6 +45,7 @@ #if defined(__APPLE__) #include #include +#include #include #include #include @@ -409,14 +410,8 @@ Dictionary OS_Unix::get_memory_info() const { meminfo["stack"] = -1; #if defined(__APPLE__) - int pagesize = 0; - size_t len = sizeof(pagesize); - if (sysctlbyname("vm.pagesize", &pagesize, &len, nullptr, 0) < 0) { - ERR_PRINT(vformat("Could not get vm.pagesize, error code: %d - %s", errno, strerror(errno))); - } - int64_t phy_mem = 0; - len = sizeof(phy_mem); + size_t len = sizeof(phy_mem); if (sysctlbyname("hw.memsize", &phy_mem, &len, nullptr, 0) < 0) { ERR_PRINT(vformat("Could not get hw.memsize, error code: %d - %s", errno, strerror(errno))); } @@ -426,21 +421,30 @@ Dictionary OS_Unix::get_memory_info() const { if (host_statistics64(mach_host_self(), HOST_VM_INFO64, (host_info64_t)&vmstat, &count) != KERN_SUCCESS) { ERR_PRINT("Could not get host vm statistics."); } - struct xsw_usage swap_used; + int64_t used = (vmstat.active_count + vmstat.inactive_count + vmstat.speculative_count + vmstat.wire_count + vmstat.compressor_page_count - vmstat.purgeable_count - vmstat.external_page_count) * (int64_t)vm_page_size; + +#if !defined(APPLE_EMBEDDED_ENABLED) + struct xsw_usage swap_used = {}; len = sizeof(swap_used); if (sysctlbyname("vm.swapusage", &swap_used, &len, nullptr, 0) < 0) { ERR_PRINT(vformat("Could not get vm.swapusage, error code: %d - %s", errno, strerror(errno))); } +#endif if (phy_mem != 0) { meminfo["physical"] = phy_mem; } - if (vmstat.free_count * (int64_t)pagesize != 0) { - meminfo["free"] = vmstat.free_count * (int64_t)pagesize; + if (used != 0) { + meminfo["free"] = phy_mem - used; } - if (swap_used.xsu_avail + vmstat.free_count * (int64_t)pagesize != 0) { - meminfo["available"] = swap_used.xsu_avail + vmstat.free_count * (int64_t)pagesize; +#if defined(APPLE_EMBEDDED_ENABLED) + meminfo["available"] = meminfo["free"]; +#else + if (swap_used.xsu_avail + (phy_mem - used) != 0) { + meminfo["available"] = swap_used.xsu_avail + (phy_mem - used); } +#endif + #elif defined(__FreeBSD__) int pagesize = 0; size_t len = sizeof(pagesize);