From 243cd9d8bbc4cc907b661512c907dc85203a8d87 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Thu, 21 Jun 2018 18:04:58 -0700 Subject: [PATCH] add a cond_broadcast after resize to make sure all threads (notably newly available threads) get awaken to immediately process potential items in the queue. --- lib/common/pool.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/common/pool.c b/lib/common/pool.c index bd31f032..41a216f1 100644 --- a/lib/common/pool.c +++ b/lib/common/pool.c @@ -225,13 +225,16 @@ static POOL_ctx* POOL_resize_internal(POOL_ctx* ctx, size_t numThreads) * note : starting context is considered consumed. */ POOL_ctx* POOL_resize(POOL_ctx* ctx, size_t numThreads) { - POOL_ctx* newCtx; if (ctx==NULL) return NULL; ZSTD_pthread_mutex_lock(&ctx->queueMutex); - newCtx = POOL_resize_internal(ctx, numThreads); + { POOL_ctx* const newCtx = POOL_resize_internal(ctx, numThreads); + if (newCtx!=ctx) { + POOL_free(ctx); + return newCtx; + } } + ZSTD_pthread_cond_broadcast(&ctx->queuePopCond); ZSTD_pthread_mutex_unlock(&ctx->queueMutex); - if (newCtx!=ctx) POOL_free(ctx); - return newCtx; + return ctx; } /**