From 7859aa0db9cabce6bb26ff041c0526404720bf7d Mon Sep 17 00:00:00 2001 From: Holger Vogt Date: Fri, 17 Apr 2026 17:10:31 +0200 Subject: [PATCH 1/2] Updating the 'available memory' measurement for Apple ARM 64 bit --- src/frontend/get_avail_mem_size.c | 33 ++++++++++++++++--------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/src/frontend/get_avail_mem_size.c b/src/frontend/get_avail_mem_size.c index 1148c1e91..d110cfd19 100644 --- a/src/frontend/get_avail_mem_size.c +++ b/src/frontend/get_avail_mem_size.c @@ -65,26 +65,27 @@ unsigned long long getAvailableMemorySize(void) #elif defined(__APPLE__) && defined(__MACH__) - mach_port_t host_port; - mach_msg_type_number_t host_size; - vm_size_t pagesize; +#include +#include +#include +#include - host_port = mach_host_self(); - host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t); - host_page_size(host_port, &pagesize); + mach_msg_type_number_t count = HOST_VM_INFO64_COUNT; - vm_statistics_data_t vm_stat; + vm_statistics64_data_t vmstats; - if (host_statistics(host_port, HOST_VM_INFO, (host_info_t) &vm_stat, - &host_size) != KERN_SUCCESS) { - fprintf(stderr, "Failed to fetch vm statistics"); + if (host_statistics64(mach_host_self(), HOST_VM_INFO64, + (host_info64_t)&vmstats, &count) == KERN_SUCCESS) { + // Calculate available memory (free + inactive) + const int page_size = PAGE_SIZE; + uint64_t free_memory = (uint64_t)vmstats.free_count * page_size; + uint64_t inactive_memory = (uint64_t)vmstats.inactive_count * page_size; + uint64_t available_memory = free_memory + inactive_memory; + + return available_memory; } - - /* Stats in bytes */ -/* natural_t mem_used = (vm_stat.active_count + vm_stat.inactive_count + - vm_stat.wire_count) * pagesize; */ - return (unsigned long long)(vm_stat.free_count * pagesize); -// natural_t mem_total = mem_used + mem_free; + else + return 0; #elif defined(__unix__) || defined(__unix) || defined(unix) /* Linux/UNIX variants. ------------------------------------------- */ From 21b3131e12f0f43102105ea6b9ffd2f99714b953 Mon Sep 17 00:00:00 2001 From: Holger Vogt Date: Sat, 18 Apr 2026 13:27:07 +0200 Subject: [PATCH 2/2] Implement getrusage() with ru_maxrss permanently for Apple ARM. --- src/frontend/get_resident_set_size.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/frontend/get_resident_set_size.c b/src/frontend/get_resident_set_size.c index 6325940a2..0824174e0 100644 --- a/src/frontend/get_resident_set_size.c +++ b/src/frontend/get_resident_set_size.c @@ -33,7 +33,6 @@ #error "Cannot define getPeakRSS( ) or getCurrentRSS( ) for an unknown OS." #endif - /** * Returns the peak (maximum so far) resident set size (physical * memory use) measured in bytes, or zero if the value cannot be @@ -72,6 +71,13 @@ unsigned long long getPeakRSS(void) GetProcessMemoryInfo( GetCurrentProcess( ), &info, sizeof(info) ); return (unsigned long long) info.PeakWorkingSetSize; +#elif defined(__APPLE__) && defined(__MACH__) + struct rusage rusage; + if (getrusage(RUSAGE_SELF, &rusage) == 0) + return (unsigned long long) rusage.ru_maxrss; + else + return 0L; + #elif (defined(_AIX) || defined(__TOS__AIX__)) || (defined(__sun__) || defined(__sun) || defined(sun) && (defined(__SVR4) || defined(__svr4__))) /* AIX and Solaris ------------------------------------------ */ struct psinfo psinfo; @@ -92,10 +98,6 @@ unsigned long long getPeakRSS(void) #endif } - - - - /** * Returns the current resident set size (physical memory use) measured * in bytes, or zero if the value cannot be determined on this OS.