| 1804 | } |
| 1805 | |
| 1806 | void |
| 1807 | extent_dalloc_wrapper(tsdn_t *tsdn, arena_t *arena, |
| 1808 | extent_hooks_t **r_extent_hooks, extent_t *extent) { |
| 1809 | assert(extent_dumpable_get(extent)); |
| 1810 | witness_assert_depth_to_rank(tsdn_witness_tsdp_get(tsdn), |
| 1811 | WITNESS_RANK_CORE, 0); |
| 1812 | |
| 1813 | /* Avoid calling the default extent_dalloc unless have to. */ |
| 1814 | if (*r_extent_hooks != &extent_hooks_default || extent_may_dalloc()) { |
| 1815 | /* |
| 1816 | * Deregister first to avoid a race with other allocating |
| 1817 | * threads, and reregister if deallocation fails. |
| 1818 | */ |
| 1819 | extent_deregister(tsdn, extent); |
| 1820 | if (!extent_dalloc_wrapper_try(tsdn, arena, r_extent_hooks, |
| 1821 | extent)) { |
| 1822 | return; |
| 1823 | } |
| 1824 | extent_reregister(tsdn, extent); |
| 1825 | } |
| 1826 | |
| 1827 | if (*r_extent_hooks != &extent_hooks_default) { |
| 1828 | extent_hook_pre_reentrancy(tsdn, arena); |
| 1829 | } |
| 1830 | /* Try to decommit; purge if that fails. */ |
| 1831 | bool zeroed; |
| 1832 | if (!extent_committed_get(extent)) { |
| 1833 | zeroed = true; |
| 1834 | } else if (!extent_decommit_wrapper(tsdn, arena, r_extent_hooks, extent, |
| 1835 | 0, extent_size_get(extent))) { |
| 1836 | zeroed = true; |
| 1837 | } else if ((*r_extent_hooks)->purge_forced != NULL && |
| 1838 | !(*r_extent_hooks)->purge_forced(*r_extent_hooks, |
| 1839 | extent_base_get(extent), extent_size_get(extent), 0, |
| 1840 | extent_size_get(extent), arena_ind_get(arena))) { |
| 1841 | zeroed = true; |
| 1842 | } else if (extent_state_get(extent) == extent_state_muzzy || |
| 1843 | ((*r_extent_hooks)->purge_lazy != NULL && |
| 1844 | !(*r_extent_hooks)->purge_lazy(*r_extent_hooks, |
| 1845 | extent_base_get(extent), extent_size_get(extent), 0, |
| 1846 | extent_size_get(extent), arena_ind_get(arena)))) { |
| 1847 | zeroed = false; |
| 1848 | } else { |
| 1849 | zeroed = false; |
| 1850 | } |
| 1851 | if (*r_extent_hooks != &extent_hooks_default) { |
| 1852 | extent_hook_post_reentrancy(tsdn); |
| 1853 | } |
| 1854 | extent_zeroed_set(extent, zeroed); |
| 1855 | |
| 1856 | if (config_prof) { |
| 1857 | extent_gdump_sub(tsdn, extent); |
| 1858 | } |
| 1859 | |
| 1860 | extent_record(tsdn, arena, r_extent_hooks, &arena->extents_retained, |
| 1861 | extent, false); |
| 1862 | } |
| 1863 |
no test coverage detected