-/* 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
}
/**
* \brief Stops a process.
- * Stops the process, execute all the registered on_exit functions
+ *
+ * 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) {
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);
}
*process = xbt_new0(s_smx_process_t, 1);
xbt_assert(((code != NULL) && (host != NULL)), "Invalid parameters");
-
/* Process data */
(*process)->pid = simix_process_maxpid++;
(*process)->name = xbt_strdup(name);
* or directly for SIMIX internal purposes.
*
* \param process poor victim
+ * \param issuer the process which has sent the PROCESS_KILL. Important to not schedule twice the same process.
*/
-void SIMIX_process_kill(smx_process_t process) {
+void SIMIX_process_kill(smx_process_t process, smx_process_t issuer) {
XBT_DEBUG("Killing process %s on %s", process->name, process->smx_host->name);
break;
}
}
- if(!xbt_dynar_member(simix_global->process_to_run, &(process)))
+ if(!xbt_dynar_member(simix_global->process_to_run, &(process)) && process != issuer) {
xbt_dynar_push_as(simix_global->process_to_run, smx_process_t, process);
+ }
+
}
/**
while ((p = xbt_swag_extract(simix_global->process_list))) {
if (p != issuer) {
- SIMIX_process_kill(p);
+ SIMIX_process_kill(p,issuer);
}
}
void SIMIX_process_auto_restart_set(smx_process_t process, int auto_restart) {
process->auto_restart = auto_restart;
}
+/**
+ * \brief Restart a process.
+ * Restart a process, starting it again from the beginning.
+ */
+void SIMIX_process_restart(smx_process_t process, smx_process_t issuer) {
+ XBT_DEBUG("Restarting process %s on %s", process->name, process->smx_host->name);
+ //retrieve the arguments of the old process
+ //FIXME: Factorise this with SIMIX_host_add_auto_restart_process ?
+ s_smx_process_arg_t arg;
+ arg.code = process->code;
+ arg.hostname = process->smx_host->name;
+ arg.kill_time = process->kill_time;
+ arg.argc = process->argc;
+ arg.data = process->data;
+ int i;
+ arg.argv = xbt_new(char*,process->argc + 1);
+ for (i = 0; i < arg.argc; i++) {
+ arg.argv[i] = xbt_strdup(process->argv[i]);
+ }
+ arg.argv[process->argc] = NULL;
+ arg.properties = NULL;
+ arg.auto_restart = process->auto_restart;
+ //kill the old process
+ SIMIX_process_kill(process,issuer);
+ //start the new process
+ smx_process_t new_process;
+ if (simix_global->create_process_function) {
+ simix_global->create_process_function(&new_process,
+ arg.argv[0],
+ arg.code,
+ arg.data,
+ arg.hostname,
+ arg.kill_time,
+ arg.argc,
+ arg.argv,
+ arg.properties,
+ arg.auto_restart);
+ }
+ else {
+ simcall_process_create(&new_process,
+ arg.argv[0],
+ arg.code,
+ arg.data,
+ arg.hostname,
+ arg.kill_time,
+ arg.argc,
+ arg.argv,
+ arg.properties,
+ arg.auto_restart);
+
+ }
+
+}