X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/f34a151765f71a67195058a01e2dd96d7ddb8416..73fc9f6b6089d7cb8a76dcf5a015e105943c1df5:/src/instr/instr_routing.c?ds=sidebyside diff --git a/src/instr/instr_routing.c b/src/instr/instr_routing.c index 1c5deabba3..42dfda5caa 100644 --- a/src/instr/instr_routing.c +++ b/src/instr/instr_routing.c @@ -14,39 +14,6 @@ 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 */ @@ -118,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; @@ -152,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()) @@ -173,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]; @@ -183,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; @@ -212,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; } } @@ -238,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; @@ -396,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); @@ -437,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 () @@ -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)