Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Finalize properties on AS.
[simgrid.git] / src / surf / surf.c
index 64b50d0..19e441e 100644 (file)
@@ -9,6 +9,7 @@
 #include "surf_private.h"
 #include "xbt/module.h"
 #include "mc/mc.h"
+#include "simix/smx_host_private.h"
 #include "surf/surf_resource.h"
 #include "xbt/xbt_os_thread.h"
 
@@ -135,7 +136,7 @@ s_surf_model_description_t surf_network_model_description[] = {
 #ifdef HAVE_NS3
   {"NS3",
    "Network pseudo-model using the NS3 tcp model instead of an analytic model",
-       surf_network_model_init_NS3},
+  surf_network_model_init_NS3},
 #endif
   {"Reno",
    "Model from Steven H. Low using lagrange_solve instead of lmm_solve (experts only; check the code for more info).",
@@ -368,6 +369,18 @@ static XBT_INLINE void routing_asr_host_free(void *p)
   xbt_free(elm);
 }
 
+static XBT_INLINE void routing_asr_prop_free(void *p)
+{
+  xbt_dict_t elm = p;
+  xbt_dict_free(&elm);
+}
+
+void sg_version(int *ver_major,int *ver_minor,int *ver_patch) {
+  *ver_major = SIMGRID_VERSION_MAJOR;
+  *ver_minor = SIMGRID_VERSION_MINOR;
+  *ver_patch = SIMGRID_VERSION_PATCH;
+}
+
 void surf_init(int *argc, char **argv)
 {
   XBT_DEBUG("Create all Libs");
@@ -376,12 +389,14 @@ void surf_init(int *argc, char **argv)
   as_router_lib = xbt_lib_new();
   storage_lib = xbt_lib_new();
   storage_type_lib = xbt_lib_new();
+  watched_hosts_lib = xbt_dict_new();
 
-  XBT_DEBUG("ADD ROUTING LEVEL");
+  XBT_DEBUG("Add routing levels");
   ROUTING_HOST_LEVEL = xbt_lib_add_level(host_lib,routing_asr_host_free);
   ROUTING_ASR_LEVEL  = xbt_lib_add_level(as_router_lib,routing_asr_host_free);
+  ROUTING_PROP_ASR_LEVEL = xbt_lib_add_level(as_router_lib,routing_asr_prop_free);
 
-  XBT_DEBUG("ADD SURF LEVELS");
+  XBT_DEBUG("Add SURF levels");
   SURF_CPU_LEVEL = xbt_lib_add_level(host_lib,surf_resource_free);
   SURF_WKS_LEVEL = xbt_lib_add_level(host_lib,surf_resource_free);
   SURF_LINK_LEVEL = xbt_lib_add_level(link_lib,surf_resource_free);
@@ -464,6 +479,8 @@ void surf_exit(void)
   xbt_lib_free(&storage_lib);
   xbt_lib_free(&storage_type_lib);
 
+  xbt_dict_free(&watched_hosts_lib);
+
   tmgr_finalize();
   surf_parse_lex_destroy();
   surf_parse_free_callbacks();
@@ -570,8 +587,8 @@ double surf_solve(double max_date)
     }
 
     if (next_event_date == -1.0) {
-       XBT_DEBUG("no next TRACE event. Stop searching for it");
-       break;
+      XBT_DEBUG("no next TRACE event. Stop searching for it");
+      break;
     }
 
     if ((min != -1.0) && (next_event_date > NOW + min)) break;
@@ -601,7 +618,7 @@ double surf_solve(double max_date)
    * This may cause an infinite loop if one cpu has a trace with periodicity = 0 and the other a trace with periodicity > 0.
    * The options are: all traces with same periodicity(0 or >0) or we need to change the way how the events are managed */
   if (min == -1.0) {
-       XBT_DEBUG("No next event at all. Bail out now.");
+  XBT_DEBUG("No next event at all. Bail out now.");
     return -1.0;
   }
 
@@ -689,3 +706,22 @@ void surf_set_nthreads(int nthreads) {
 
   surf_nthreads = nthreads;
 }
+
+void surf_watched_hosts(void)
+{
+  char *key;
+  void *host;
+  xbt_dict_cursor_t cursor;
+
+  XBT_DEBUG("Check for host SURF_RESOURCE_ON on watched_hosts_lib");
+  xbt_dict_foreach(watched_hosts_lib,cursor,key,host)
+  {
+    if(SIMIX_host_get_state(host) == SURF_RESOURCE_ON){
+      XBT_INFO("Restart processes on host: %s",SIMIX_host_get_name(host));
+      SIMIX_host_autorestart(host);
+      xbt_dict_remove(watched_hosts_lib,key);
+    }
+    else
+      XBT_DEBUG("See SURF_RESOURCE_OFF on host: %s",key);
+  }
+}