Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[trace] fix on link type creation (was indexed by type name, but should consider...
[simgrid.git] / src / instr / instr_routing.c
index b6c5028..a0fef42 100644 (file)
@@ -38,7 +38,7 @@ static long long int newTypeId ()
   return counter++;
 }
 
-static type_t newType (const char *typename, e_entity_types kind, type_t father)
+static type_t newType (const char *typename, const char *key, e_entity_types kind, type_t father)
 {
   type_t ret = xbt_new0(s_type_t, 1);
   ret->name = xbt_strdup (typename);
@@ -52,86 +52,80 @@ static type_t newType (const char *typename, e_entity_types kind, type_t father)
   ret->id = xbt_strdup (str_id);
 
   if (father != NULL){
-    xbt_dict_set (father->children, typename, ret, NULL);
+    xbt_dict_set (father->children, key, ret, NULL);
   }
   return ret;
 }
 
-static type_t newContainerType (const char *typename, e_entity_types kind, type_t father)
-{
-  type_t ret = newType (typename, kind, father);
-//  if (father) INFO4("ContainerType %s(%s), child of %s(%s)", ret->name, ret->id, father->name, father->id);
-  if (father) pajeDefineContainerType(ret->id, ret->father->id, ret->name);
-  return ret;
-}
-
-static type_t newVariableType (const char *typename, e_entity_types kind, const char *color, type_t father)
-{
-  type_t ret = newType (typename, kind, father);
-//  INFO4("VariableType %s(%s), child of %s(%s)", ret->name, ret->id, father->name, father->id);
-  if (color){
-    pajeDefineVariableTypeWithColor(ret->id, ret->father->id, ret->name, color);
-  }else{
-    pajeDefineVariableType(ret->id, ret->father->id, ret->name);
-  }
-  return ret;
-}
-
-static type_t newLinkType (const char *typename, e_entity_types kind, type_t father, type_t source, type_t dest)
-{
-  type_t ret = newType (typename, kind, father);
-//  INFO8("LinkType %s(%s), child of %s(%s)  %s(%s)->%s(%s)", ret->name, ret->id, father->name, father->id, source->name, source->id, dest->name, dest->id);
-  pajeDefineLinkType(ret->id, ret->father->id, source->id, dest->id, ret->name);
-  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 getContainerType (const char *typename, type_t father)
 {
   type_t ret;
   if (father == NULL){
-    ret = newContainerType (typename, TYPE_CONTAINER, father);
+    ret = newType (typename, typename, TYPE_CONTAINER, father);
+    if (father) pajeDefineContainerType(ret->id, ret->father->id, ret->name);
     rootType = ret;
   }else{
     //check if my father type already has my typename
     ret = (type_t)xbt_dict_get_or_null (father->children, typename);
     if (ret == NULL){
-      ret = newContainerType (typename, TYPE_CONTAINER, father);
+      ret = newType (typename, typename, TYPE_CONTAINER, father);
+      pajeDefineContainerType(ret->id, ret->father->id, ret->name);
     }
   }
   return ret;
 }
 
-static type_t getVariableType (const char *typename, const char *color, type_t father)
+type_t getEventType (const char *typename, const char *color, type_t father)
 {
   type_t ret = xbt_dict_get_or_null (father->children, typename);
   if (ret == NULL){
-    ret = newVariableType (typename, TYPE_VARIABLE, color, father);
+    ret = newType (typename, typename, TYPE_EVENT, father);
+    //INFO4("EventType %s(%s), child of %s(%s)", ret->name, ret->id, father->name, father->id);
+    if (color){
+      pajeDefineEventTypeWithColor (ret->id, ret->father->id, ret->name, color);
+    }else{
+      pajeDefineEventType(ret->id, ret->father->id, ret->name);
+    }
   }
   return ret;
 }
 
-static type_t getLinkType (const char *typename, type_t father, type_t source, type_t dest)
+type_t getVariableType (const char *typename, const char *color, type_t father)
 {
   type_t ret = xbt_dict_get_or_null (father->children, typename);
   if (ret == NULL){
-    ret = newLinkType (typename, TYPE_LINK, father, source, dest);
+    ret = newType (typename, typename, TYPE_VARIABLE, father);
+    //INFO4("VariableType %s(%s), child of %s(%s)", ret->name, ret->id, father->name, father->id);
+    if (color){
+      pajeDefineVariableTypeWithColor(ret->id, ret->father->id, ret->name, color);
+    }else{
+      pajeDefineVariableType(ret->id, ret->father->id, ret->name);
+    }
+  }
+  return ret;
+}
+
+type_t getLinkType (const char *typename, type_t father, type_t source, type_t dest)
+{
+  //FIXME should check using source and dest here and not by the typename (g5k example)
+  char key[INSTR_DEFAULT_STR_SIZE];
+  snprintf (key, INSTR_DEFAULT_STR_SIZE, "%s-%s-%s", typename, source->id, dest->id);
+  type_t ret = xbt_dict_get_or_null (father->children, key);
+  if (ret == NULL){
+    ret = newType (typename, key, TYPE_LINK, father);
+    //INFO8("LinkType %s(%s), child of %s(%s)  %s(%s)->%s(%s)", ret->name, ret->id, father->name, father->id, source->name, source->id, dest->name, dest->id);
+    pajeDefineLinkType(ret->id, ret->father->id, source->id, dest->id, ret->name);
   }
   return ret;
 }
 
-static type_t getStateType (const char *typename, type_t father)
+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);
+    ret = newType (typename, typename, TYPE_STATE, 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;
 }
@@ -157,7 +151,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];
@@ -190,13 +184,16 @@ 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;
+      case INSTR_MSG_PROCESS: new->type = getContainerType ("MSG_PROCESS", new->father->type); break;
+      case INSTR_MSG_TASK: new->type = getContainerType ("MSG_TASK", new->father->type); break;
       default: xbt_die ("Congratulations, you have found a bug on newContainer function of instr_routing.c"); break;
     }
   }
   new->children = xbt_dict_new();
   if (new->father){
     xbt_dict_set(new->father->children, new->name, new, NULL);
-    pajeCreateContainer (0, new->id, new->type->id, new->father->id, new->name);
+    pajeCreateContainer (SIMIX_get_clock(), new->id, new->type->id, new->father->id, new->name);
   }
 
   //register hosts, routers, links containers
@@ -216,6 +213,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;
@@ -309,7 +362,7 @@ static void recursiveGraphExtraction (container_t container)
             (child2->kind == INSTR_HOST  || child2->kind == INSTR_ROUTER)){
 
           //getting route
-          xbt_dynar_t route;
+          xbt_dynar_t route = NULL;
           xbt_ex_t exception;
           TRY {
             route = global_routing->get_route (child_name1, child_name2);
@@ -334,7 +387,7 @@ static void recursiveGraphExtraction (container_t container)
 
           //getting route
           routing_component_t root = global_routing->root;
-          route_extended_t route;
+          route_extended_t route = NULL;
           xbt_ex_t exception;
           TRY {
             route = root->get_route (root, child_name1, child_name2);
@@ -366,28 +419,28 @@ static void recursiveGraphExtraction (container_t container)
 static void instr_routing_parse_start_AS ()
 {
   if (rootContainer == NULL){
-    currentContainer = xbt_dynar_new (sizeof(s_container_t), NULL);
+    currentContainer = xbt_dynar_new (sizeof(container_t), NULL);
     allContainers = xbt_dict_new ();
     allLinkTypes = xbt_dynar_new (sizeof(s_type_t), NULL);
     allHostTypes = xbt_dynar_new (sizeof(s_type_t), NULL);
 
     rootContainer = newContainer ("0", INSTR_AS, NULL);
-    xbt_dynar_push (currentContainer, rootContainer);
+    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_PROCESS", father->type);
+        container_t father = *(container_t*)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 father = *(container_t*)xbt_dynar_get_ptr(currentContainer, xbt_dynar_length(currentContainer)-1);
   container_t new = newContainer (A_surfxml_AS_id, INSTR_AS, father);
 
   //push
-  xbt_dynar_push (currentContainer, new);
+  xbt_dynar_push (currentContainer, &new);
 }
 
 static void instr_routing_parse_end_AS ()
@@ -397,7 +450,7 @@ static void instr_routing_parse_end_AS ()
 
 static void instr_routing_parse_start_link ()
 {
-  container_t father = xbt_dynar_get_ptr(currentContainer, xbt_dynar_length(currentContainer)-1);
+  container_t father = *(container_t*)xbt_dynar_get_ptr(currentContainer, xbt_dynar_length(currentContainer)-1);
   container_t new = newContainer (A_surfxml_link_id, INSTR_LINK, father);
 
   type_t bandwidth = getVariableType ("bandwidth", NULL, new->type);
@@ -415,7 +468,7 @@ static void instr_routing_parse_end_link ()
 
 static void instr_routing_parse_start_host ()
 {
-  container_t father = xbt_dynar_get_ptr(currentContainer, xbt_dynar_length(currentContainer)-1);
+  container_t father = *(container_t*)xbt_dynar_get_ptr(currentContainer, xbt_dynar_length(currentContainer)-1);
   container_t new = newContainer (A_surfxml_host_id, INSTR_HOST, father);
 
   type_t power = getVariableType ("power", NULL, new->type);
@@ -426,11 +479,23 @@ static void instr_routing_parse_start_host ()
 
   if (TRACE_smpi_is_enabled()) {
     if (TRACE_smpi_is_grouped()){
-      type_t mpi = getContainerType("MPI_PROCESS", new->type);
+      type_t mpi = getContainerType("MPI", new->type);
       getStateType ("MPI_STATE", mpi);
       getLinkType ("MPI_LINK", rootType, mpi, mpi);
     }
   }
+
+  if (TRACE_msg_process_is_enabled()) {
+    type_t msg_process = getContainerType("MSG_PROCESS", new->type);
+    getStateType ("MSG_PROCESS_STATE", msg_process);
+    getLinkType ("MSG_PROCESS_LINK", rootType, msg_process, msg_process);
+  }
+
+  if (TRACE_msg_task_is_enabled()) {
+    type_t msg_task = getContainerType ("MSG_TASK", new->type);
+    getStateType ("MSG_TASK_STATE", msg_task);
+    getLinkType ("MSG_TASK_LINK", rootType, msg_task, msg_task);
+  }
 }
 
 static void instr_routing_parse_end_host ()
@@ -439,7 +504,7 @@ static void instr_routing_parse_end_host ()
 
 static void instr_routing_parse_start_router ()
 {
-  container_t father = xbt_dynar_get_ptr(currentContainer, xbt_dynar_length(currentContainer)-1);
+  container_t father = *(container_t*)xbt_dynar_get_ptr(currentContainer, xbt_dynar_length(currentContainer)-1);
   newContainer (A_surfxml_router_id, INSTR_ROUTER, father);
 }
 
@@ -449,6 +514,7 @@ static void instr_routing_parse_end_router ()
 
 static void instr_routing_parse_end_platform ()
 {
+  xbt_dynar_free(&currentContainer);
   currentContainer = NULL;
   recursiveGraphExtraction (rootContainer);
   platform_created = 1;
@@ -491,14 +557,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)