Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
model-checker : move functions about snapshot comparison in a separate file mc_compare.c
[simgrid.git] / src / simix / smx_host.c
index f663ea2..a247d60 100644 (file)
@@ -1,4 +1,4 @@
-/* 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
@@ -13,7 +13,6 @@
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_host, simix,
                                 "Logging specific to SIMIX (hosts)");
 
-
 static void SIMIX_execution_finish(smx_action_t action);
 
 /**
@@ -177,16 +176,19 @@ void* SIMIX_host_get_data(smx_host_t host)
   return host->data;
 }
 void _SIMIX_host_free_process_arg(void *);
-void _SIMIX_host_free_process_arg(void *data) {
+void _SIMIX_host_free_process_arg(void *data)
+{
   smx_process_arg_t arg = *(void**)data;
-  int i;
   xbt_free(arg->name);
-  for (i = 0; i < arg->argc; i++) {
-    xbt_free(arg->argv[i]);
-  }
-  xbt_free(arg->argv);
   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,
@@ -195,31 +197,85 @@ void SIMIX_host_add_auto_restart_process(smx_host_t host,
                                          double kill_time,
                                          int argc, char **argv,
                                          xbt_dict_t properties,
-                                         int auto_restart) {
+                                         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 + 1);
 
   int i;
   for (i = 0; i < argc; i++) {
     arg->argv[i] = xbt_strdup(argv[i]);
   }
+  arg->argv[argc] = NULL;
 
   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");
+}
 
 void SIMIX_host_set_data(smx_host_t host, void *data)
 {
@@ -298,19 +354,14 @@ smx_action_t SIMIX_host_parallel_execute( const char *name,
 
 void SIMIX_host_execution_destroy(smx_action_t action)
 {
-  int destroyed=0;
   XBT_DEBUG("Destroy action %p", action);
 
-
   if (action->execution.surf_exec) {
-    destroyed = surf_workstation_model->action_unref(action->execution.surf_exec);
+    surf_workstation_model->action_unref(action->execution.surf_exec);
     action->execution.surf_exec = NULL;
   }
-
-  if (destroyed) {
-    xbt_free(action->name);
-    xbt_mallocator_release(simix_global->action_mallocator, action);
-  }
+  xbt_free(action->name);
+  xbt_mallocator_release(simix_global->action_mallocator, action);
 }
 
 void SIMIX_host_execution_cancel(smx_action_t action)