* Tries to satisfy the given allocation request by reusing one of the extents * in the given extents_t. */
| 1058 | * in the given extents_t. |
| 1059 | */ |
| 1060 | static extent_t * |
| 1061 | extent_recycle(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks, |
| 1062 | extents_t *extents, void *new_addr, size_t size, size_t pad, |
| 1063 | size_t alignment, bool slab, szind_t szind, bool *zero, bool *commit, |
| 1064 | bool growing_retained) { |
| 1065 | witness_assert_depth_to_rank(tsdn_witness_tsdp_get(tsdn), |
| 1066 | WITNESS_RANK_CORE, growing_retained ? 1 : 0); |
| 1067 | assert(new_addr == NULL || !slab); |
| 1068 | assert(pad == 0 || !slab); |
| 1069 | assert(!*zero || !slab); |
| 1070 | |
| 1071 | rtree_ctx_t rtree_ctx_fallback; |
| 1072 | rtree_ctx_t *rtree_ctx = tsdn_rtree_ctx(tsdn, &rtree_ctx_fallback); |
| 1073 | |
| 1074 | extent_t *extent = extent_recycle_extract(tsdn, arena, r_extent_hooks, |
| 1075 | rtree_ctx, extents, new_addr, size, pad, alignment, slab, |
| 1076 | growing_retained); |
| 1077 | if (extent == NULL) { |
| 1078 | return NULL; |
| 1079 | } |
| 1080 | |
| 1081 | extent = extent_recycle_split(tsdn, arena, r_extent_hooks, rtree_ctx, |
| 1082 | extents, new_addr, size, pad, alignment, slab, szind, extent, |
| 1083 | growing_retained); |
| 1084 | if (extent == NULL) { |
| 1085 | return NULL; |
| 1086 | } |
| 1087 | |
| 1088 | if (*commit && !extent_committed_get(extent)) { |
| 1089 | if (extent_commit_impl(tsdn, arena, r_extent_hooks, extent, |
| 1090 | 0, extent_size_get(extent), growing_retained)) { |
| 1091 | extent_record(tsdn, arena, r_extent_hooks, extents, |
| 1092 | extent, growing_retained); |
| 1093 | return NULL; |
| 1094 | } |
| 1095 | extent_zeroed_set(extent, true); |
| 1096 | } |
| 1097 | |
| 1098 | if (extent_committed_get(extent)) { |
| 1099 | *commit = true; |
| 1100 | } |
| 1101 | if (extent_zeroed_get(extent)) { |
| 1102 | *zero = true; |
| 1103 | } |
| 1104 | |
| 1105 | if (pad != 0) { |
| 1106 | extent_addr_randomize(tsdn, extent, alignment); |
| 1107 | } |
| 1108 | assert(extent_state_get(extent) == extent_state_active); |
| 1109 | if (slab) { |
| 1110 | extent_slab_set(extent, slab); |
| 1111 | extent_interior_register(tsdn, rtree_ctx, extent, szind); |
| 1112 | } |
| 1113 | |
| 1114 | if (*zero) { |
| 1115 | void *addr = extent_base_get(extent); |
| 1116 | size_t size = extent_size_get(extent); |
| 1117 | if (!extent_zeroed_get(extent)) { |
no test coverage detected