[PATCH] Fix a pthreadpool race

Christof Schmitt cs at samba.org
Tue Dec 12 22:16:29 UTC 2017


On Tue, Dec 12, 2017 at 11:10:55PM +0100, Volker Lendecke wrote:
> On Tue, Dec 12, 2017 at 01:02:46PM -0700, Christof Schmitt wrote:
> > The assumption here is that no call to pthread_create is done and hence no call
> > to will_return is required. What likely happened is that the worker thread
> > exited, then test_create_do triggered the creation of a new pthread, which in
> > turn caused a call to mock_type. As there is no entry in the global list,
> > cmocka tried to abort through a jump while still holding the mutex.
> 
> The helper thread did not exit, it was *not yet* idle.
> 
> The attached patch fixes the problem for me.

Makese sense.

Reviewed-by: Christof Schmitt <cs at samba.org>

Pushed to autobuild.

Christof

> 
> Volker
> 
> -- 
> SerNet GmbH, Bahnhofsallee 1b, 37081 Göttingen
> phone: +49-551-370000-0, fax: +49-551-370000-9
> AG Göttingen, HRB 2816, GF: Dr. Johannes Loxen
> http://www.sernet.de, mailto:kontakt at sernet.de

> From ae056538b473d94e720af93092dec13f5386c38f Mon Sep 17 00:00:00 2001
> From: Volker Lendecke <vl at samba.org>
> Date: Tue, 12 Dec 2017 23:07:39 +0100
> Subject: [PATCH] pthreadpool: Fix deadlock
> 
> Christof's idea from was that the thread already exited. It could also be that
> the thread is not yet idle when the new pthreadpool_add_jobs comes around the
> corner.
> 
> Signed-off-by: Volker Lendecke <vl at samba.org>
> ---
>  lib/pthreadpool/tests_cmocka.c | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/lib/pthreadpool/tests_cmocka.c b/lib/pthreadpool/tests_cmocka.c
> index 75a935fa42c..9753d212e1c 100644
> --- a/lib/pthreadpool/tests_cmocka.c
> +++ b/lib/pthreadpool/tests_cmocka.c
> @@ -28,6 +28,7 @@
>  #include <pthreadpool_tevent.h>
>  
>  #include <cmocka.h>
> +#include <poll.h>
>  
>  struct pthreadpool_tevent_test {
>  	struct tevent_context *ev;
> @@ -152,6 +153,8 @@ static void test_create(void **state)
>  	assert_return_code(ret, 0);
>  	assert_false(in_main_thread);
>  
> +	poll(NULL, 0, 10);
> +
>  	/*
>  	 * Workerthread will still be active for a second; immediately
>  	 * running another job will also use the worker thread, even
> -- 
> 2.11.0
> 




More information about the samba-technical mailing list