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 */
static xbt_dynar_t currentContainer = NULL; /* push and pop, used only in creation */
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;
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())
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;
default: xbt_die ("Congratulations, you have found a bug on newContainer function of instr_routing.c"); break;
}
}
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;
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);
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 ()
{
currentContainer = NULL;
recursiveGraphExtraction (rootContainer);
+ platform_created = 1;
}
/*
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)
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;
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;
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;
recursiveNewUserHostVariableType (new_typename, color, rootType);
}
+int instr_platform_traced ()
+{
+ return platform_created;
+}
+
#endif /* HAVE_TRACING */