Skip to content

Commit ecb76f5

Browse files
author
Dmitrii Esin
committed
darwin: use saturatingSub() instead of double cast for memory underflow fix
1 parent 8671d21 commit ecb76f5

1 file changed

Lines changed: 6 additions & 7 deletions

File tree

darwin/Platform.c

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)