From 812f7112af291f7f1ddb88cd8b0be0a5689dd9b9 Mon Sep 17 00:00:00 2001 From: Christian Thaeter Date: Sat, 30 Jan 2010 02:56:50 +0100 Subject: [PATCH] FIX: small race in acquire_thread, catching threads out of the void --- src/backend/threadpool.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/backend/threadpool.c b/src/backend/threadpool.c index d286db105..eafbed026 100644 --- a/src/backend/threadpool.c +++ b/src/backend/threadpool.c @@ -130,6 +130,15 @@ lumiera_threadpool_acquire_thread (enum lumiera_thread_class kind, { ret = lumiera_thread_new (kind, purpose, flag, &threadpool.pool[kind].pthread_attrs); + TRACE (threadpool, "created thread %p", ret); + + /* + a newly created thread flows somewhere in the airm it isnt released yet into the idle list, + nor in the working list, While we are holding this CONDITION_SECION we can safely put it on the working list, + this removes a small race. + */ + llist_insert_head (&threadpool.pool[kind].working_list, &ret->node); + ENSURE (ret, "did not create a valid thread"); TODO ("no error handing, let the resourcecollector do it, no need when returning the thread"); LUMIERA_CONDITION_WAIT (!llist_is_empty (&threadpool.pool[kind].idle_list)); @@ -137,6 +146,7 @@ lumiera_threadpool_acquire_thread (enum lumiera_thread_class kind, // use an existing thread, pick the first one // remove it from the pool's list ret = (LumieraThread) (llist_head (&threadpool.pool[kind].idle_list)); + TRACE (threadpool, "got thread %p", ret); REQUIRE (ret->state == LUMIERA_THREADSTATE_IDLE, "trying to return a non-idle thread (state=%s)", lumiera_threadstate_names[ret->state]);