X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/9532edf044eed31bcf6de22916c8824e18f373ad..d7d25ee1e33a01d3655723cbe4c8e0a77ea60712:/src/simix/smx_process.c diff --git a/src/simix/smx_process.c b/src/simix/smx_process.c index b0c51cd1b6..02e70b43f3 100644 --- a/src/simix/smx_process.c +++ b/src/simix/smx_process.c @@ -9,6 +9,8 @@ #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, "Logging specific to SIMIX (process)"); @@ -48,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))) { @@ -86,10 +94,13 @@ void SIMIX_process_cleanup(smx_process_t process) } } + XBT_DEBUG("%p should not be run anymore",process); xbt_swag_remove(process, simix_global->process_list); 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); } /** @@ -103,6 +114,8 @@ void SIMIX_process_empty_trash(void) smx_process_t process = NULL; while ((process = xbt_swag_extract(simix_global->process_to_destroy))) { + XBT_DEBUG("Getting rid of %p",process); + SIMIX_context_free(process->context); /* Free the exception allocated at creation time */ @@ -153,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); } @@ -256,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); @@ -286,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); } } } @@ -344,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; @@ -365,8 +378,11 @@ 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); xbt_dynar_push_as(simix_global->process_to_run, smx_process_t, process); } @@ -400,11 +416,12 @@ void SIMIX_process_throw(smx_process_t process, xbt_errcat_t cat, int value, con break; case SIMIX_SYNC_SLEEP: - SIMIX_process_sleep_destroy(process->waiting_synchro); - break; - case SIMIX_SYNC_JOIN: SIMIX_process_sleep_destroy(process->waiting_synchro); + if (!xbt_dynar_member(simix_global->process_to_run, &(process)) && process != SIMIX_process_self()) { + XBT_DEBUG("Inserting %s in the to_run list", process->name); + xbt_dynar_push_as(simix_global->process_to_run, smx_process_t, process); + } break; case SIMIX_SYNC_SYNCHRO: @@ -419,8 +436,6 @@ void SIMIX_process_throw(smx_process_t process, xbt_errcat_t cat, int value, con } process->waiting_synchro = 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 simcall_HANDLER_process_killall(smx_simcall_t simcall, int reset_pid) { @@ -948,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;