X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/648f354f59e3ae712e973c2268b1c69395b6fdf2..cd69f8c66886ae218c6a9b38125b27fe157e6bb2:/src/simix/smx_process.c diff --git a/src/simix/smx_process.c b/src/simix/smx_process.c index 84bcef1bee..ddc96427bf 100644 --- a/src/simix/smx_process.c +++ b/src/simix/smx_process.c @@ -332,7 +332,7 @@ void SIMIX_process_kill(smx_process_t process, smx_process_t issuer) { process->context->iwannadie = 1; process->blocked = 0; process->suspended = 0; - /* FIXME: set doexception to 0 also? */ + process->doexception = 0; /* destroy the blocking action if any */ if (process->waiting_action) { @@ -367,13 +367,6 @@ void SIMIX_process_kill(smx_process_t process, smx_process_t issuer) { SIMIX_io_destroy(process->waiting_action); break; - /* **************************************/ - /* TUTORIAL: New API */ - case SIMIX_ACTION_NEW_API: - SIMIX_new_api_destroy(process->waiting_action); - break; - /* **************************************/ - } } if(!xbt_dynar_member(simix_global->process_to_run, &(process)) && process != issuer) { @@ -382,6 +375,57 @@ void SIMIX_process_kill(smx_process_t process, smx_process_t issuer) { } +/** @brief Ask another process to raise the given exception + * + * @param cat category of exception + * @param value value associated to the exception + * @param msg string information associated to the exception + */ +void SIMIX_process_throw(smx_process_t process, xbt_errcat_t cat, int value, const char *msg) { + SMX_EXCEPTION(process, cat, value, msg); + + if (process->suspended) + SIMIX_process_resume(process,SIMIX_process_self()); + + /* cancel the blocking action if any */ + if (process->waiting_action) { + + switch (process->waiting_action->type) { + + case SIMIX_ACTION_EXECUTE: + case SIMIX_ACTION_PARALLEL_EXECUTE: + SIMIX_host_execution_cancel(process->waiting_action); + break; + + case SIMIX_ACTION_COMMUNICATE: + xbt_fifo_remove(process->comms, process->waiting_action); + SIMIX_comm_cancel(process->waiting_action); + break; + + case SIMIX_ACTION_SLEEP: + SIMIX_process_sleep_destroy(process->waiting_action); + break; + + case SIMIX_ACTION_JOIN: + SIMIX_process_sleep_destroy(process->waiting_action); + break; + + case SIMIX_ACTION_SYNCHRO: + SIMIX_synchro_stop_waiting(process, &process->simcall); + break; + + case SIMIX_ACTION_IO: + SIMIX_io_destroy(process->waiting_action); + break; + + } + } + process->waiting_action = NULL; + + if (!xbt_dynar_member(simix_global->process_to_run, &(process)) && process != SIMIX_process_self()) + xbt_dynar_push_as(simix_global->process_to_run, smx_process_t, process); +} + void SIMIX_pre_process_killall(smx_simcall_t simcall, int reset_pid) { SIMIX_process_killall(simcall->issuer, reset_pid); } @@ -494,8 +538,6 @@ void SIMIX_pre_process_resume(smx_simcall_t simcall, smx_process_t process){ void SIMIX_process_resume(smx_process_t process, smx_process_t issuer) { - xbt_assert((process != NULL), "Invalid parameters"); - XBT_IN("process = %p, issuer = %p", process, issuer); if(process->context->iwannadie) { @@ -759,7 +801,7 @@ void SIMIX_post_process_sleep(smx_action_t action) switch(surf_action_get_state(action->sleep.surf_sleep)){ case SURF_ACTION_FAILED: simcall->issuer->context->iwannadie = 1; - //SMX_EXCEPTION(simcall->issuer, host_error, 0, "Host failed"); + //SMX_EXCEPTION(simcall->issuer, host_error, 0, "Host failed"); state = SIMIX_SRC_HOST_FAILURE; break; @@ -840,12 +882,11 @@ void SIMIX_process_yield(smx_process_t self) if (self->context->iwannadie){ XBT_DEBUG("I wanna die!"); SIMIX_process_stop(self); - XBT_DEBUG("SIMIX Stop done"); } if (self->suspended) { XBT_DEBUG("Hey! I'm suspended."); - xbt_assert(!self->doexception, "Gloups! This exception may be lost by subsequent calls."); + xbt_assert(!self->doexception, "Gasp! This exception may be lost by subsequent calls."); self->suspended = 0; SIMIX_process_suspend(self, self); }