Add a fallback option for outdated Darwin kernels without compressed memory support. task_vm_info_data_t has been implemented since macOS 10.9, but task_vm_info_data_t.phys_footprint can only be used since macOS 10.11. --- Python/gc_free_threading.c +++ Python/gc_free_threading.c @@ -25,8 +25,9 @@ #include // For sysconf, getpid #elif defined(__APPLE__) #include - #include // Required for TASK_VM_INFO + #include // Required for TASK_VM_INFO/TASK_BASIC_INFO #include // For sysconf, getpid + #include // For macOS version checks #elif defined(__FreeBSD__) #include #include @@ -1984,6 +1985,9 @@ get_process_mem_usage(void) return -1; #elif defined(__APPLE__) +#if defined(MAC_OS_X_VERSION_MIN_REQUIRED) \ + && (defined(MAC_OS_X_VERSION_10_11) && \ + MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_11) // --- MacOS (Darwin) --- // Returns phys_footprint (RAM + compressed memory) task_vm_info_data_t vm_info; @@ -1996,6 +2000,18 @@ get_process_mem_usage(void) } // phys_footprint is in bytes. Convert to KB. return (Py_ssize_t)(vm_info.phys_footprint / 1024); + #else + task_basic_info_data_t info; + mach_msg_type_number_t count = TASK_BASIC_INFO_COUNT; + kern_return_t kerr; + + kerr = task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)&info, &count); + if (kerr != KERN_SUCCESS) { + return -1; + } + // resident_size is in bytes. Convert to KB. + return (Py_ssize_t)(info.resident_size / 1024); +#endif #elif defined(__FreeBSD__) // NOTE: Returns RSS only. Per-process swap usage isn't readily available