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);
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);
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);
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);
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);
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];
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;
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
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;
(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);
//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);
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);
}
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 ()
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)