Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add SIMIX_host_restart_processes
authorSamuel Lepetit <samuel.lepetit@inria.fr>
Thu, 28 Jun 2012 11:59:15 +0000 (13:59 +0200)
committerSamuel Lepetit <samuel.lepetit@inria.fr>
Thu, 28 Jun 2012 11:59:15 +0000 (13:59 +0200)
src/simix/smx_host.c
src/simix/smx_host_private.h
src/simix/smx_process.c

index b771e85..cc4273b 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
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -178,7 +178,8 @@ void* SIMIX_host_get_data(smx_host_t host)
   return host->data;
 }
 void _SIMIX_host_free_process_arg(void *);
   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);
   smx_process_arg_t arg = *(void**)data;
   int i;
   xbt_free(arg->name);
@@ -188,6 +189,13 @@ void _SIMIX_host_free_process_arg(void *data) {
   xbt_free(arg->argv);
   xbt_free(arg);
 }
   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,
 void SIMIX_host_add_auto_restart_process(smx_host_t host,
                                          const char *name,
                                          xbt_main_func_t code,
@@ -196,7 +204,8 @@ void SIMIX_host_add_auto_restart_process(smx_host_t host,
                                          double kill_time,
                                          int argc, char **argv,
                                          xbt_dict_t properties,
                                          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);
   }
   if (!host->auto_restart_processes) {
     host->auto_restart_processes = xbt_dynar_new(sizeof(smx_process_arg_t),_SIMIX_host_free_process_arg);
   }
@@ -225,7 +234,46 @@ void SIMIX_host_add_auto_restart_process(smx_host_t host,
   }
   xbt_dynar_push_as(host->auto_restart_processes,smx_process_arg_t,arg);
 }
   }
   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_set_data(smx_host_t host, void *data)
 {
 
 void SIMIX_host_set_data(smx_host_t host, void *data)
 {
index ad195d8..0b32448 100644 (file)
@@ -33,7 +33,7 @@ void SIMIX_host_add_auto_restart_process(smx_host_t host,
                                          int argc, char **argv,
                                          xbt_dict_t properties,
                                          int auto_restart);
                                          int argc, char **argv,
                                          xbt_dict_t properties,
                                          int auto_restart);
-
+void SIMIX_host_restart_processes(smx_host_t host);
 xbt_dict_t SIMIX_host_get_properties(smx_host_t host);
 double SIMIX_host_get_speed(smx_host_t host);
 double SIMIX_host_get_available_speed(smx_host_t host);
 xbt_dict_t SIMIX_host_get_properties(smx_host_t host);
 double SIMIX_host_get_speed(smx_host_t host);
 double SIMIX_host_get_available_speed(smx_host_t host);
index b3e2a37..ceac7f0 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
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -146,7 +146,9 @@ void SIMIX_create_maestro_process()
 }
 /**
  * \brief Stops a process.
 }
 /**
  * \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) {
  * and stops its context.
  */
 void SIMIX_process_stop(smx_process_t arg) {