- }else{
- //otherwise, the name is its kind
- switch (new->kind){
- 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;
- }
- }
- 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);
- }
-
- //register hosts, routers, links containers
- if (new->kind == INSTR_HOST || new->kind == INSTR_LINK || new->kind == INSTR_ROUTER) {
- xbt_dict_set (allContainers, new->name, new, NULL);
- }
-
- //register the host container types
- if (new->kind == INSTR_HOST){
- xbt_dynar_push_as (allHostTypes, type_t, new->type);
- }
-
- //register the link container types
- if (new->kind == INSTR_LINK){
- xbt_dynar_push_as(allLinkTypes, type_t, new->type);
- }
- 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;
-
- xbt_dict_cursor_t cursor = NULL;
- container_t child;
- char *child_name;
- xbt_dict_foreach(root->children, cursor, child_name, child) {
- if (findChild (child, a1)) return child;
- }
- return NULL;
-}
-
-static container_t findCommonFather (container_t root, container_t a1, container_t a2)
-{
- if (a1->father == a2->father) return a1->father;
-
- xbt_dict_cursor_t cursor = NULL;
- container_t child;
- char *child_name;
- container_t a1_try = NULL;
- container_t a2_try = NULL;
- xbt_dict_foreach(root->children, cursor, child_name, child) {
- a1_try = findChild (child, a1);
- a2_try = findChild (child, a2);
- if (a1_try && a2_try) return child;