From 706e10ad0586bf98c829cdfaa079118447b94ef5 Mon Sep 17 00:00:00 2001 From: Santiago Carot-Nemesio Date: Fri, 8 Mar 2019 16:19:29 +0100 Subject: [PATCH] gsttaskpool: Do not block tasks while cleaning up the taskpool There is a deadlock if any thread from the pool tries to push a new task while other thread is waiting for the pool of threads to finish. With this patch the thread will get an error when it tries to add a new task while the taskpool is being cleaned up. --- gst/gsttaskpool.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/gst/gsttaskpool.c b/gst/gsttaskpool.c index a07820ffdd..89c8905e5f 100644 --- a/gst/gsttaskpool.c +++ b/gst/gsttaskpool.c @@ -81,15 +81,19 @@ default_prepare (GstTaskPool * pool, GError ** error) static void default_cleanup (GstTaskPool * pool) { + GThreadPool *pool_; + GST_OBJECT_LOCK (pool); - if (pool->pool) { + pool_ = pool->pool; + pool->pool = NULL; + GST_OBJECT_UNLOCK (pool); + + if (pool_) { /* Shut down all the threads, we still process the ones scheduled * because the unref happens in the thread function. * Also wait for currently running ones to finish. */ - g_thread_pool_free (pool->pool, FALSE, TRUE); - pool->pool = NULL; + g_thread_pool_free (pool_, FALSE, TRUE); } - GST_OBJECT_UNLOCK (pool); } static gpointer