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/surfxml_parse_private.h"
12 XBT_LOG_NEW_DEFAULT_SUBCATEGORY (instr_routing, instr, "Tracing platform hierarchy");
14 extern routing_global_t global_routing; /* from surf/surf_routing.c */
15 extern xbt_dict_t defined_types; /* from instr_interface.c */
17 typedef struct s_container *container_t;
18 typedef struct s_container {
22 struct s_container *father;
26 static container_t rootContainer = NULL;
27 static xbt_dynar_t currentContainer = NULL;
28 static xbt_dict_t created_links = NULL;
29 static xbt_dict_t created_hosts = NULL;
30 xbt_dict_t hosts_types = NULL;
31 xbt_dict_t links_types = NULL;
33 static void instr_routing_parse_start_AS (void);
34 static void instr_routing_parse_end_AS (void);
35 static void instr_routing_parse_start_link (void);
36 static void instr_routing_parse_end_link (void);
37 static void instr_routing_parse_start_host (void);
38 static void instr_routing_parse_end_host (void);
39 static void instr_routing_parse_start_router (void);
40 static void instr_routing_parse_end_router (void);
41 static char *instr_AS_type (int level);
43 static char *instr_AS_type (int level)
45 char *ret = xbt_new (char, INSTR_DEFAULT_STR_SIZE);
47 snprintf (ret, INSTR_DEFAULT_STR_SIZE, "0");
49 snprintf (ret, INSTR_DEFAULT_STR_SIZE, "L%d", level);
54 static void newContainerType (const char *type, const char *parentType, const char *name)
56 char *defined = xbt_dict_get_or_null (defined_types, type);
58 pajeDefineContainerType(type, parentType, name);
59 xbt_dict_set(defined_types, type, xbt_strdup("1"), xbt_free);
64 static void newVariableType (const char *type, const char *parentType, const char *name, const char *color)
66 char *defined = xbt_dict_get_or_null (defined_types, type);
69 pajeDefineVariableTypeWithColor(type, parentType, name, color);
71 pajeDefineVariableType(type, parentType, name);
73 xbt_dict_set(defined_types, type, xbt_strdup("1"), xbt_free);
77 void instr_routing_define_callbacks ()
79 if (!TRACE_is_active())
81 surfxml_add_callback(STag_surfxml_AS_cb_list, &instr_routing_parse_start_AS);
82 surfxml_add_callback(ETag_surfxml_AS_cb_list, &instr_routing_parse_end_AS);
83 surfxml_add_callback(STag_surfxml_link_cb_list, &instr_routing_parse_start_link);
84 surfxml_add_callback(ETag_surfxml_link_cb_list, &instr_routing_parse_end_link);
85 surfxml_add_callback(STag_surfxml_host_cb_list, &instr_routing_parse_start_host);
86 surfxml_add_callback(ETag_surfxml_host_cb_list, &instr_routing_parse_end_host);
87 surfxml_add_callback(STag_surfxml_router_cb_list, &instr_routing_parse_start_router);
88 surfxml_add_callback(ETag_surfxml_router_cb_list, &instr_routing_parse_end_router);
92 static container_t newContainer (const char *name, const char *type, const char *typename)
94 container_t newContainer = xbt_new0(s_container_t, 1);
95 newContainer->name = xbt_strdup (name);
96 newContainer->father = xbt_dynar_get_ptr(currentContainer, xbt_dynar_length(currentContainer)-1);
97 newContainer->level = newContainer->father->level+1;
98 newContainer->type = xbt_strdup (type);
99 newContainer->children = xbt_dict_new();
100 xbt_dict_set(newContainer->father->children, newContainer->name, newContainer, NULL);
102 newContainerType (newContainer->type, newContainer->father->type, typename);
103 pajeCreateContainer (0, newContainer->name, newContainer->type, newContainer->father->name, newContainer->name);
108 static void recursiveDestroyContainer (container_t container)
110 xbt_dict_cursor_t cursor = NULL;
113 xbt_dict_foreach(container->children, cursor, child_name, child) {
114 recursiveDestroyContainer (child);
117 pajeDestroyContainer(SIMIX_get_clock(), container->type, container->name);
119 xbt_free (container->name);
120 xbt_free (container->type);
121 xbt_free (container->children);
122 xbt_free (container);
129 static void instr_routing_parse_start_AS ()
131 if (rootContainer == NULL){
132 rootContainer = xbt_new0(s_container_t, 1);
133 rootContainer->name = xbt_strdup ("0");
134 rootContainer->type = xbt_strdup ("0");
135 rootContainer->level = 0;
136 rootContainer->father = NULL;
137 rootContainer->children = xbt_dict_new();
139 currentContainer = xbt_dynar_new (sizeof(s_container_t), NULL);
140 xbt_dynar_push (currentContainer, rootContainer);
142 created_links = xbt_dict_new ();
143 created_hosts = xbt_dict_new ();
144 hosts_types = xbt_dict_new ();
145 links_types = xbt_dict_new ();
148 container_t newContainer = xbt_new0(s_container_t, 1);
149 newContainer->name = xbt_strdup (A_surfxml_AS_id);
150 newContainer->father = xbt_dynar_get_ptr(currentContainer, xbt_dynar_length(currentContainer)-1);
151 newContainer->level = newContainer->father->level+1;
152 newContainer->type = instr_AS_type (newContainer->level);
153 newContainer->children = xbt_dict_new();
154 xbt_dict_set(newContainer->father->children, newContainer->name, newContainer, NULL);
157 newContainerType (newContainer->type, newContainer->father->type, newContainer->type);
158 pajeCreateContainer (0, newContainer->name, newContainer->type, newContainer->father->name, newContainer->name);
161 xbt_dynar_push (currentContainer, newContainer);
164 static void instr_routing_parse_end_AS ()
166 xbt_dynar_pop_ptr (currentContainer);
169 static void instr_routing_parse_start_link ()
171 container_t father = xbt_dynar_get_ptr(currentContainer, xbt_dynar_length(currentContainer)-1);
172 char type[INSTR_DEFAULT_STR_SIZE];
173 snprintf (type, INSTR_DEFAULT_STR_SIZE, "LINK-%s", father->type);
174 container_t new = newContainer (A_surfxml_link_id, type, "LINK");
176 //bandwidth and latency
177 char bandwidth_type[INSTR_DEFAULT_STR_SIZE], latency_type[INSTR_DEFAULT_STR_SIZE];
178 snprintf (bandwidth_type, INSTR_DEFAULT_STR_SIZE, "bandwidth-%s", type);
179 snprintf (latency_type, INSTR_DEFAULT_STR_SIZE, "latency-%s", type);
180 newVariableType (bandwidth_type, type, "bandwidth", NULL);
181 newVariableType (latency_type, type, "latency", NULL);
182 pajeSetVariable(0, bandwidth_type, new->name, A_surfxml_link_bandwidth);
183 pajeSetVariable(0, latency_type, new->name, A_surfxml_link_latency);
185 if (TRACE_uncategorized()){
187 char bandwidth_used_type[INSTR_DEFAULT_STR_SIZE];
188 snprintf (bandwidth_used_type, INSTR_DEFAULT_STR_SIZE, "bandwidth_used-%s", type);
189 newVariableType (bandwidth_used_type, type, "bandwidth_used", "0.5 0.5 0.5");
192 //register created link on the dictionary
193 xbt_dict_set (created_links, A_surfxml_link_id, new, NULL);
195 //register this link type
196 xbt_dict_set (links_types, type, xbt_strdup("1"), xbt_free);
199 static void instr_routing_parse_end_link ()
203 static void instr_routing_parse_start_host ()
205 container_t father = xbt_dynar_get_ptr(currentContainer, xbt_dynar_length(currentContainer)-1);
206 char type[INSTR_DEFAULT_STR_SIZE];
207 snprintf (type, INSTR_DEFAULT_STR_SIZE, "HOST-%s", father->type);
208 container_t new = newContainer (A_surfxml_host_id, type, "HOST");
211 char power_type[INSTR_DEFAULT_STR_SIZE];
212 snprintf (power_type, INSTR_DEFAULT_STR_SIZE, "power-%s", type);
213 newVariableType (power_type, type, "power", NULL);
214 pajeSetVariable(0, power_type, new->name, A_surfxml_host_power);
216 if (TRACE_uncategorized()){
218 char power_used_type[INSTR_DEFAULT_STR_SIZE];
219 snprintf (power_used_type, INSTR_DEFAULT_STR_SIZE, "power_used-%s", type);
220 newVariableType (power_used_type, type, "power_used", "0.5 0.5 0.5");
223 //register created host on the dictionary
224 xbt_dict_set (created_hosts, A_surfxml_host_id, new, NULL);
226 //register this link type
227 xbt_dict_set (hosts_types, type, xbt_strdup("1"), xbt_free);
230 static void instr_routing_parse_end_host ()
234 static void instr_routing_parse_start_router ()
236 container_t father = xbt_dynar_get_ptr(currentContainer, xbt_dynar_length(currentContainer)-1);
237 char type[INSTR_DEFAULT_STR_SIZE];
238 snprintf (type, INSTR_DEFAULT_STR_SIZE, "ROUTER-%s", father->type);
239 newContainer (A_surfxml_router_id, type, "ROUTER");
242 static void instr_routing_parse_end_router ()
249 int instr_link_is_traced (const char *name)
251 if (xbt_dict_get_or_null(created_links, name)) {
258 char *instr_link_type (const char *name)
260 container_t created_link = xbt_dict_get_or_null(created_links, name);
262 return created_link->type;
269 char *instr_host_type (const char *name)
271 container_t created_host = xbt_dict_get_or_null(created_hosts, name);
273 return created_host->type;
279 void instr_destroy_platform ()
281 if (rootContainer) recursiveDestroyContainer (rootContainer);
284 #endif /* HAVE_TRACING */