| 1722 | #endif |
| 1723 | |
| 1724 | static extent_t * |
| 1725 | extent_split_impl(tsdn_t *tsdn, arena_t *arena, |
| 1726 | extent_hooks_t **r_extent_hooks, extent_t *extent, size_t size_a, |
| 1727 | szind_t szind_a, bool slab_a, size_t size_b, szind_t szind_b, bool slab_b, |
| 1728 | bool growing_retained) { |
| 1729 | assert(extent_size_get(extent) == size_a + size_b); |
| 1730 | witness_assert_depth_to_rank(tsdn_witness_tsdp_get(tsdn), |
| 1731 | WITNESS_RANK_CORE, growing_retained ? 1 : 0); |
| 1732 | |
| 1733 | extent_hooks_assure_initialized(arena, r_extent_hooks); |
| 1734 | |
| 1735 | if ((*r_extent_hooks)->split == NULL) { |
| 1736 | return NULL; |
| 1737 | } |
| 1738 | |
| 1739 | extent_t *trail = extent_alloc(tsdn, arena); |
| 1740 | if (trail == NULL) { |
| 1741 | goto label_error_a; |
| 1742 | } |
| 1743 | |
| 1744 | extent_init(trail, arena, (void *)((uintptr_t)extent_base_get(extent) + |
| 1745 | size_a), size_b, slab_b, szind_b, extent_sn_get(extent), |
| 1746 | extent_state_get(extent), extent_zeroed_get(extent), |
| 1747 | extent_committed_get(extent)); |
| 1748 | |
| 1749 | rtree_ctx_t rtree_ctx_fallback; |
| 1750 | rtree_ctx_t *rtree_ctx = tsdn_rtree_ctx(tsdn, &rtree_ctx_fallback); |
| 1751 | rtree_leaf_elm_t *lead_elm_a, *lead_elm_b; |
| 1752 | { |
| 1753 | extent_t lead; |
| 1754 | |
| 1755 | extent_init(&lead, arena, extent_addr_get(extent), size_a, |
| 1756 | slab_a, szind_a, extent_sn_get(extent), |
| 1757 | extent_state_get(extent), extent_zeroed_get(extent), |
| 1758 | extent_committed_get(extent)); |
| 1759 | |
| 1760 | extent_rtree_leaf_elms_lookup(tsdn, rtree_ctx, &lead, false, |
| 1761 | true, &lead_elm_a, &lead_elm_b); |
| 1762 | } |
| 1763 | rtree_leaf_elm_t *trail_elm_a, *trail_elm_b; |
| 1764 | extent_rtree_leaf_elms_lookup(tsdn, rtree_ctx, trail, false, true, |
| 1765 | &trail_elm_a, &trail_elm_b); |
| 1766 | |
| 1767 | if (lead_elm_a == NULL || lead_elm_b == NULL || trail_elm_a == NULL |
| 1768 | || trail_elm_b == NULL) { |
| 1769 | goto label_error_b; |
| 1770 | } |
| 1771 | |
| 1772 | extent_lock2(tsdn, extent, trail); |
| 1773 | |
| 1774 | if ((*r_extent_hooks)->split(*r_extent_hooks, extent_base_get(extent), |
| 1775 | size_a + size_b, size_a, size_b, extent_committed_get(extent), |
| 1776 | arena_ind_get(arena))) { |
| 1777 | goto label_error_c; |
| 1778 | } |
| 1779 | |
| 1780 | extent_size_set(extent, size_a); |
| 1781 | extent_szind_set(extent, szind_a); |
no test coverage detected