Avoid leaking extents / VM when split is not supported.
This can only happen on Windows and with opt.retain disabled (which isn't the default). The solution is suboptimal, however not a common case as retain is the long term plan for all platforms anyway.
This commit is contained in:
parent
badf8d95f1
commit
57dbab5d6b
11
src/extent.c
11
src/extent.c
@ -1052,6 +1052,17 @@ extent_recycle_split(tsdn_t *tsdn, arena_t *arena,
|
|||||||
&to_leak, &to_salvage, new_addr, size, pad, alignment, slab, szind,
|
&to_leak, &to_salvage, new_addr, size, pad, alignment, slab, szind,
|
||||||
growing_retained);
|
growing_retained);
|
||||||
|
|
||||||
|
if (!maps_coalesce && result != extent_split_interior_ok
|
||||||
|
&& !opt_retain) {
|
||||||
|
/*
|
||||||
|
* Split isn't supported (implies Windows w/o retain). Avoid
|
||||||
|
* leaking the extents.
|
||||||
|
*/
|
||||||
|
assert(to_leak != NULL && lead == NULL && trail == NULL);
|
||||||
|
extent_deactivate(tsdn, arena, extents, to_leak);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (result == extent_split_interior_ok) {
|
if (result == extent_split_interior_ok) {
|
||||||
if (lead != NULL) {
|
if (lead != NULL) {
|
||||||
extent_deactivate(tsdn, arena, extents, lead);
|
extent_deactivate(tsdn, arena, extents, lead);
|
||||||
|
Loading…
Reference in New Issue
Block a user