Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[trace] interface cosmetics: removing pre-processor defines, substitute by function...
[simgrid.git] / src / instr / instr_interface.c
1 /* Copyright (c) 2010. The SimGrid Team.
2  * All rights reserved.                                                     */
3
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. */
6
7 #include "simgrid_config.h"
8
9 #ifdef HAVE_TRACING
10
11 #include "instr/instr_private.h"
12 #include "surf/network_private.h"
13
14 typedef enum {
15   INSTR_US_DECLARE,
16   INSTR_US_SET,
17   INSTR_US_ADD,
18   INSTR_US_SUB,
19 } InstrUserVariable;
20
21 XBT_LOG_NEW_DEFAULT_SUBCATEGORY (instr_api, instr, "API");
22
23 void TRACE_category(const char *category)
24 {
25   TRACE_category_with_color (category, NULL);
26 }
27
28 void TRACE_category_with_color (const char *category, const char *color)
29 {
30   if (!(TRACE_is_active() && category != NULL))
31     return;
32
33   xbt_assert (instr_platform_traced(),
34       "%s must be called after environment creation", __FUNCTION__);
35
36   //check if category is already created
37   char *created = xbt_dict_get_or_null(created_categories, category);
38   if (created) return;
39   xbt_dict_set (created_categories, category, xbt_strdup("1"), xbt_free);
40
41   //define final_color
42   char final_color[INSTR_DEFAULT_STR_SIZE];
43   if (!color){
44     //generate a random color
45     double red = drand48();
46     double green = drand48();
47     double blue = drand48();
48     snprintf (final_color, INSTR_DEFAULT_STR_SIZE, "%f %f %f", red, green, blue);
49   }else{
50     snprintf (final_color, INSTR_DEFAULT_STR_SIZE, "%s", color);
51   }
52
53   XBT_DEBUG("CAT,declare %s, %s", category, final_color);
54
55   //define the type of this category on top of hosts and links
56   if (TRACE_categorized ()){
57     instr_new_variable_type (category, final_color);
58   }
59 }
60
61 void TRACE_declare_mark(const char *mark_type)
62 {
63   if (!TRACE_is_active())
64     return;
65   if (!mark_type)
66     return;
67
68   XBT_DEBUG("MARK,declare %s", mark_type);
69   getEventType(mark_type, NULL, getRootType());
70 }
71
72 void TRACE_mark(const char *mark_type, const char *mark_value)
73 {
74   if (!TRACE_is_active())
75     return;
76   if (!mark_type || !mark_value)
77     return;
78
79   XBT_DEBUG("MARK %s %s", mark_type, mark_value);
80   type_t type = getEventType (mark_type, NULL, getRootContainer()->type);
81   val_t value = getValue (mark_value, NULL, type);
82   new_pajeNewEvent (MSG_get_clock(), getRootContainer(), type, value);
83 }
84
85 static void instr_user_variable(double time,
86                          const char *resource,
87                          const char *variable,
88                          const char *father_type,
89                          double value,
90                          InstrUserVariable what)
91 {
92   if (!TRACE_is_active())
93     return;
94
95   xbt_assert (instr_platform_traced(),
96       "%s must be called after environment creation", __FUNCTION__);
97
98   char valuestr[100];
99   snprintf(valuestr, 100, "%g", value);
100
101   switch (what){
102   case INSTR_US_DECLARE:
103     instr_new_user_variable_type (father_type, variable, NULL);
104     break;
105   case INSTR_US_SET:
106   {
107     container_t container = getContainerByName(resource);
108     type_t type = getVariableType (variable, NULL, container->type);
109     new_pajeSetVariable(time, container, type, value);
110     break;
111   }
112   case INSTR_US_ADD:
113   {
114     container_t container = getContainerByName(resource);
115     type_t type = getVariableType (variable, NULL, container->type);
116     new_pajeAddVariable(time, container, type, value);
117     break;
118   }
119   case INSTR_US_SUB:
120   {
121     container_t container = getContainerByName(resource);
122     type_t type = getVariableType (variable, NULL, container->type);
123     new_pajeSubVariable(time, container, type, value);
124     break;
125   }
126   default:
127     //TODO: launch exception
128     break;
129   }
130 }
131
132 static void instr_user_srcdst_variable(double time,
133                               const char *src,
134                               const char *dst,
135                               const char *variable,
136                               const char *father_type,
137                               double value,
138                               InstrUserVariable what)
139 {
140   xbt_dynar_t route = global_routing->get_route (src, dst);
141   unsigned int i;
142   void *link;
143   xbt_dynar_foreach (route, i, link) {
144     char *link_name = ((link_CM02_t)link)->lmm_resource.generic_resource.name;
145     instr_user_variable (time, link_name, variable, father_type, value, what);
146   }
147 }
148
149 const char *TRACE_node_name (xbt_node_t node)
150 {
151   void *data = xbt_graph_node_get_data(node);
152   char *str = (char*)data;
153   return str;
154 }
155
156 xbt_graph_t TRACE_platform_graph (void)
157 {
158   if (!TRACE_is_active())
159     return NULL;
160
161   return instr_routing_platform_graph ();
162 }
163
164 void TRACE_platform_graph_export_graphviz (xbt_graph_t g, const char *filename)
165 {
166   instr_routing_platform_graph_export_graphviz (g, filename);
167 }
168
169
170 /*
171  * Derived functions that use instr_user_variable and TRACE_user_srcdst_variable.
172  * They were previously defined as pre-processors directives, but were transformed
173  * into functions so the user can track them using gdb.
174  */
175
176 /* for host variables */
177 void TRACE_host_variable_declare (const char *var)
178 {
179   instr_user_variable(0, NULL, var, "HOST", 0, INSTR_US_DECLARE);
180 }
181
182 void TRACE_host_variable_set (const char *host, const char *variable, double value)
183 {
184   TRACE_host_variable_set_with_time (MSG_get_clock(), host, variable, value);
185 }
186
187 void TRACE_host_variable_add (const char *host, const char *variable, double value)
188 {
189   TRACE_host_variable_add_with_time (MSG_get_clock(), host, variable, value);
190 }
191
192 void TRACE_host_variable_sub (const char *host, const char *variable, double value)
193 {
194   TRACE_host_variable_sub_with_time (MSG_get_clock(), host, variable, value);
195 }
196
197 void TRACE_host_variable_set_with_time (double time, const char *host, const char *variable, double value)
198 {
199   instr_user_variable(time, host, variable, "HOST", value, INSTR_US_SET);
200 }
201
202 void TRACE_host_variable_add_with_time (double time, const char *host, const char *variable, double value)
203 {
204   instr_user_variable(time, host, variable, "HOST", value, INSTR_US_ADD);
205 }
206
207 void TRACE_host_variable_sub_with_time (double time, const char *host, const char *variable, double value)
208 {
209   instr_user_variable(time, host, variable, "HOST", value, INSTR_US_SUB);
210 }
211
212 /* for link variables */
213 void TRACE_link_variable_declare (const char *var)
214 {
215   instr_user_variable (0, NULL, var, "LINK", 0, INSTR_US_DECLARE);
216 }
217
218 void TRACE_link_variable_set (const char *link, const char *variable, double value)
219 {
220   TRACE_link_variable_set_with_time (MSG_get_clock(), link, variable, value);
221 }
222
223 void TRACE_link_variable_add (const char *link, const char *variable, double value)
224 {
225   TRACE_link_variable_add_with_time (MSG_get_clock(), link, variable, value);
226 }
227
228 void TRACE_link_variable_sub (const char *link, const char *variable, double value)
229 {
230   TRACE_link_variable_sub_with_time (MSG_get_clock(), link, variable, value);
231 }
232
233 void TRACE_link_variable_set_with_time (double time, const char *link, const char *variable, double value)
234 {
235   instr_user_variable (time, link, variable, "LINK", value, INSTR_US_SET);
236 }
237
238 void TRACE_link_variable_add_with_time (double time, const char *link, const char *variable, double value)
239 {
240   instr_user_variable (time, link, variable, "LINK", value, INSTR_US_ADD);
241 }
242
243 void TRACE_link_variable_sub_with_time (double time, const char *link, const char *variable, double value)
244 {
245   instr_user_variable (time, link, variable, "LINK", value, INSTR_US_SUB);
246 }
247
248 /* for link variables, but with src and dst used for get_route */
249 void TRACE_link_srcdst_variable_set (const char *src, const char *dst, const char *variable, double value)
250 {
251   TRACE_link_srcdst_variable_set_with_time (MSG_get_clock(), src, dst, variable, value);
252 }
253
254 void TRACE_link_srcdst_variable_add (const char *src, const char *dst, const char *variable, double value)
255 {
256   TRACE_link_srcdst_variable_add_with_time (MSG_get_clock(), src, dst, variable, value);
257 }
258
259 void TRACE_link_srcdst_variable_sub (const char *src, const char *dst, const char *variable, double value)
260 {
261   TRACE_link_srcdst_variable_sub_with_time (MSG_get_clock(), src, dst, variable, value);
262 }
263
264 void TRACE_link_srcdst_variable_set_with_time (double time, const char *src, const char *dst, const char *variable, double value)
265 {
266   instr_user_srcdst_variable (time, src, dst, variable, "LINK", value, INSTR_US_SET);
267 }
268
269 void TRACE_link_srcdst_variable_add_with_time (double time, const char *src, const char *dst, const char *variable, double value)
270 {
271   instr_user_srcdst_variable (time, src, dst, variable, "LINK", value, INSTR_US_ADD);
272 }
273
274 void TRACE_link_srcdst_variable_sub_with_time (double time, const char *src, const char *dst, const char *variable, double value)
275 {
276   instr_user_srcdst_variable (time, src, dst, variable, "LINK", value, INSTR_US_SUB);
277 }
278
279 #endif /* HAVE_TRACING */