| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -550,16 +550,22 @@ static bool mi_arena_purge_range(mi_arena_t* arena, size_t idx, size_t startidx, | |||
| 550 | 550 | return all_purged; | |
| 551 | 551 | } | |
| 552 | 552 | ||
| 553 | - // returns true if anything was purged | ||
| 554 | - static bool mi_arena_try_purge(mi_arena_t* arena, mi_msecs_t now, bool force) | ||
| 553 | + // returns | ||
| 554 | + // -1 = nothing was purged | ||
| 555 | + // 0 = nothing was purged yet because have not yet reached the expire time | ||
| 556 | + // 1 = some pages in the arena were purged | ||
| 557 | + static int mi_arena_try_purge(mi_arena_t* arena, mi_msecs_t now, bool force) | ||
| 555 | 558 | { | |
| 556 | 559 | // check pre-conditions | |
| 557 | - if (arena->memid.is_pinned) return false; | ||
| 560 | + if (arena->memid.is_pinned) return -1; | ||
| 558 | 561 | ||
| 559 | 562 | // expired yet? | |
| 560 | 563 | mi_msecs_t expire = mi_atomic_loadi64_relaxed(&arena->purge_expire); | |
| 561 | - if (!force && (expire == 0 || expire > now)) return false; | ||
| 562 | - | ||
| 564 | + if (!force) { | ||
| 565 | + if (expire == 0) return -1; | ||
| 566 | + if (expire > now) return 0; | ||
| 567 | + } | ||
| 568 | + | ||
| 563 | 569 | // reset expire (if not already set concurrently) | |
| 564 | 570 | mi_atomic_casi64_strong_acq_rel(&arena->purge_expire, &expire, (mi_msecs_t)0); | |
| 565 | 571 | _mi_stat_counter_increase(&_mi_stats_main.arena_purges, 1); | |
@@ -607,7 +613,7 @@ static bool mi_arena_try_purge(mi_arena_t* arena, mi_msecs_t now, bool force) | |||
| 607 | 613 | mi_msecs_t expected = 0; | |
| 608 | 614 | mi_atomic_casi64_strong_acq_rel(&arena->purge_expire,&expected,_mi_clock_now() + delay); | |
| 609 | 615 | } | |
| 610 | - return any_purged; | ||
| 616 | + return (any_purged ? 1 : -1); | ||
| 611 | 617 | } | |
| 612 | 618 | ||
| 613 | 619 | static void mi_arenas_try_purge( bool force, bool visit_all ) | |
@@ -630,20 +636,25 @@ static void mi_arenas_try_purge( bool force, bool visit_all ) | |||
| 630 | 636 | mi_atomic_storei64_release(&mi_arenas_purge_expire, now + mi_arena_purge_delay()); | |
| 631 | 637 | size_t max_purge_count = (visit_all ? max_arena : 2); | |
| 632 | 638 | bool all_visited = true; | |
| 639 | + bool any_purged = false; | ||
| 633 | 640 | for (size_t i = 0; i < max_arena; i++) { | |
| 634 | 641 | mi_arena_t* arena = mi_atomic_load_ptr_acquire(mi_arena_t, &mi_arenas[i]); | |
| 635 | 642 | if (arena != NULL) { | |
| 636 | - if (mi_arena_try_purge(arena, now, force)) { | ||
| 637 | - if (max_purge_count <= 1) { | ||
| 638 | - all_visited = false; | ||
| 639 | - break; | ||
| 643 | + int purged = mi_arena_try_purge(arena, now, force); | ||
| 644 | + if (purged >= 0) { // purged, or not yet the expire-time reached | ||
| 645 | + any_purged = true; | ||
| 646 | + if (purged >= 1) { // purged at least one page | ||
| 647 | + if (max_purge_count <= 1) { | ||
| 648 | + all_visited = false; | ||
| 649 | + break; | ||
| 650 | + } | ||
| 651 | + max_purge_count--; | ||
| 640 | 652 | } | |
| 641 | - max_purge_count--; | ||
| 642 | 653 | } | |
| 643 | 654 | } | |
| 644 | 655 | } | |
| 645 | - if (all_visited) { | ||
| 646 | - // all arena's were visited and purged: reset global expire | ||
| 656 | + if (all_visited && !any_purged) { | ||
| 657 | + // all arena's were visited and nothing needed to be purged: reset global expire | ||
| 647 | 658 | mi_atomic_storei64_release(&mi_arenas_purge_expire, 0); | |
| 648 | 659 | } | |
| 649 | 660 | } | |
| Back | FazBrowse Home | New Git URL |
0 commit comments