Do not hold the base mutex while calling extent hooks.
Drop the base mutex while allocating new base blocks, because extent allocation can enter code that prohibits holding non-core mutexes, e.g. the extent_[d]alloc() and extent_purge_forced_wrapper() calls in extent_alloc_dss(). This partially resolves #802.
This commit is contained in:
parent
eeefdf3ce8
commit
9b1038d19c
@ -199,8 +199,14 @@ base_extent_alloc(tsdn_t *tsdn, base_t *base, size_t size, size_t alignment) {
|
|||||||
malloc_mutex_assert_owner(tsdn, &base->mtx);
|
malloc_mutex_assert_owner(tsdn, &base->mtx);
|
||||||
|
|
||||||
extent_hooks_t *extent_hooks = base_extent_hooks_get(base);
|
extent_hooks_t *extent_hooks = base_extent_hooks_get(base);
|
||||||
|
/*
|
||||||
|
* Drop mutex during base_block_alloc(), because an extent hook will be
|
||||||
|
* called.
|
||||||
|
*/
|
||||||
|
malloc_mutex_unlock(tsdn, &base->mtx);
|
||||||
base_block_t *block = base_block_alloc(extent_hooks, base_ind_get(base),
|
base_block_t *block = base_block_alloc(extent_hooks, base_ind_get(base),
|
||||||
&base->pind_last, &base->extent_sn_next, size, alignment);
|
&base->pind_last, &base->extent_sn_next, size, alignment);
|
||||||
|
malloc_mutex_lock(tsdn, &base->mtx);
|
||||||
if (block == NULL) {
|
if (block == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user