X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/9371d0958b1cb03eb1ad4ccc8d2ba04416b4fd28..b10b1f5a348a190fe1e1809ee6d65a03c7b1df06:/src/instr/instr_routing.c diff --git a/src/instr/instr_routing.c b/src/instr/instr_routing.c index 3ed7eed7b0..bc53ae6e51 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 */ @@ -90,7 +57,7 @@ static type_t newType (const char *typename, e_entity_types kind, type_t father) return ret; } -static type_t newContainerType (const char *typename, e_entity_types kind, type_t father) +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); @@ -98,7 +65,19 @@ static type_t newContainerType (const char *typename, e_entity_types kind, type_ return ret; } -static type_t newVariableType (const char *typename, e_entity_types kind, const char *color, type_t father) +type_t newEventType (const char *typename, e_entity_types kind, const char *color, type_t father) +{ + type_t ret = newType (typename, kind, 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; +} + +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); @@ -110,7 +89,7 @@ static type_t newVariableType (const char *typename, e_entity_types kind, const return ret; } -static type_t newLinkType (const char *typename, e_entity_types kind, type_t father, type_t source, type_t dest) +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); @@ -118,6 +97,14 @@ static type_t newLinkType (const char *typename, e_entity_types kind, type_t fat return ret; } +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; @@ -134,6 +121,15 @@ static type_t getContainerType (const char *typename, type_t father) return ret; } +static 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 = newEventType (typename, TYPE_EVENT, color, father); + } + return ret; +} + static type_t getVariableType (const char *typename, const char *color, type_t father) { type_t ret = xbt_dict_get_or_null (father->children, typename); @@ -152,6 +148,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 +178,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 +188,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,13 +211,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 @@ -238,6 +240,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; @@ -331,7 +389,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); @@ -356,7 +414,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); @@ -396,6 +454,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 +503,26 @@ 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); + } + } + + 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 () @@ -497,14 +583,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) @@ -534,7 +613,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; @@ -552,7 +631,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; @@ -571,7 +650,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;