From 9b1038d19c998b8c219eb08d083ca0328b7941f1 Mon Sep 17 00:00:00 2001 From: Jason Evans Date: Mon, 22 May 2017 17:08:21 -0700 Subject: [PATCH] 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. --- src/base.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/base.c b/src/base.c index 7502a657..dd4b109d 100644 --- a/src/base.c +++ b/src/base.c @@ -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); 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->pind_last, &base->extent_sn_next, size, alignment); + malloc_mutex_lock(tsdn, &base->mtx); if (block == NULL) { return NULL; }