X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/9932a0c0d2c44e34633c97a827b2b04d615cb4e9..d7d25ee1e33a01d3655723cbe4c8e0a77ea60712:/src/simix/smx_process.c?ds=sidebyside diff --git a/src/simix/smx_process.c b/src/simix/smx_process.c index 8fa3c6b8da..02e70b43f3 100644 --- a/src/simix/smx_process.c +++ b/src/simix/smx_process.c @@ -9,6 +9,7 @@ #include "xbt/log.h" #include "xbt/dict.h" #include "mc/mc.h" +#include "mc/mc_replay.h" #include "mc/mc_client.h" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_process, simix, @@ -49,6 +50,12 @@ void SIMIX_process_cleanup(smx_process_t process) SIMIX_process_on_exit_runall(process); + /* Unregister from the kill timer if any */ + if (process->kill_timer != NULL) + SIMIX_timer_remove(process->kill_timer); + + xbt_os_mutex_acquire(simix_global->mutex); + /* cancel non-blocking communications */ smx_synchro_t synchro; while ((synchro = xbt_fifo_pop(process->comms))) { @@ -92,6 +99,8 @@ void SIMIX_process_cleanup(smx_process_t process) xbt_swag_remove(process, SIMIX_host_priv(process->smx_host)->process_list); xbt_swag_insert(process, simix_global->process_to_destroy); process->context->iwannadie = 0; + + xbt_os_mutex_release(simix_global->mutex); } /** @@ -157,7 +166,7 @@ void SIMIX_process_stop(smx_process_t arg) { if (arg->auto_restart && !SIMIX_host_get_state(arg->smx_host)) { SIMIX_host_add_auto_restart_process(arg->smx_host,arg->name,arg->code, arg->data, sg_host_name(arg->smx_host), - arg->kill_time, + SIMIX_timer_get_date(arg->kill_timer), arg->argc,arg->argv,arg->properties, arg->auto_restart); } @@ -260,7 +269,6 @@ void SIMIX_process_create(smx_process_t *process, (*process)->code = code; (*process)->argc = argc; (*process)->argv = argv; - (*process)->kill_time = kill_time; XBT_VERB("Create context %s", (*process)->name); @@ -290,7 +298,7 @@ void SIMIX_process_create(smx_process_t *process, if (kill_time > SIMIX_get_clock() && simix_global->kill_process_function) { XBT_DEBUG("Process %s(%s) will be kill at time %f", (*process)->name, sg_host_name((*process)->smx_host), kill_time); - SIMIX_timer_set(kill_time, simix_global->kill_process_function, *process); + (*process)->kill_timer = SIMIX_timer_set(kill_time, simix_global->kill_process_function, *process); } } } @@ -348,6 +356,7 @@ void SIMIX_process_kill(smx_process_t process, smx_process_t issuer) { case SIMIX_SYNC_COMMUNICATE: xbt_fifo_remove(process->comms, process->waiting_synchro); SIMIX_comm_cancel(process->waiting_synchro); + xbt_fifo_remove(process->waiting_synchro->simcalls, &process->simcall); SIMIX_comm_destroy(process->waiting_synchro); break; @@ -369,6 +378,8 @@ void SIMIX_process_kill(smx_process_t process, smx_process_t issuer) { break; } + + process->waiting_synchro = NULL; } if(!xbt_dynar_member(simix_global->process_to_run, &(process)) && process != issuer) { XBT_DEBUG("Inserting %s in the to_run list", process->name); @@ -952,18 +963,15 @@ void SIMIX_process_auto_restart_set(smx_process_t process, int auto_restart) { smx_process_t simcall_HANDLER_process_restart(smx_simcall_t simcall, smx_process_t process) { return SIMIX_process_restart(process, simcall->issuer); } -/** - * \brief Restart a process. - * Restart a process, starting it again from the beginning. - */ +/** @brief Restart a process, starting it again from the beginning. */ smx_process_t SIMIX_process_restart(smx_process_t process, smx_process_t issuer) { XBT_DEBUG("Restarting process %s on %s", process->name, sg_host_name(process->smx_host)); //retrieve the arguments of the old process - //FIXME: Factorise this with SIMIX_host_add_auto_restart_process ? + //FIXME: Factorize this with SIMIX_host_add_auto_restart_process ? s_smx_process_arg_t arg; arg.code = process->code; arg.hostname = sg_host_name(process->smx_host); - arg.kill_time = process->kill_time; + arg.kill_time = SIMIX_timer_get_date(process->kill_timer); arg.argc = process->argc; arg.data = process->data; int i;