+void _SIMIX_host_free_process_arg(void *);
+void _SIMIX_host_free_process_arg(void *data)
+{
+ smx_process_arg_t arg = *(void**)data;
+ xbt_free(arg->name);
+ xbt_free(arg);
+}
+/**
+ * \brief Add a process to the list of the processes that the host will restart when it comes back
+ * This function add a process to the list of the processes that will be restarted when the host comes
+ * back. It is expected that this function is called when the host is down.
+ * The processes will only be restarted once, meaning that you will have to register the process
+ * again to restart the process again.
+ */
+void SIMIX_host_add_auto_restart_process(smx_host_t host,
+ const char *name,
+ xbt_main_func_t code,
+ void *data,
+ const char *hostname,
+ double kill_time,
+ int argc, char **argv,
+ xbt_dict_t properties,
+ int auto_restart)
+{
+ if (!host->auto_restart_processes) {
+ host->auto_restart_processes = xbt_dynar_new(sizeof(smx_process_arg_t),_SIMIX_host_free_process_arg);
+ }
+ smx_process_arg_t arg = xbt_new(s_smx_process_arg_t,1);
+ arg->name = xbt_strdup(name);
+ arg->code = code;
+ arg->data = data;
+ arg->hostname = hostname;
+ arg->kill_time = kill_time;
+ arg->argc = argc;
+
+ arg->argv = xbt_new(char*,argc);
+
+ int i;
+ for (i = 0; i < argc; i++) {
+ arg->argv[i] = xbt_strdup(argv[i]);
+ }
+
+ arg->properties = properties;
+ arg->auto_restart = auto_restart;
+
+ if( SIMIX_host_get_state(host) == SURF_RESOURCE_OFF
+ && !xbt_dict_get_or_null(watched_hosts_lib,host->name)){
+ xbt_dict_set(watched_hosts_lib,host->name,host,NULL);
+ XBT_DEBUG("Have push host %s to watched_hosts_lib because state == SURF_RESOURCE_OFF",host->name);
+ }
+ xbt_dynar_push_as(host->auto_restart_processes,smx_process_arg_t,arg);
+}
+/**
+ * \brief Restart the list of processes that have been registered to the host
+ */
+void SIMIX_host_restart_processes(smx_host_t host)
+{
+ unsigned int cpt;
+ smx_process_arg_t arg;
+ xbt_dynar_foreach(host->auto_restart_processes,cpt,arg) {
+
+ smx_process_t process;
+
+ XBT_DEBUG("Restarting Process %s(%s) right now", arg->argv[0], arg->hostname);
+ if (simix_global->create_process_function) {
+ simix_global->create_process_function(&process,
+ arg->argv[0],
+ arg->code,
+ NULL,
+ arg->hostname,
+ arg->kill_time,
+ arg->argc,
+ arg->argv,
+ arg->properties,
+ arg->auto_restart);
+ }
+ else {
+ simcall_process_create(&process,
+ arg->argv[0],
+ arg->code,
+ NULL,
+ arg->hostname,
+ arg->kill_time,
+ arg->argc,
+ arg->argv,
+ arg->properties,
+ arg->auto_restart);
+
+ }
+ }
+ xbt_dynar_reset(host->auto_restart_processes);
+}
+
+void SIMIX_host_autorestart(smx_host_t host)
+{
+ if(simix_global->autorestart)
+ simix_global->autorestart(host);
+ else
+ xbt_die("No function for simix_global->autorestart");
+}