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. ------------------------------------------- */ 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.