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?ds=sidebyside 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);