X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/2b3736489a8c3dba235f2540674f363a977054bf..73fc9f6b6089d7cb8a76dcf5a015e105943c1df5:/src/instr/instr_routing.c?ds=sidebyside diff --git a/src/instr/instr_routing.c b/src/instr/instr_routing.c index 5b81546a14..42dfda5caa 100644 --- a/src/instr/instr_routing.c +++ b/src/instr/instr_routing.c @@ -157,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]; @@ -167,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; @@ -196,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; } } @@ -222,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; @@ -383,7 +434,7 @@ static void instr_routing_parse_start_AS () 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); + type_t mpi = getContainerType("MPI", father->type); getStateType ("MPI_STATE", mpi); getLinkType ("MPI_LINK", rootType, mpi, mpi); } @@ -432,7 +483,7 @@ 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); } @@ -497,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)