| 735 | } |
| 736 | |
| 737 | static bool |
| 738 | extent_register_impl(tsdn_t *tsdn, extent_t *extent, bool gdump_add) { |
| 739 | rtree_ctx_t rtree_ctx_fallback; |
| 740 | rtree_ctx_t *rtree_ctx = tsdn_rtree_ctx(tsdn, &rtree_ctx_fallback); |
| 741 | rtree_leaf_elm_t *elm_a, *elm_b; |
| 742 | |
| 743 | /* |
| 744 | * We need to hold the lock to protect against a concurrent coalesce |
| 745 | * operation that sees us in a partial state. |
| 746 | */ |
| 747 | extent_lock(tsdn, extent); |
| 748 | |
| 749 | if (extent_rtree_leaf_elms_lookup(tsdn, rtree_ctx, extent, false, true, |
| 750 | &elm_a, &elm_b)) { |
| 751 | return true; |
| 752 | } |
| 753 | |
| 754 | szind_t szind = extent_szind_get_maybe_invalid(extent); |
| 755 | bool slab = extent_slab_get(extent); |
| 756 | extent_rtree_write_acquired(tsdn, elm_a, elm_b, extent, szind, slab); |
| 757 | if (slab) { |
| 758 | extent_interior_register(tsdn, rtree_ctx, extent, szind); |
| 759 | } |
| 760 | |
| 761 | extent_unlock(tsdn, extent); |
| 762 | |
| 763 | if (config_prof && gdump_add) { |
| 764 | extent_gdump_add(tsdn, extent); |
| 765 | } |
| 766 | |
| 767 | return false; |
| 768 | } |
| 769 | |
| 770 | static bool |
| 771 | extent_register(tsdn_t *tsdn, extent_t *extent) { |
no test coverage detected