From: mquinson Date: Thu, 15 Oct 2009 16:26:05 +0000 (+0000) Subject: conditions are not semaphores. signals can get lost if delivered before you are waiti... X-Git-Tag: SVN~923 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/7a9c17db0fc11a2255e080c5cc9bb0a0f5642c82 conditions are not semaphores. signals can get lost if delivered before you are waiting on the cond. So only wait on the condition if the message were not delevered already, and ignore all this cruft in other cases git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@6791 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- diff --git a/src/xbt/xbt_sg_synchro.c b/src/xbt/xbt_sg_synchro.c index 2befd04ab7..8fd6307080 100644 --- a/src/xbt/xbt_sg_synchro.c +++ b/src/xbt/xbt_sg_synchro.c @@ -30,7 +30,7 @@ typedef struct s_xbt_thread_ { void *userparam; void *father_data; /* stuff to allow other people to wait on me with xbt_thread_join */ - int joinable; + int joinable:1,done:1; xbt_cond_t cond; xbt_mutex_t mutex; } s_xbt_thread_t; @@ -42,6 +42,7 @@ static int xbt_thread_create_wrapper(int argc, char *argv[]) SIMIX_process_set_data(SIMIX_process_self(), t->father_data); (*t->code) (t->userparam); if (t->joinable) { + t->done=1; xbt_mutex_acquire(t->mutex); xbt_cond_broadcast(t->cond); xbt_mutex_release(t->mutex); @@ -69,6 +70,7 @@ xbt_thread_t xbt_thread_create(const char *name, void_f_pvoid_t code, ()), 0, NULL, /*props */ NULL); res->joinable = joinable; + res->done = 0; res->cond = xbt_cond_init(); res->mutex = xbt_mutex_init(); // free(name); @@ -91,8 +93,10 @@ void xbt_thread_join(xbt_thread_t thread) { xbt_mutex_acquire(thread->mutex); xbt_assert1(thread->joinable,"Cannot join on %p: wasn't created joinable",thread); - xbt_cond_wait(thread->cond,thread->mutex); - xbt_mutex_release(thread->mutex); + if (!thread->done) { + xbt_cond_wait(thread->cond,thread->mutex); + xbt_mutex_release(thread->mutex); + } xbt_mutex_destroy(thread->mutex); xbt_cond_destroy(thread->cond);