MCPcopy Create free account
hub / github.com/Snapchat/KeyDB / extent_split_impl

Function extent_split_impl

deps/memkind/src/jemalloc/src/extent.c:1724–1797  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1722#endif
1723
1724static extent_t *
1725extent_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);

Callers 3

extent_recycle_splitFunction · 0.70
extent_grow_retainedFunction · 0.70
extent_split_wrapperFunction · 0.70

Calls 15

extent_allocFunction · 0.70
extent_dallocFunction · 0.70
extent_size_getFunction · 0.50
extent_initFunction · 0.50
extent_base_getFunction · 0.50
extent_sn_getFunction · 0.50
extent_state_getFunction · 0.50
extent_zeroed_getFunction · 0.50

Tested by

no test coverage detected