| 1700 | } |
| 1701 | |
| 1702 | void |
| 1703 | extent_dalloc_wrapper(tsdn_t *tsdn, arena_t *arena, |
| 1704 | extent_hooks_t **r_extent_hooks, extent_t *extent) { |
| 1705 | assert(extent_dumpable_get(extent)); |
| 1706 | witness_assert_depth_to_rank(tsdn_witness_tsdp_get(tsdn), |
| 1707 | WITNESS_RANK_CORE, 0); |
| 1708 | |
| 1709 | /* |
| 1710 | * Deregister first to avoid a race with other allocating threads, and |
| 1711 | * reregister if deallocation fails. |
| 1712 | */ |
| 1713 | extent_deregister(tsdn, extent); |
| 1714 | if (!extent_dalloc_wrapper_try(tsdn, arena, r_extent_hooks, extent)) { |
| 1715 | return; |
| 1716 | } |
| 1717 | |
| 1718 | extent_reregister(tsdn, extent); |
| 1719 | if (*r_extent_hooks != &extent_hooks_default) { |
| 1720 | extent_hook_pre_reentrancy(tsdn, arena); |
| 1721 | } |
| 1722 | /* Try to decommit; purge if that fails. */ |
| 1723 | bool zeroed; |
| 1724 | if (!extent_committed_get(extent)) { |
| 1725 | zeroed = true; |
| 1726 | } else if (!extent_decommit_wrapper(tsdn, arena, r_extent_hooks, extent, |
| 1727 | 0, extent_size_get(extent))) { |
| 1728 | zeroed = true; |
| 1729 | } else if ((*r_extent_hooks)->purge_forced != NULL && |
| 1730 | !(*r_extent_hooks)->purge_forced(*r_extent_hooks, |
| 1731 | extent_base_get(extent), extent_size_get(extent), 0, |
| 1732 | extent_size_get(extent), arena_ind_get(arena))) { |
| 1733 | zeroed = true; |
| 1734 | } else if (extent_state_get(extent) == extent_state_muzzy || |
| 1735 | ((*r_extent_hooks)->purge_lazy != NULL && |
| 1736 | !(*r_extent_hooks)->purge_lazy(*r_extent_hooks, |
| 1737 | extent_base_get(extent), extent_size_get(extent), 0, |
| 1738 | extent_size_get(extent), arena_ind_get(arena)))) { |
| 1739 | zeroed = false; |
| 1740 | } else { |
| 1741 | zeroed = false; |
| 1742 | } |
| 1743 | if (*r_extent_hooks != &extent_hooks_default) { |
| 1744 | extent_hook_post_reentrancy(tsdn); |
| 1745 | } |
| 1746 | extent_zeroed_set(extent, zeroed); |
| 1747 | |
| 1748 | if (config_prof) { |
| 1749 | extent_gdump_sub(tsdn, extent); |
| 1750 | } |
| 1751 | |
| 1752 | extent_record(tsdn, arena, r_extent_hooks, &arena->extents_retained, |
| 1753 | extent, false); |
| 1754 | } |
| 1755 | |
| 1756 | static void |
| 1757 | extent_destroy_default_impl(void *addr, size_t size) { |
no test coverage detected