X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/b69e984a013e4e9e2d98fc4013cd1721bf2f0245..568db0c9329e157e88f25ba85c515cb9f596f03a:/src/simix/smx_synchro.c diff --git a/src/simix/smx_synchro.c b/src/simix/smx_synchro.c index 0139dee630..74fd1f0707 100644 --- a/src/simix/smx_synchro.c +++ b/src/simix/smx_synchro.c @@ -153,9 +153,10 @@ smx_cond_t SIMIX_cond_init() */ void SIMIX_cond_signal(smx_cond_t cond) { + smx_process_t proc = NULL; DEBUG1("Signal condition %p", cond); xbt_assert0((cond != NULL), "Invalid parameters"); - smx_process_t proc = NULL; + if (xbt_swag_size(cond->sleeping) >= 1) { proc = xbt_swag_extract(cond->sleeping); @@ -181,17 +182,16 @@ void SIMIX_cond_wait(smx_cond_t cond, smx_mutex_t mutex) cond->mutex = mutex; SIMIX_mutex_unlock(mutex); - /* 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) { + /* always create an action null in case there is a host failure */ +/* 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_unregister_action_to_condition(act_sleep, cond); SIMIX_action_destroy(act_sleep); - } else { - __SIMIX_cond_wait(cond); - } +/* } else { */ +/* __SIMIX_cond_wait(cond); */ +/* } */ /* get the mutex again */ SIMIX_mutex_lock(cond->mutex); @@ -233,8 +233,9 @@ void __SIMIX_cond_wait(smx_cond_t cond) void SIMIX_cond_wait_timeout(smx_cond_t cond, smx_mutex_t mutex, double max_duration) { - xbt_assert0((mutex != NULL), "Invalid parameters"); + smx_action_t act_sleep; + xbt_assert0((mutex != NULL), "Invalid parameters"); DEBUG1("Timed wait condition %p", cond); cond->mutex = mutex; @@ -243,9 +244,8 @@ void SIMIX_cond_wait_timeout(smx_cond_t cond, smx_mutex_t mutex, if (max_duration >= 0) { act_sleep = SIMIX_action_sleep(SIMIX_host_self(), max_duration); SIMIX_register_action_to_condition(act_sleep, cond); - SIMIX_register_condition_to_action(act_sleep, cond); __SIMIX_cond_wait(cond); - xbt_fifo_remove(act_sleep->cond_list, cond); + SIMIX_unregister_action_to_condition(act_sleep, cond); if (SIMIX_action_get_state(act_sleep) == SURF_ACTION_DONE) { SIMIX_action_destroy(act_sleep); THROW0(timeout_error, 0, "Condition timeout"); @@ -270,10 +270,11 @@ void SIMIX_cond_wait_timeout(smx_cond_t cond, smx_mutex_t mutex, */ void SIMIX_cond_broadcast(smx_cond_t cond) { - xbt_assert0((cond != NULL), "Invalid parameters"); smx_process_t proc = NULL; smx_process_t proc_next = NULL; + xbt_assert0((cond != NULL), "Invalid parameters"); + DEBUG1("Broadcast condition %p", cond); xbt_swag_foreach_safe(proc, proc_next, cond->sleeping) { xbt_swag_remove(proc, cond->sleeping); @@ -302,43 +303,15 @@ void SIMIX_cond_destroy(smx_cond_t cond) "Cannot destroy conditional since someone is still using it"); xbt_swag_free(cond->sleeping); + DEBUG1("%d actions registered", xbt_fifo_size(cond->actions)); + __SIMIX_cond_display_actions(cond); xbt_fifo_foreach(cond->actions, item, action, smx_action_t) { - SIMIX_unregister_condition_to_action(action, cond); + SIMIX_unregister_action_to_condition(action, cond); } + __SIMIX_cond_display_actions(cond); + xbt_fifo_free(cond->actions); xbt_free(cond); return; } } - -/** - * \brief Set a condition to an action - * - * Creates the "link" between an action and a condition. You have to call this function when you create an action and want to wait its ending. - * \param action SIMIX action - * \param cond SIMIX cond - */ -void SIMIX_register_condition_to_action(smx_action_t action, - smx_cond_t cond) -{ - xbt_assert0((action != NULL) && (cond != NULL), "Invalid parameters"); - - DEBUG2("Register condition %p to action %p", cond, action); - xbt_fifo_push(action->cond_list, cond); -} - -/** - * \brief Unset a condition to an action - * - * Destroys the "link" between an action and a condition. - * \param action SIMIX action - * \param cond SIMIX cond - */ -void SIMIX_unregister_condition_to_action(smx_action_t action, - smx_cond_t cond) -{ - xbt_assert0((action != NULL) && (cond != NULL), "Invalid parameters"); - - while (xbt_fifo_remove(action->cond_list, cond)) { - } -}