diff --git a/CMakeLists.txt b/CMakeLists.txt index 07e197f02..cd09fd47a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -110,6 +110,9 @@ option(ENABLE_LIBZFS "Enable libzfs" ON) if(WIN32 AND NOT CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") option(ENABLE_WIN7_COMPAT "Enable Windows 7 compatibility" ON) endif() +if(APPLE) + option(ENABLE_APPLE_MEMSIZE_USABLE "Use usable memory size as total memory size in Memory module, to match other systems" ON) +endif() set(BINARY_LINK_TYPE_OPTIONS dlopen dynamic static) set(BINARY_LINK_TYPE dlopen CACHE STRING "How to link fastfetch") @@ -1424,6 +1427,14 @@ elseif(GNU) target_compile_definitions(libfastfetch PUBLIC _GNU_SOURCE PATH_MAX=4096 O_PATH=0) endif() +if(APPLE) + if(ENABLE_APPLE_MEMSIZE_USABLE) + target_compile_definitions(libfastfetch PUBLIC FF_APPLE_MEMSIZE_USABLE=1) + else() + target_compile_definitions(libfastfetch PUBLIC FF_APPLE_MEMSIZE_USABLE=0) + endif() +endif() + if(WIN32) check_function_exists(_msize HAVE_MSVC_MSIZE) if(HAVE_MSVC_MSIZE) diff --git a/src/common/impl/init.c b/src/common/impl/init.c index ab9d0ad53..0825aec0a 100644 --- a/src/common/impl/init.c +++ b/src/common/impl/init.c @@ -258,6 +258,9 @@ void ffListFeatures(void) #if FF_WIN7_COMPAT "Windows 7 Compatibility\n" #endif + #if FF_APPLE_MEMSIZE_USABLE + "Apple memsize_usable\n" + #endif "" , stdout); } diff --git a/src/detection/memory/memory_apple.c b/src/detection/memory/memory_apple.c index 21a6d15ae..234db1186 100644 --- a/src/detection/memory/memory_apple.c +++ b/src/detection/memory/memory_apple.c @@ -9,30 +9,25 @@ const char* ffDetectMemory(FFMemoryResult* ram) { size_t length = sizeof(ram->bytesTotal); + + #if FF_APPLE_MEMSIZE_USABLE + if (sysctlbyname("hw.memsize_usable", &ram->bytesTotal, &length, NULL, 0) != 0) + return "Failed to read hw.memsize_usable"; + #else if (sysctl((int[]){ CTL_HW, HW_MEMSIZE }, 2, &ram->bytesTotal, &length, NULL, 0) != 0) return "Failed to read hw.memsize"; - uint64_t usableMemory = 0; - length = sizeof(usableMemory); - if (sysctlbyname("hw.memsize_usable", &usableMemory, &length, NULL, 0) != 0) - usableMemory = ram->bytesTotal; + #endif mach_msg_type_number_t count = HOST_VM_INFO64_COUNT; vm_statistics64_data_t vmstat; if(host_statistics64(mach_host_self(), HOST_VM_INFO64, (host_info64_t) (&vmstat), &count) != KERN_SUCCESS) return "Failed to read host_statistics64"; - uint64_t pageSize = instance.state.platform.sysinfo.pageSize; - uint64_t appMemory = vmstat.internal_page_count * pageSize; // memory allocated by `mmap(..., MAP_ANON | MAP_PRIVATE, ...)`, i.e. malloc(3) - uint64_t wiredMemory = vmstat.wire_count * pageSize; - uint64_t compressed = vmstat.compressor_page_count * pageSize; - uint64_t reserved = ram->bytesTotal - usableMemory; + // https://github.com/st3fan/osx-10.9/blob/34e34a6a539b5a822cda4074e56a7ced9b57da71/system_cmds-597.1.1/vm_stat.tproj/vm_stat.c#L139 - FF_DEBUG("App: %.2f GiB", (double) appMemory / 1024. / 1024. / 1024.); - FF_DEBUG("Wired: %.2f GiB", (double) wiredMemory / 1024. / 1024. / 1024.); - FF_DEBUG("Compressed: %.2f GiB", (double) compressed / 1024. / 1024. / 1024.); - FF_DEBUG("Reserved: %.2f GiB", (double) reserved / 1024. / 1024. / 1024.); - - ram->bytesUsed = appMemory + wiredMemory + compressed + reserved; + uint64_t pagesFree = vmstat.free_count - vmstat.speculative_count; + uint64_t pagesFileBacked = vmstat.external_page_count; // Cached files + ram->bytesUsed = ram->bytesTotal - (pagesFree + pagesFileBacked) * instance.state.platform.sysinfo.pageSize; return NULL; }