-/* Copyright (c) 2007, 2008, 2009, 2010. The SimGrid Team.
+/* Copyright (c) 2007-2012. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
simix_global->maestro_process = maestro;
return;
}
+/**
+ * \brief Stops a process.
+ *
+ * Stops the process, execute all the registered on_exit functions,
+ * register it to the list of the process to restart if needed
+ * and stops its context.
+ */
+void SIMIX_process_stop(smx_process_t arg) {
+ /* execute the on_exit functions */
+ SIMIX_process_on_exit_runall(arg);
+ /* Add the process to the list of process to restart, only if
+ * the host is down
+ */
+ 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,
+ arg->smx_host->name,
+ arg->kill_time,
+ arg->argc,arg->argv,arg->properties,
+ arg->auto_restart);
+ }
+ XBT_DEBUG("Process %s (%s) is dead",arg->name,arg->smx_host->name);
+ /* stop the context */
+ SIMIX_context_stop(arg->context);
+}
/**
* \brief Same as SIMIX_process_create() but with only one argument (used by timers).
+ * This function frees the argument.
* \return the process created
*/
smx_process_t SIMIX_process_create_from_wrapper(smx_process_arg_t args) {
args->kill_time,
args->argc,
args->argv,
- args->properties);
-
+ args->properties,
+ args->auto_restart);
+ xbt_free(args);
return process;
}
const char *hostname,
double kill_time,
int argc, char **argv,
- xbt_dict_t properties) {
+ xbt_dict_t properties,
+ int auto_restart) {
*process = NULL;
smx_host_t host = SIMIX_host_get_by_name(hostname);
(*process)->data = data;
(*process)->comms = xbt_fifo_new();
(*process)->simcall.issuer = *process;
+ /* Process data for auto-restart */
+ (*process)->auto_restart = auto_restart;
+ (*process)->code = code;
+ (*process)->argc = argc;
+ (*process)->argv = argv;
+ (*process)->kill_time = kill_time;
+
XBT_VERB("Create context %s", (*process)->name);
(*process)->context = SIMIX_context_new(code, argc, argv,
SIMIX_comm_destroy(process->waiting_action);
break;
- case SIMIX_ACTION_SLEEP:
- SIMIX_process_sleep_destroy(process->waiting_action);
- break;
+ case SIMIX_ACTION_SLEEP:
+ SIMIX_process_sleep_destroy(process->waiting_action);
+ break;
- case SIMIX_ACTION_SYNCHRO:
- SIMIX_synchro_stop_waiting(process, &process->simcall);
- SIMIX_synchro_destroy(process->waiting_action);
- break;
+ case SIMIX_ACTION_SYNCHRO:
+ SIMIX_synchro_stop_waiting(process, &process->simcall);
+ SIMIX_synchro_destroy(process->waiting_action);
+ break;
- case SIMIX_ACTION_IO:
- SIMIX_io_destroy(process->waiting_action);
- break;
+ case SIMIX_ACTION_IO:
+ SIMIX_io_destroy(process->waiting_action);
+ break;
}
}
if(!xbt_dynar_member(simix_global->process_to_run, &(process)))
if (self->context->iwannadie){
XBT_DEBUG("I wanna die!");
- SIMIX_context_stop(self->context);
+ SIMIX_process_stop(self);
}
if(self->suspended) {
(exit_fun.fun)(exit_fun.arg);
}
}
-void SIMIX_process_on_exit(int_f_pvoid_t fun, void *data) {
- smx_process_t process = SIMIX_process_self();
+void SIMIX_process_on_exit(smx_process_t process, int_f_pvoid_t fun, void *data) {
xbt_assert(process, "current process not found: are you in maestro context ?");
if (!process->on_exit) {
xbt_dynar_push_as(process->on_exit,s_smx_process_exit_fun_t,exit_fun);
}
+/**
+ * \brief Sets the auto-restart status of the process.
+ * If set to 1, the process will be automatically restarted when its host
+ * comes back.
+ */
+void SIMIX_process_auto_restart_set(smx_process_t process, int auto_restart) {
+ process->auto_restart = auto_restart;
+}