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

Function extent_recycle_split

deps/jemalloc/src/extent.c:1056–1110  ·  view source on GitHub ↗

* This fulfills the indicated allocation request out of the given extent (which * the caller should have ensured was big enough). If there's any unused space * before or after the resulting allocation, that space is given its own extent * and put back into extents. */

Source from the content-addressed store, hash-verified

1054 * and put back into extents.
1055 */
1056static extent_t *
1057extent_recycle_split(tsdn_t *tsdn, arena_t *arena,
1058 extent_hooks_t **r_extent_hooks, rtree_ctx_t *rtree_ctx, extents_t *extents,
1059 void *new_addr, size_t size, size_t pad, size_t alignment, bool slab,
1060 szind_t szind, extent_t *extent, bool growing_retained) {
1061 extent_t *lead;
1062 extent_t *trail;
1063 extent_t *to_leak;
1064 extent_t *to_salvage;
1065
1066 extent_split_interior_result_t result = extent_split_interior(
1067 tsdn, arena, r_extent_hooks, rtree_ctx, &extent, &lead, &trail,
1068 &to_leak, &to_salvage, new_addr, size, pad, alignment, slab, szind,
1069 growing_retained);
1070
1071 if (!maps_coalesce && result != extent_split_interior_ok
1072 && !opt_retain) {
1073 /*
1074 * Split isn't supported (implies Windows w/o retain). Avoid
1075 * leaking the extents.
1076 */
1077 assert(to_leak != NULL && lead == NULL && trail == NULL);
1078 extent_deactivate(tsdn, arena, extents, to_leak);
1079 return NULL;
1080 }
1081
1082 if (result == extent_split_interior_ok) {
1083 if (lead != NULL) {
1084 extent_deactivate(tsdn, arena, extents, lead);
1085 }
1086 if (trail != NULL) {
1087 extent_deactivate(tsdn, arena, extents, trail);
1088 }
1089 return extent;
1090 } else {
1091 /*
1092 * We should have picked an extent that was large enough to
1093 * fulfill our allocation request.
1094 */
1095 assert(result == extent_split_interior_error);
1096 if (to_salvage != NULL) {
1097 extent_deregister(tsdn, to_salvage);
1098 }
1099 if (to_leak != NULL) {
1100 void *leak = extent_base_get(to_leak);
1101 extent_deregister_no_gdump_sub(tsdn, to_leak);
1102 extents_abandon_vm(tsdn, arena, r_extent_hooks, extents,
1103 to_leak, growing_retained);
1104 assert(extent_lock_from_addr(tsdn, rtree_ctx, leak,
1105 false) == NULL);
1106 }
1107 return NULL;
1108 }
1109 unreachable();
1110}
1111
1112static bool
1113extent_need_manual_zero(arena_t *arena) {

Callers 1

extent_recycleFunction · 0.70

Calls 7

extent_split_interiorFunction · 0.85
extents_abandon_vmFunction · 0.85
extent_deactivateFunction · 0.70
extent_deregisterFunction · 0.70
extent_lock_from_addrFunction · 0.70
extent_base_getFunction · 0.50

Tested by

no test coverage detected