Skip to content

Commit d743140

Browse files
committed
fall back to MADV_DONTNEED if MADV_FREE_REUSABLE fails on macOS; disable use of MADV_FREE_REUSE on a reset (issue #1097)
1 parent 2696627 commit d743140

File tree

1 file changed

+10
-10
lines changed

1 file changed

+10
-10
lines changed

src/prim/unix/prim.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -443,18 +443,17 @@ int _mi_prim_reuse(void* start, size_t size) {
443443

444444
int _mi_prim_decommit(void* start, size_t size, bool* needs_recommit) {
445445
int err = 0;
446-
#if !MI_DEBUG && MI_SECURE<=2
447-
*needs_recommit = false;
448-
#if defined(__APPLE__) && defined(MADV_FREE_REUSABLE)
446+
#if defined(__APPLE__) && defined(MADV_FREE_REUSABLE)
449447
// decommit on macOS: use MADV_FREE_REUSABLE as it does immediate rss accounting (issue #1097)
450448
err = unix_madvise(start, size, MADV_FREE_REUSABLE);
451-
#else
449+
if (err) { err = unix_madvise(start, size, MADV_DONTNEED); }
450+
#else
452451
// decommit: use MADV_DONTNEED as it decreases rss immediately (unlike MADV_FREE)
453452
err = unix_madvise(start, size, MADV_DONTNEED);
454-
#endif
453+
#endif
454+
#if !MI_DEBUG && MI_SECURE<=2
455+
*needs_recommit = false;
455456
#else
456-
// note: don't use MADV_FREE_REUSABLE as the range may contain protected areas
457-
err = unix_madvise(start, size, MADV_DONTNEED);
458457
*needs_recommit = true;
459458
mprotect(start, size, PROT_NONE);
460459
#endif
@@ -470,10 +469,11 @@ int _mi_prim_decommit(void* start, size_t size, bool* needs_recommit) {
470469

471470
int _mi_prim_reset(void* start, size_t size) {
472471
int err = 0;
473-
#if defined(__APPLE__) && defined(MADV_FREE_REUSABLE)
474-
// on macOS we try to use MADV_FREE_REUSABLE as it seems the fastest
472+
473+
// on macOS can use MADV_FREE_REUSABLE (but we disable this for now as it seems slower)
474+
#if 0 && defined(__APPLE__) && defined(MADV_FREE_REUSABLE)
475475
err = unix_madvise(start, size, MADV_FREE_REUSABLE);
476-
if (err == 0) return 0;
476+
if (err==0) return 0;
477477
// fall through
478478
#endif
479479

0 commit comments

Comments
 (0)