| 1460 | } |
| 1461 | |
| 1462 | static extent_t * |
| 1463 | extent_alloc_retained(tsdn_t *tsdn, arena_t *arena, |
| 1464 | extent_hooks_t **r_extent_hooks, void *new_addr, size_t size, size_t pad, |
| 1465 | size_t alignment, bool slab, szind_t szind, bool *zero, bool *commit) { |
| 1466 | assert(size != 0); |
| 1467 | assert(alignment != 0); |
| 1468 | |
| 1469 | malloc_mutex_lock(tsdn, &arena->extent_grow_mtx); |
| 1470 | |
| 1471 | extent_t *extent = extent_recycle(tsdn, arena, r_extent_hooks, |
| 1472 | &arena->extents_retained, new_addr, size, pad, alignment, slab, |
| 1473 | szind, zero, commit, true); |
| 1474 | if (extent != NULL) { |
| 1475 | malloc_mutex_unlock(tsdn, &arena->extent_grow_mtx); |
| 1476 | if (config_prof) { |
| 1477 | extent_gdump_add(tsdn, extent); |
| 1478 | } |
| 1479 | } else if (opt_retain && new_addr == NULL) { |
| 1480 | extent = extent_grow_retained(tsdn, arena, r_extent_hooks, size, |
| 1481 | pad, alignment, slab, szind, zero, commit); |
| 1482 | /* extent_grow_retained() always releases extent_grow_mtx. */ |
| 1483 | } else { |
| 1484 | malloc_mutex_unlock(tsdn, &arena->extent_grow_mtx); |
| 1485 | } |
| 1486 | malloc_mutex_assert_not_owner(tsdn, &arena->extent_grow_mtx); |
| 1487 | |
| 1488 | return extent; |
| 1489 | } |
| 1490 | |
| 1491 | static extent_t * |
| 1492 | extent_alloc_wrapper_hard(tsdn_t *tsdn, arena_t *arena, |
no test coverage detected