+
+/**
+ * \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;
+}
+
+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, 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_get_name(process->host));
+ //retrieve the arguments of the old 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_get_name(process->host);
+ arg.kill_time = SIMIX_timer_get_date(process->kill_timer);
+ 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) {
+ new_process = simix_global->create_process_function(
+ arg.argv[0],
+ arg.code,
+ arg.data,
+ arg.hostname,
+ arg.kill_time,
+ arg.argc,
+ arg.argv,
+ arg.properties,
+ arg.auto_restart,
+ NULL);
+ } else {
+ new_process = simcall_process_create(
+ arg.argv[0],
+ arg.code,
+ arg.data,
+ arg.hostname,
+ arg.kill_time,
+ arg.argc,
+ arg.argv,
+ arg.properties,
+ arg.auto_restart);
+
+ }
+ return new_process;
+}