X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/5979fe52092423ac8915b118cff1e161e57d1ecb..1d093eb0c576e2f7a1d6c7a707ee55026aca3915:/src/simix/smx_synchro.c diff --git a/src/simix/smx_synchro.c b/src/simix/smx_synchro.c index c14e550ab2..218c6057bb 100644 --- a/src/simix/smx_synchro.c +++ b/src/simix/smx_synchro.c @@ -124,12 +124,24 @@ void SIMIX_cond_signal(smx_cond_t cond) void SIMIX_cond_wait(smx_cond_t cond,smx_mutex_t mutex) { smx_process_t self = SIMIX_process_self(); + smx_action_t act_sleep; xbt_assert0((mutex != NULL), "Invalid parameters"); cond->mutex = mutex; SIMIX_mutex_unlock(mutex); - __SIMIX_cond_wait(cond); + /* create an action null only if there are no actions already on the condition, usefull if the host crashs */ + if (xbt_fifo_size(cond->actions) ==0 ) { + act_sleep = SIMIX_action_sleep(SIMIX_host_self(), -1); + SIMIX_register_action_to_condition(act_sleep,cond); + SIMIX_register_condition_to_action(act_sleep,cond); + __SIMIX_cond_wait(cond); + xbt_fifo_pop(act_sleep->cond_list); + SIMIX_action_destroy(act_sleep); + } + else { + __SIMIX_cond_wait(cond); + } /* get the mutex again */ self->simdata->mutex = cond->mutex; SIMIX_mutex_lock(cond->mutex); @@ -146,7 +158,6 @@ void __SIMIX_cond_wait(smx_cond_t cond) self->simdata->cond = cond; xbt_swag_insert(self, cond->sleeping); - xbt_context_yield(); self->simdata->cond = NULL; while (self->simdata->suspended) { @@ -195,12 +206,10 @@ void SIMIX_cond_broadcast(smx_cond_t cond) void SIMIX_cond_destroy(smx_cond_t cond) { - if ( cond == NULL ) return ; else { xbt_assert0( xbt_swag_size(cond->sleeping) == 0 , "Cannot destroy conditional"); - xbt_swag_free(cond->sleeping); xbt_fifo_free(cond->actions); xbt_free(cond); @@ -212,7 +221,7 @@ void SIMIX_register_condition_to_action(smx_action_t action, smx_cond_t cond) { xbt_assert0( (action != NULL) && (cond != NULL), "Invalid parameters"); - xbt_fifo_push(action->simdata->cond_list,cond); + xbt_fifo_push(action->cond_list,cond); }