Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[trace] recursive search for a type in the type hierarchy
[simgrid.git] / src / instr / instr_routing.c
index 03663d5..42dfda5 100644 (file)
@@ -14,39 +14,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY (instr_routing, instr, "Tracing platform hierarc
 
 extern xbt_dict_t defined_types; /* from instr_interface.c */
 
-typedef enum {
-  TYPE_VARIABLE,
-  TYPE_LINK,
-  TYPE_CONTAINER,
-} e_entity_types;
-
-typedef struct s_type *type_t;
-typedef struct s_type {
-  char *id;
-  char *name;
-  e_entity_types kind;
-  struct s_type *father;
-  xbt_dict_t children;
-}s_type_t;
-
-typedef enum {
-  INSTR_HOST,
-  INSTR_LINK,
-  INSTR_ROUTER,
-  INSTR_AS,
-} e_container_types;
-
-typedef struct s_container *container_t;
-typedef struct s_container {
-  char *name;     /* Unique name of this container */
-  char *id;       /* Unique id of this container */
-  type_t type;    /* Type of this container */
-  int level;      /* Level in the hierarchy, root level is 0 */
-  e_container_types kind; /* This container is of what kind */
-  struct s_container *father;
-  xbt_dict_t children;
-}s_container_t;
-
+static int platform_created = 0;            /* indicate whether the platform file has been traced */
 static type_t rootType = NULL;              /* the root type */
 static container_t rootContainer = NULL;    /* the root container */
 static xbt_dynar_t currentContainer = NULL; /* push and pop, used only in creation */
@@ -117,6 +85,14 @@ static type_t newLinkType (const char *typename, e_entity_types kind, type_t fat
   return ret;
 }
 
+static type_t newStateType (const char *typename, e_entity_types kind, type_t father)
+{
+  type_t ret = newType (typename, kind, father);
+//  INFO4("StateType %s(%s), child of %s(%s)", ret->name, ret->id, father->name, father->id);
+  pajeDefineStateType(ret->id, ret->father->id, ret->name);
+  return ret;
+}
+
 static type_t getContainerType (const char *typename, type_t father)
 {
   type_t ret;
@@ -151,6 +127,15 @@ static type_t getLinkType (const char *typename, type_t father, type_t source, t
   return ret;
 }
 
+static type_t getStateType (const char *typename, type_t father)
+{
+  type_t ret = xbt_dict_get_or_null (father->children, typename);
+  if (ret == NULL){
+    ret = newStateType (typename, TYPE_STATE, father);
+  }
+  return ret;
+}
+
 void instr_routing_define_callbacks ()
 {
   if (!TRACE_is_active())
@@ -172,7 +157,7 @@ static long long int newContainedId ()
   return counter++;
 }
 
-static container_t newContainer (const char *name, e_container_types kind, container_t father)
+container_t newContainer (const char *name, e_container_types kind, container_t father)
 {
   long long int counter = newContainedId();
   char id_str[INSTR_DEFAULT_STR_SIZE];
@@ -182,12 +167,6 @@ static container_t newContainer (const char *name, e_container_types kind, conta
   new->name = xbt_strdup (name); // name of the container
   new->id = xbt_strdup (id_str); // id (or alias) of the container
   new->father = father;
-  // father of this container
-  if (new->father){
-    new->father = xbt_dynar_get_ptr(currentContainer, xbt_dynar_length(currentContainer)-1);
-  }else{
-    new->father = NULL;
-  }
   // level depends on level of father
   if (new->father){
     new->level = new->father->level+1;
@@ -211,6 +190,7 @@ static container_t newContainer (const char *name, e_container_types kind, conta
       case INSTR_HOST: new->type = getContainerType ("HOST", new->father->type); break;
       case INSTR_LINK: new->type = getContainerType ("LINK", new->father->type); break;
       case INSTR_ROUTER: new->type = getContainerType ("ROUTER", new->father->type); break;
+      case INSTR_SMPI: new->type = getContainerType ("MPI", new->father->type); break;
       default: xbt_die ("Congratulations, you have found a bug on newContainer function of instr_routing.c"); break;
     }
   }
@@ -237,6 +217,62 @@ static container_t newContainer (const char *name, e_container_types kind, conta
   return new;
 }
 
+static container_t recursiveGetContainer (const char *name, container_t root)
+{
+  if (strcmp (root->name, name) == 0) return root;
+
+  xbt_dict_cursor_t cursor = NULL;
+  container_t child;
+  char *child_name;
+  xbt_dict_foreach(root->children, cursor, child_name, child) {
+    container_t ret = recursiveGetContainer(name, child);
+    if (ret) return ret;
+  }
+  return NULL;
+}
+
+container_t getContainer (const char *name)
+{
+  return recursiveGetContainer(name, rootContainer);
+}
+
+static type_t recursiveGetType (const char *name, type_t root)
+{
+  if (strcmp (root->name, name) == 0) return root;
+
+  xbt_dict_cursor_t cursor = NULL;
+  type_t child;
+  char *child_name;
+  xbt_dict_foreach(root->children, cursor, child_name, child) {
+    type_t ret = recursiveGetType(name, child);
+    if (ret) return ret;
+  }
+  return NULL;
+}
+
+type_t getType (const char *name)
+{
+  return recursiveGetType (name, rootType);
+}
+
+void destroyContainer (container_t container)
+{
+  //remove me from my father
+  if (container->father){
+    xbt_dict_remove(container->father->children, container->name);
+  }
+
+  //trace my destruction
+  pajeDestroyContainer(SIMIX_get_clock(), container->type->id, container->id);
+
+  //free
+  xbt_free (container->name);
+  xbt_free (container->id);
+  xbt_free (container->children);
+  xbt_free (container);
+  container = NULL;
+}
+
 static container_t findChild (container_t root, container_t a1)
 {
   if (root == a1) return root;
@@ -395,6 +431,14 @@ static void instr_routing_parse_start_AS ()
     rootContainer = newContainer ("0", INSTR_AS, NULL);
     xbt_dynar_push (currentContainer, rootContainer);
 
+    if (TRACE_smpi_is_enabled()) {
+      if (!TRACE_smpi_is_grouped()){
+        container_t father = xbt_dynar_get_ptr(currentContainer, xbt_dynar_length(currentContainer)-1);
+        type_t mpi = getContainerType("MPI", father->type);
+        getStateType ("MPI_STATE", mpi);
+        getLinkType ("MPI_LINK", rootType, mpi, mpi);
+      }
+    }
   }
   container_t father = xbt_dynar_get_ptr(currentContainer, xbt_dynar_length(currentContainer)-1);
   container_t new = newContainer (A_surfxml_AS_id, INSTR_AS, father);
@@ -436,6 +480,14 @@ static void instr_routing_parse_start_host ()
   if (TRACE_uncategorized()){
     getVariableType ("power_used", "0.5 0.5 0.5", new->type);
   }
+
+  if (TRACE_smpi_is_enabled()) {
+    if (TRACE_smpi_is_grouped()){
+      type_t mpi = getContainerType("MPI", new->type);
+      getStateType ("MPI_STATE", mpi);
+      getLinkType ("MPI_LINK", rootType, mpi, mpi);
+    }
+  }
 }
 
 static void instr_routing_parse_end_host ()
@@ -456,6 +508,7 @@ static void instr_routing_parse_end_platform ()
 {
   currentContainer = NULL;
   recursiveGraphExtraction (rootContainer);
+  platform_created = 1;
 }
 
 /*
@@ -495,14 +548,7 @@ static void recursiveDestroyContainer (container_t container)
   xbt_dict_foreach(container->children, cursor, child_name, child) {
     recursiveDestroyContainer (child);
   }
-
-  pajeDestroyContainer(SIMIX_get_clock(), container->type->id, container->id);
-
-  xbt_free (container->name);
-  xbt_free (container->id);
-  xbt_free (container->children);
-  xbt_free (container);
-  container = NULL;
+  destroyContainer (container);
 }
 
 static void recursiveDestroyType (type_t type)
@@ -532,7 +578,7 @@ void instr_destroy_platform ()
 static void recursiveNewUserVariableType (const char *new_typename, const char *color, type_t root)
 {
   if (!strcmp (root->name, "HOST") || !strcmp (root->name, "LINK")){
-    newVariableType(new_typename, TYPE_VARIABLE, color, root);
+    getVariableType(new_typename, color, root);
   }
   xbt_dict_cursor_t cursor = NULL;
   type_t child_type;
@@ -550,7 +596,7 @@ void instr_new_user_variable_type (const char *new_typename, const char *color)
 static void recursiveNewUserLinkVariableType (const char *new_typename, const char *color, type_t root)
 {
   if (!strcmp (root->name, "LINK")){
-    newVariableType(new_typename, TYPE_VARIABLE, color, root);
+    getVariableType(new_typename, color, root);
   }
   xbt_dict_cursor_t cursor = NULL;
   type_t child_type;
@@ -569,7 +615,7 @@ void instr_new_user_link_variable_type  (const char *new_typename, const char *c
 static void recursiveNewUserHostVariableType (const char *new_typename, const char *color, type_t root)
 {
   if (!strcmp (root->name, "HOST")){
-    newVariableType(new_typename, TYPE_VARIABLE, color, root);
+    getVariableType(new_typename, color, root);
   }
   xbt_dict_cursor_t cursor = NULL;
   type_t child_type;
@@ -584,5 +630,10 @@ void instr_new_user_host_variable_type  (const char *new_typename, const char *c
   recursiveNewUserHostVariableType (new_typename, color, rootType);
 }
 
+int instr_platform_traced ()
+{
+  return platform_created;
+}
+
 #endif /* HAVE_TRACING */