| 546 | } |
| 547 | |
| 548 | static void mi_segment_delayed_decommit(mi_segment_t* segment, bool force, mi_stats_t* stats) { |
| 549 | if (!segment->allow_decommit || mi_commit_mask_is_empty(&segment->decommit_mask)) return; |
| 550 | mi_msecs_t now = _mi_clock_now(); |
| 551 | if (!force && now < segment->decommit_expire) return; |
| 552 | |
| 553 | mi_commit_mask_t mask = segment->decommit_mask; |
| 554 | segment->decommit_expire = 0; |
| 555 | mi_commit_mask_create_empty(&segment->decommit_mask); |
| 556 | |
| 557 | size_t idx; |
| 558 | size_t count; |
| 559 | mi_commit_mask_foreach(&mask, idx, count) { |
| 560 | // if found, decommit that sequence |
| 561 | if (count > 0) { |
| 562 | uint8_t* p = (uint8_t*)segment + (idx*MI_COMMIT_SIZE); |
| 563 | size_t size = count * MI_COMMIT_SIZE; |
| 564 | mi_segment_commitx(segment, false, p, size, stats); |
| 565 | } |
| 566 | } |
| 567 | mi_commit_mask_foreach_end() |
| 568 | mi_assert_internal(mi_commit_mask_is_empty(&segment->decommit_mask)); |
| 569 | } |
| 570 | |
| 571 | |
| 572 | /* ----------------------------------------------------------- |
no test coverage detected