| 1387 | } |
| 1388 | |
| 1389 | static extent_t * |
| 1390 | extent_alloc_retained(tsdn_t *tsdn, arena_t *arena, |
| 1391 | extent_hooks_t **r_extent_hooks, void *new_addr, size_t size, size_t pad, |
| 1392 | size_t alignment, bool slab, szind_t szind, bool *zero, bool *commit) { |
| 1393 | assert(size != 0); |
| 1394 | assert(alignment != 0); |
| 1395 | |
| 1396 | malloc_mutex_lock(tsdn, &arena->extent_grow_mtx); |
| 1397 | |
| 1398 | extent_t *extent = extent_recycle(tsdn, arena, r_extent_hooks, |
| 1399 | &arena->extents_retained, new_addr, size, pad, alignment, slab, |
| 1400 | szind, zero, commit, true); |
| 1401 | if (extent != NULL) { |
| 1402 | malloc_mutex_unlock(tsdn, &arena->extent_grow_mtx); |
| 1403 | if (config_prof) { |
| 1404 | extent_gdump_add(tsdn, extent); |
| 1405 | } |
| 1406 | } else if (opt_retain && new_addr == NULL) { |
| 1407 | extent = extent_grow_retained(tsdn, arena, r_extent_hooks, size, |
| 1408 | pad, alignment, slab, szind, zero, commit); |
| 1409 | /* extent_grow_retained() always releases extent_grow_mtx. */ |
| 1410 | } else { |
| 1411 | malloc_mutex_unlock(tsdn, &arena->extent_grow_mtx); |
| 1412 | } |
| 1413 | malloc_mutex_assert_not_owner(tsdn, &arena->extent_grow_mtx); |
| 1414 | |
| 1415 | return extent; |
| 1416 | } |
| 1417 | |
| 1418 | static extent_t * |
| 1419 | extent_alloc_wrapper_hard(tsdn_t *tsdn, arena_t *arena, |
no test coverage detected