1 /* Copyright (c) 2010. The SimGrid Team.
2 * All rights reserved. */
4 /* This program is free software; you can redistribute it and/or modify it
5 * under the terms of the license (GNU LGPL) which comes with this package. */
7 #include "instr/instr_private.h"
10 #include "surf/surf_private.h"
12 XBT_LOG_NEW_DEFAULT_SUBCATEGORY (instr_routing, instr, "Tracing platform hierarchy");
14 extern xbt_dict_t defined_types; /* from instr_interface.c */
16 typedef struct s_container *container_t;
17 typedef struct s_container {
18 char *name; /* Unique id of this container */
19 char *type; /* Type of this container */
20 int level; /* Level in the hierarchy, root level is 0 */
21 struct s_container *father;
25 static container_t rootContainer = NULL; /* the root container */
26 static xbt_dynar_t currentContainer = NULL; /* push and pop, used only in creation */
27 static xbt_dict_t allContainers = NULL; /* all created containers indexed by name */
28 xbt_dict_t hosts_types = NULL;
29 xbt_dict_t links_types = NULL;
31 static void instr_routing_parse_start_AS (void);
32 static void instr_routing_parse_end_AS (void);
33 static void instr_routing_parse_start_link (void);
34 static void instr_routing_parse_end_link (void);
35 static void instr_routing_parse_start_host (void);
36 static void instr_routing_parse_end_host (void);
37 static void instr_routing_parse_start_router (void);
38 static void instr_routing_parse_end_router (void);
39 static void instr_routing_parse_end_platform (void);
40 static char *instr_AS_type (int level);
42 static char *instr_AS_type (int level)
44 char *ret = xbt_new (char, INSTR_DEFAULT_STR_SIZE);
46 snprintf (ret, INSTR_DEFAULT_STR_SIZE, "0");
48 snprintf (ret, INSTR_DEFAULT_STR_SIZE, "L%d", level);
53 static void newContainerType (const char *type, const char *parentType, const char *name)
55 char *defined = xbt_dict_get_or_null (defined_types, type);
57 pajeDefineContainerType(type, parentType, name);
58 xbt_dict_set(defined_types, type, xbt_strdup("1"), xbt_free);
63 static void newVariableType (const char *type, const char *parentType, const char *name, const char *color)
65 char *defined = xbt_dict_get_or_null (defined_types, type);
68 pajeDefineVariableTypeWithColor(type, parentType, name, color);
70 pajeDefineVariableType(type, parentType, name);
72 xbt_dict_set(defined_types, type, xbt_strdup("1"), xbt_free);
76 static void newLinkType (const char *type, const char *parentType, const char *sourceType, const char *destType, const char *name)
78 char *defined = xbt_dict_get_or_null (defined_types, type);
80 pajeDefineLinkType(type, parentType, sourceType, destType, name);
81 xbt_dict_set(defined_types, type, xbt_strdup("1"), xbt_free);
85 void instr_routing_define_callbacks ()
87 if (!TRACE_is_active())
89 surfxml_add_callback(STag_surfxml_AS_cb_list, &instr_routing_parse_start_AS);
90 surfxml_add_callback(ETag_surfxml_AS_cb_list, &instr_routing_parse_end_AS);
91 surfxml_add_callback(STag_surfxml_link_cb_list, &instr_routing_parse_start_link);
92 surfxml_add_callback(ETag_surfxml_link_cb_list, &instr_routing_parse_end_link);
93 surfxml_add_callback(STag_surfxml_host_cb_list, &instr_routing_parse_start_host);
94 surfxml_add_callback(ETag_surfxml_host_cb_list, &instr_routing_parse_end_host);
95 surfxml_add_callback(STag_surfxml_router_cb_list, &instr_routing_parse_start_router);
96 surfxml_add_callback(ETag_surfxml_router_cb_list, &instr_routing_parse_end_router);
97 surfxml_add_callback(ETag_surfxml_platform_cb_list, &instr_routing_parse_end_platform);
101 static container_t newContainer (const char *name, const char *type, const char *typename)
103 container_t newContainer = xbt_new0(s_container_t, 1);
104 newContainer->name = xbt_strdup (name);
105 newContainer->father = xbt_dynar_get_ptr(currentContainer, xbt_dynar_length(currentContainer)-1);
106 newContainer->level = newContainer->father->level+1;
107 newContainer->type = xbt_strdup (type);
108 newContainer->children = xbt_dict_new();
109 xbt_dict_set(newContainer->father->children, newContainer->name, newContainer, NULL);
111 newContainerType (newContainer->type, newContainer->father->type, typename);
112 pajeCreateContainer (0, newContainer->name, newContainer->type, newContainer->father->name, newContainer->name);
117 static void recursiveDestroyContainer (container_t container)
119 xbt_dict_cursor_t cursor = NULL;
122 xbt_dict_foreach(container->children, cursor, child_name, child) {
123 recursiveDestroyContainer (child);
126 pajeDestroyContainer(SIMIX_get_clock(), container->type, container->name);
128 xbt_free (container->name);
129 xbt_free (container->type);
130 xbt_free (container->children);
131 xbt_free (container);
138 static void instr_routing_parse_start_AS ()
140 if (rootContainer == NULL){
141 rootContainer = xbt_new0(s_container_t, 1);
142 rootContainer->name = xbt_strdup ("0");
143 rootContainer->type = xbt_strdup ("0");
144 rootContainer->level = 0;
145 rootContainer->father = NULL;
146 rootContainer->children = xbt_dict_new();
148 currentContainer = xbt_dynar_new (sizeof(s_container_t), NULL);
149 xbt_dynar_push (currentContainer, rootContainer);
151 allContainers = xbt_dict_new ();
152 hosts_types = xbt_dict_new ();
153 links_types = xbt_dict_new ();
156 container_t newContainer = xbt_new0(s_container_t, 1);
157 newContainer->name = xbt_strdup (A_surfxml_AS_id);
158 newContainer->father = xbt_dynar_get_ptr(currentContainer, xbt_dynar_length(currentContainer)-1);
159 newContainer->level = newContainer->father->level+1;
160 newContainer->type = instr_AS_type (newContainer->level);
161 newContainer->children = xbt_dict_new();
162 xbt_dict_set(newContainer->father->children, newContainer->name, newContainer, NULL);
165 newContainerType (newContainer->type, newContainer->father->type, newContainer->type);
166 pajeCreateContainer (0, newContainer->name, newContainer->type, newContainer->father->name, newContainer->name);
169 xbt_dynar_push (currentContainer, newContainer);
172 static void instr_routing_parse_end_AS ()
174 xbt_dynar_pop_ptr (currentContainer);
177 static void instr_routing_parse_start_link ()
179 container_t father = xbt_dynar_get_ptr(currentContainer, xbt_dynar_length(currentContainer)-1);
180 char type[INSTR_DEFAULT_STR_SIZE];
181 snprintf (type, INSTR_DEFAULT_STR_SIZE, "LINK-%s", father->type);
182 container_t new = newContainer (A_surfxml_link_id, type, "LINK");
184 //bandwidth and latency
185 char bandwidth_type[INSTR_DEFAULT_STR_SIZE], latency_type[INSTR_DEFAULT_STR_SIZE];
186 snprintf (bandwidth_type, INSTR_DEFAULT_STR_SIZE, "bandwidth-%s", type);
187 snprintf (latency_type, INSTR_DEFAULT_STR_SIZE, "latency-%s", type);
188 newVariableType (bandwidth_type, type, "bandwidth", NULL);
189 newVariableType (latency_type, type, "latency", NULL);
190 pajeSetVariable(0, bandwidth_type, new->name, A_surfxml_link_bandwidth);
191 pajeSetVariable(0, latency_type, new->name, A_surfxml_link_latency);
193 if (TRACE_uncategorized()){
195 char bandwidth_used_type[INSTR_DEFAULT_STR_SIZE];
196 snprintf (bandwidth_used_type, INSTR_DEFAULT_STR_SIZE, "bandwidth_used-%s", type);
197 newVariableType (bandwidth_used_type, type, "bandwidth_used", "0.5 0.5 0.5");
200 //register created link on the dictionary
201 xbt_dict_set (allContainers, A_surfxml_link_id, new, NULL);
203 //register this link type
204 xbt_dict_set (links_types, type, xbt_strdup("1"), xbt_free);
207 static void instr_routing_parse_end_link ()
211 static void instr_routing_parse_start_host ()
213 container_t father = xbt_dynar_get_ptr(currentContainer, xbt_dynar_length(currentContainer)-1);
214 char type[INSTR_DEFAULT_STR_SIZE];
215 snprintf (type, INSTR_DEFAULT_STR_SIZE, "HOST-%s", father->type);
216 container_t new = newContainer (A_surfxml_host_id, type, "HOST");
219 char power_type[INSTR_DEFAULT_STR_SIZE];
220 snprintf (power_type, INSTR_DEFAULT_STR_SIZE, "power-%s", type);
221 newVariableType (power_type, type, "power", NULL);
222 pajeSetVariable(0, power_type, new->name, A_surfxml_host_power);
224 if (TRACE_uncategorized()){
226 char power_used_type[INSTR_DEFAULT_STR_SIZE];
227 snprintf (power_used_type, INSTR_DEFAULT_STR_SIZE, "power_used-%s", type);
228 newVariableType (power_used_type, type, "power_used", "0.5 0.5 0.5");
231 //register created host on the dictionary
232 xbt_dict_set (allContainers, A_surfxml_host_id, new, NULL);
234 //register this link type
235 xbt_dict_set (hosts_types, type, xbt_strdup("1"), xbt_free);
238 static void instr_routing_parse_end_host ()
242 static void instr_routing_parse_start_router ()
244 container_t father = xbt_dynar_get_ptr(currentContainer, xbt_dynar_length(currentContainer)-1);
245 char type[INSTR_DEFAULT_STR_SIZE];
246 snprintf (type, INSTR_DEFAULT_STR_SIZE, "ROUTER-%s", father->type);
247 container_t new = newContainer (A_surfxml_router_id, type, "ROUTER");
249 //register created host on the dictionary
250 xbt_dict_set (allContainers, A_surfxml_router_id, new, NULL);
253 static void instr_routing_parse_end_router ()
257 static void instr_routing_parse_end_platform ()
259 currentContainer = NULL;
265 int instr_link_is_traced (const char *name)
267 if (((container_t)xbt_dict_get_or_null (allContainers, name))){
274 char *instr_link_type (const char *name)
276 return ((container_t)xbt_dict_get (allContainers, name))->type;
279 char *instr_host_type (const char *name)
281 return ((container_t)xbt_dict_get (allContainers, name))->type;
284 void instr_destroy_platform ()
286 if (rootContainer) recursiveDestroyContainer (rootContainer);
289 #endif /* HAVE_TRACING */