@@ -434,20 +434,19 @@ void Platform_setMemoryValues(Meter* mtr) {
434434 mtr -> values [MEMORY_CLASS_WIRED ] = page_K * vm -> wire_count ;
435435
436436 /*
437- * Guard against unsigned underflow: on macOS, external_page_count
438- * (file-backed pages) can exceed active_count, causing the unsigned
439- * subtraction to wrap around to ~4 billion pages (~64 TB on 16K-page
440- * ARM64 systems). Cast to double before subtracting to use signed
441- * arithmetic, and clamp the result to zero.
437+ * Use saturatingSub() to prevent unsigned underflow: on macOS,
438+ * external_page_count (file-backed pages) can exceed active_count,
439+ * causing the result to wrap around to ~4 billion pages (~64 TB on
440+ * 16K-page ARM64 systems).
442441 */
443442 if (settings -> showCachedMemory ) {
444443 mtr -> values [MEMORY_CLASS_SPECULATIVE ] = page_K * vm -> speculative_count ;
445- mtr -> values [MEMORY_CLASS_ACTIVE ] = MAXIMUM ( 0 , page_K * (( double ) vm -> active_count - ( double )vm -> purgeable_count - ( double ) external_page_count ) );
444+ mtr -> values [MEMORY_CLASS_ACTIVE ] = page_K * saturatingSub ( vm -> active_count , ( unsigned long long )vm -> purgeable_count + external_page_count );
446445 mtr -> values [MEMORY_CLASS_PURGEABLE ] = page_K * vm -> purgeable_count ;
447446 }
448447 else {
449448 mtr -> values [MEMORY_CLASS_SPECULATIVE ] = 0 ;
450- mtr -> values [MEMORY_CLASS_ACTIVE ] = MAXIMUM ( 0 , page_K * (( double )vm -> speculative_count + ( double ) vm -> active_count - ( double ) external_page_count ) );
449+ mtr -> values [MEMORY_CLASS_ACTIVE ] = page_K * saturatingSub (( unsigned long long )vm -> speculative_count + vm -> active_count , external_page_count );
451450 mtr -> values [MEMORY_CLASS_PURGEABLE ] = 0 ;
452451 }
453452 mtr -> values [MEMORY_CLASS_COMPRESSED ] = page_K * compressor_page_count ;
0 commit comments