X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/c8880fd8bfe302109bdec0629929499479d714b0..d13b1659a0c2551ee41b287a269e391bb2d7bc8a:/src/simix/smx_process.c diff --git a/src/simix/smx_process.c b/src/simix/smx_process.c index c70f33a560..21a4ef8eb9 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)"); @@ -38,9 +40,6 @@ int SIMIX_process_has_pending_comms(smx_process_t process) { return xbt_fifo_size(process->comms) > 0; } -void simcall_HANDLER_process_cleanup(smx_simcall_t simcall, smx_process_t process) { - SIMIX_process_cleanup(process); -} /** * \brief Moves a process to the list of processes to destroy. */ @@ -51,6 +50,10 @@ 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); + /* cancel non-blocking communications */ smx_synchro_t synchro; while ((synchro = xbt_fifo_pop(process->comms))) { @@ -89,6 +92,7 @@ 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); @@ -106,6 +110,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 */ @@ -156,7 +162,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); } @@ -259,7 +265,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); @@ -289,7 +294,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); } } } @@ -370,6 +375,7 @@ void SIMIX_process_kill(smx_process_t process, smx_process_t issuer) { } } 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); } @@ -403,11 +409,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: @@ -422,8 +429,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) { @@ -588,18 +593,11 @@ int SIMIX_process_get_maxpid(void) { return simix_process_maxpid; } -int simcall_HANDLER_process_count(smx_simcall_t simcall){ - return SIMIX_process_count(); -} int SIMIX_process_count(void) { return xbt_swag_size(simix_global->process_list); } -int simcall_HANDLER_process_get_PID(smx_simcall_t simcall, smx_process_t self){ - return SIMIX_process_get_PID(self); -} - int SIMIX_process_get_PID(smx_process_t self){ if (self == NULL) return 0; @@ -607,10 +605,6 @@ int SIMIX_process_get_PID(smx_process_t self){ return self->pid; } -int simcall_HANDLER_process_get_PPID(smx_simcall_t simcall, smx_process_t self){ - return SIMIX_process_get_PPID(self); -} - int SIMIX_process_get_PPID(smx_process_t self){ if (self == NULL) return 0; @@ -628,10 +622,6 @@ void* SIMIX_process_self_get_data(smx_process_t self) return SIMIX_process_get_data(self); } -void simcall_HANDLER_process_set_data(smx_simcall_t simcall, smx_process_t process, - void *data){ - SIMIX_process_set_data(process, data); -} void SIMIX_process_self_set_data(smx_process_t self, void *data) { xbt_assert(self == SIMIX_process_self(), "This is not the current process"); @@ -639,9 +629,6 @@ void SIMIX_process_self_set_data(smx_process_t self, void *data) SIMIX_process_set_data(self, data); } -void* simcall_HANDLER_process_get_data(smx_simcall_t simcall, smx_process_t process){ - return SIMIX_process_get_data(process); -} void* SIMIX_process_get_data(smx_process_t process) { return process->data; @@ -652,9 +639,6 @@ void SIMIX_process_set_data(smx_process_t process, void *data) process->data = data; } -smx_host_t simcall_HANDLER_process_get_host(smx_simcall_t simcall, smx_process_t process){ - return SIMIX_process_get_host(process); -} smx_host_t SIMIX_process_get_host(smx_process_t process) { return process->smx_host; @@ -671,9 +655,6 @@ const char* SIMIX_process_self_get_name(void) { return SIMIX_process_get_name(process); } -const char* simcall_HANDLER_process_get_name(smx_simcall_t simcall, smx_process_t process) { - return SIMIX_process_get_name(process); -} const char* SIMIX_process_get_name(smx_process_t process) { return process->name; @@ -691,17 +672,11 @@ smx_process_t SIMIX_process_get_by_name(const char* name) return NULL; } -int simcall_HANDLER_process_is_suspended(smx_simcall_t simcall, smx_process_t process){ - return SIMIX_process_is_suspended(process); -} int SIMIX_process_is_suspended(smx_process_t process) { return process->suspended; } -xbt_dict_t simcall_HANDLER_process_get_properties(smx_simcall_t simcall, smx_process_t process){ - return SIMIX_process_get_properties(process); -} xbt_dict_t SIMIX_process_get_properties(smx_process_t process) { return process->properties; @@ -747,7 +722,7 @@ smx_synchro_t SIMIX_process_join(smx_process_t issuer, smx_process_t process, do void simcall_HANDLER_process_sleep(smx_simcall_t simcall, double duration) { - if (MC_is_active()) { + if (MC_is_active() || MC_record_replay_is_active()) { MC_process_clock_add(simcall->issuer, duration); simcall_process_sleep__set__result(simcall, SIMIX_DONE); SIMIX_simcall_answer(simcall); @@ -772,9 +747,7 @@ smx_synchro_t SIMIX_process_sleep(smx_process_t process, double duration) synchro = xbt_mallocator_get(simix_global->synchro_mallocator); synchro->type = SIMIX_SYNC_SLEEP; synchro->name = NULL; -#ifdef HAVE_TRACING synchro->category = NULL; -#endif synchro->sleep.host = host; synchro->sleep.surf_sleep = @@ -959,11 +932,6 @@ void SIMIX_process_on_exit_runall(smx_process_t process) { } } -void simcall_HANDLER_process_on_exit(smx_simcall_t simcall, smx_process_t process, - int_f_pvoid_pvoid_t fun, void *data) { - SIMIX_process_on_exit(process, fun, data); -} - void SIMIX_process_on_exit(smx_process_t process, int_f_pvoid_pvoid_t fun, void *data) { xbt_assert(process, "current process not found: are you in maestro context ?"); @@ -976,10 +944,6 @@ void SIMIX_process_on_exit(smx_process_t process, int_f_pvoid_pvoid_t fun, void xbt_dynar_push_as(process->on_exit,s_smx_process_exit_fun_t,exit_fun); } -void simcall_HANDLER_process_auto_restart_set(smx_simcall_t simcall, smx_process_t process, - int auto_restart) { - SIMIX_process_auto_restart_set(process, auto_restart); -} /** * \brief Sets the auto-restart status of the process. * If set to 1, the process will be automatically restarted when its host @@ -992,18 +956,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;