* Tries to satisfy the given allocation request by reusing one of the extents * in the given extents_t. */
| 1125 | * in the given extents_t. |
| 1126 | */ |
| 1127 | static extent_t * |
| 1128 | extent_recycle(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks, |
| 1129 | extents_t *extents, void *new_addr, size_t size, size_t pad, |
| 1130 | size_t alignment, bool slab, szind_t szind, bool *zero, bool *commit, |
| 1131 | bool growing_retained) { |
| 1132 | witness_assert_depth_to_rank(tsdn_witness_tsdp_get(tsdn), |
| 1133 | WITNESS_RANK_CORE, growing_retained ? 1 : 0); |
| 1134 | assert(new_addr == NULL || !slab); |
| 1135 | assert(pad == 0 || !slab); |
| 1136 | assert(!*zero || !slab); |
| 1137 | |
| 1138 | rtree_ctx_t rtree_ctx_fallback; |
| 1139 | rtree_ctx_t *rtree_ctx = tsdn_rtree_ctx(tsdn, &rtree_ctx_fallback); |
| 1140 | |
| 1141 | extent_t *extent = extent_recycle_extract(tsdn, arena, r_extent_hooks, |
| 1142 | rtree_ctx, extents, new_addr, size, pad, alignment, slab, |
| 1143 | growing_retained); |
| 1144 | if (extent == NULL) { |
| 1145 | return NULL; |
| 1146 | } |
| 1147 | |
| 1148 | extent = extent_recycle_split(tsdn, arena, r_extent_hooks, rtree_ctx, |
| 1149 | extents, new_addr, size, pad, alignment, slab, szind, extent, |
| 1150 | growing_retained); |
| 1151 | if (extent == NULL) { |
| 1152 | return NULL; |
| 1153 | } |
| 1154 | |
| 1155 | if (*commit && !extent_committed_get(extent)) { |
| 1156 | if (extent_commit_impl(tsdn, arena, r_extent_hooks, extent, |
| 1157 | 0, extent_size_get(extent), growing_retained)) { |
| 1158 | extent_record(tsdn, arena, r_extent_hooks, extents, |
| 1159 | extent, growing_retained); |
| 1160 | return NULL; |
| 1161 | } |
| 1162 | if (!extent_need_manual_zero(arena)) { |
| 1163 | extent_zeroed_set(extent, true); |
| 1164 | } |
| 1165 | } |
| 1166 | |
| 1167 | if (extent_committed_get(extent)) { |
| 1168 | *commit = true; |
| 1169 | } |
| 1170 | if (extent_zeroed_get(extent)) { |
| 1171 | *zero = true; |
| 1172 | } |
| 1173 | |
| 1174 | if (pad != 0) { |
| 1175 | extent_addr_randomize(tsdn, extent, alignment); |
| 1176 | } |
| 1177 | assert(extent_state_get(extent) == extent_state_active); |
| 1178 | if (slab) { |
| 1179 | extent_slab_set(extent, slab); |
| 1180 | extent_interior_register(tsdn, rtree_ctx, extent, szind); |
| 1181 | } |
| 1182 | |
| 1183 | if (*zero) { |
| 1184 | void *addr = extent_base_get(extent); |
no test coverage detected