X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/ed935dc6e47a480300874a79c2cbe96b4159b94c..b857f66adac2e677a8a2642afe500e9a5f19e474:/src/instr/instr_routing.c diff --git a/src/instr/instr_routing.c b/src/instr/instr_routing.c index b6c5028ab8..bc53ae6e51 100644 --- a/src/instr/instr_routing.c +++ b/src/instr/instr_routing.c @@ -57,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); @@ -65,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); @@ -77,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); @@ -85,7 +97,7 @@ 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 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); @@ -109,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); @@ -157,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]; @@ -190,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 @@ -216,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; @@ -309,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); @@ -334,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); @@ -377,7 +457,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); } @@ -426,11 +506,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 () @@ -491,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)