Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
first change to have hierarchical class - definecontainertype
[simgrid.git] / src / instr / instr_trace.cpp
1 /* Copyright (c) 2010-2015. 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 "src/instr/instr_private.h"
8 #include "src/instr/instr_smpi.h"
9 #include "src/smpi/private.hpp"
10 #include "xbt/virtu.h" /* sg_cmdline */
11
12 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(instr_trace, instr, "tracing event system");
13
14 FILE *tracing_file = nullptr;
15
16 void print_NULL(paje_event_t event){}
17
18 /* The active set of functions for the selected trace format
19  * By default, they all do nothing, hence the print_NULL to avoid segfaults */
20
21 s_instr_trace_writer_t active_writer = {&print_NULL, &print_NULL, &print_NULL, &print_NULL, &print_NULL, &print_NULL,
22                                         &print_NULL, &print_NULL, &print_NULL, &print_NULL, &print_NULL, &print_NULL,
23                                         &print_NULL, &print_NULL, &print_NULL, &print_NULL, &print_NULL, &print_NULL};
24
25 std::vector<paje_event_t> buffer;
26
27 void dump_comment (const char *comment)
28 {
29   if (!strlen(comment)) return;
30   fprintf (tracing_file, "# %s\n", comment);
31 }
32
33 void dump_comment_file (const char *filename)
34 {
35   if (!strlen(filename)) return;
36   FILE *file = fopen (filename, "r");
37   if (!file){
38     THROWF (system_error, 1, "Comment file %s could not be opened for reading.", filename);
39   }
40   while (!feof(file)){
41     char c;
42     c = fgetc(file);
43     if (feof(file)) break;
44     fprintf (tracing_file, "# ");
45     while (c != '\n'){
46       fprintf (tracing_file, "%c", c);
47       c = fgetc(file);
48       if (feof(file)) break;
49     }
50     fprintf (tracing_file, "\n");
51   }
52   fclose(file);
53 }
54
55 double TRACE_last_timestamp_to_dump = 0;
56 //dumps the trace file until the timestamp TRACE_last_timestamp_to_dump
57 void TRACE_paje_dump_buffer (int force)
58 {
59   if (!TRACE_is_enabled()) return;
60   XBT_DEBUG("%s: dump until %f. starts", __FUNCTION__, TRACE_last_timestamp_to_dump);
61   if (force){
62     for (auto event :buffer){
63       event->print (event);
64       event->free (event);
65     }
66     buffer.clear();
67   }else{
68     std::vector<paje_event_t>::iterator i = buffer.begin();
69     for (auto event :buffer){
70       double head_timestamp = event->timestamp;
71       if (head_timestamp > TRACE_last_timestamp_to_dump)
72         break;
73       event->print (event);
74       event->free (event);
75       ++i;
76     }
77     buffer.erase(buffer.begin(), i);
78   }
79   XBT_DEBUG("%s: ends", __FUNCTION__);
80 }
81
82 /* internal do the instrumentation module */
83 static void insert_into_buffer (paje_event_t tbi)
84 {
85   if (TRACE_buffer() == 0){
86     tbi->print (tbi);
87     tbi->free (tbi);
88     return;
89   }
90
91   XBT_DEBUG("%s: insert event_type=%d, timestamp=%f, buffersize=%zu)",
92       __FUNCTION__, (int)tbi->event_type, tbi->timestamp, buffer.size());
93   std::vector<paje_event_t>::reverse_iterator i;
94   for (i = buffer.rbegin(); i != buffer.rend(); ++i) {
95     paje_event_t e1 = *i;
96     if (e1->timestamp <= tbi->timestamp)
97       break;
98   }
99   buffer.insert(i.base(), tbi);
100   if (i == buffer.rend())
101     XBT_DEBUG("%s: inserted at beginning", __FUNCTION__);
102   else
103     XBT_DEBUG("%s: inserted at%s %zd", __FUNCTION__, (i == buffer.rbegin()) ? " end" :"pos =",
104         std::distance(buffer.rend(),i));
105 }
106
107 static void free_paje_event (paje_event_t event)
108 {
109   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
110   switch (event->event_type){
111   case PAJE_StartLink:
112     xbt_free (((startLink_t)(event->data))->value);
113     xbt_free (((startLink_t)(event->data))->key);
114     break;
115   case PAJE_EndLink:
116     xbt_free (((endLink_t)(event->data))->value);
117     xbt_free (((endLink_t)(event->data))->key);
118     break;
119   default:
120     break;
121   }
122   xbt_free (event->data);
123   xbt_free (event);
124 }
125
126 void paje_event::Event(type_t type)
127 {
128   paje_event_t event                           = xbt_new0(s_paje_event_t, 1);
129   event->event_type                            = PAJE_DefineContainerType;
130   event->timestamp                             = 0;
131   event->print                                 = active_writer.print_DefineContainerType;
132   event->free                                  = &free_paje_event;
133   event->data                                  = xbt_new0(s_defineContainerType_t, 1);
134   ((defineContainerType_t)(event->data))->type = type;
135
136   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
137
138   //print it
139   event->print (event);
140   event->free (event);
141 }
142
143 //--------------------------------------------------------
144 /*
145 void s_defineContainerType::new_pajeDefineContainerType(type_t type)
146 {
147   paje_event_t event                           = xbt_new0(s_paje_event_t, 1);
148   event->event_type                            = PAJE_DefineContainerType;
149   event->timestamp                             = 0;
150   event->print                                 = active_writer.print_DefineContainerType;
151   event->free                                  = &free_paje_event;
152   event->data                                  = xbt_new0(s_defineContainerType_t, 1);
153   ((defineContainerType_t)(event->data))->type = type;
154
155   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
156
157   //print it
158   event->print (event);
159   event->free (event);
160 }
161 */
162 void new_pajeDefineVariableType(type_t type)
163 {
164   paje_event_t event                          = xbt_new0(s_paje_event_t, 1);
165   event->event_type                           = PAJE_DefineVariableType;
166   event->timestamp                            = 0;
167   event->print                                = active_writer.print_DefineVariableType;
168   event->free                                 = &free_paje_event;
169   event->data                                 = xbt_new0(s_defineVariableType_t, 1);
170   ((defineVariableType_t)(event->data))->type = type;
171
172   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
173
174   //print it
175   event->print (event);
176   event->free (event);
177 }
178
179 void new_pajeDefineStateType(type_t type)
180 {
181   paje_event_t event                       = xbt_new0(s_paje_event_t, 1);
182   event->event_type                        = PAJE_DefineStateType;
183   event->timestamp                         = 0;
184   event->print                             = active_writer.print_DefineStateType;
185   event->free                              = &free_paje_event;
186   event->data                              = xbt_new0(s_defineStateType_t, 1);
187   ((defineStateType_t)(event->data))->type = type;
188
189   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
190
191   //print it
192   event->print (event);
193   event->free (event);
194 }
195
196 void new_pajeDefineEventType(type_t type)
197 {
198   paje_event_t event                       = xbt_new0(s_paje_event_t, 1);
199   event->event_type                        = PAJE_DefineEventType;
200   event->timestamp                         = 0;
201   event->print                             = active_writer.print_DefineEventType;
202   event->free                              = &free_paje_event;
203   event->data                              = xbt_new0(s_defineEventType_t, 1);
204   ((defineEventType_t)(event->data))->type = type;
205
206   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
207
208   //print it
209   event->print (event);
210   event->free (event);
211 }
212
213 void new_pajeDefineLinkType(type_t type, type_t source, type_t dest)
214 {
215   paje_event_t event                        = xbt_new0(s_paje_event_t, 1);
216   event->event_type                         = PAJE_DefineLinkType;
217   event->timestamp                          = 0;
218   event->print                              = active_writer.print_DefineLinkType;
219   event->free                               = &free_paje_event;
220   event->data                               = xbt_new0(s_defineLinkType_t, 1);
221   ((defineLinkType_t)(event->data))->type   = type;
222   ((defineLinkType_t)(event->data))->source = source;
223   ((defineLinkType_t)(event->data))->dest   = dest;
224
225   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
226
227   //print it
228   event->print (event);
229   event->free (event);
230 }
231
232 void new_pajeDefineEntityValue (val_t value)
233 {
234   paje_event_t event                          = xbt_new0(s_paje_event_t, 1);
235   event->event_type                           = PAJE_DefineEntityValue;
236   event->timestamp                            = 0;
237   event->print                                = active_writer.print_DefineEntityValue;
238   event->free                                 = &free_paje_event;
239   event->data                                 = xbt_new0(s_defineEntityValue_t, 1);
240   ((defineEntityValue_t)(event->data))->value = value;
241
242   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
243
244   //print it
245   event->print (event);
246   event->free (event);
247 }
248
249 void new_pajeCreateContainer (container_t container)
250 {
251   paje_event_t event                            = xbt_new0(s_paje_event_t, 1);
252   event->event_type                             = PAJE_CreateContainer;
253   event->timestamp                              = SIMIX_get_clock();
254   event->print                                  = active_writer.print_CreateContainer;
255   event->free                                   = &free_paje_event;
256   event->data                                   = xbt_new0(s_createContainer_t, 1);
257   ((createContainer_t)(event->data))->container = container;
258
259   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
260
261   //print it
262   event->print (event);
263   event->free (event);
264 }
265
266 void new_pajeDestroyContainer (container_t container)
267 {
268   paje_event_t event                             = xbt_new0(s_paje_event_t, 1);
269   event->event_type                              = PAJE_DestroyContainer;
270   event->timestamp                               = SIMIX_get_clock();
271   event->print                                   = active_writer.print_DestroyContainer;
272   event->free                                    = &free_paje_event;
273   event->data                                    = xbt_new0(s_destroyContainer_t, 1);
274   ((destroyContainer_t)(event->data))->container = container;
275
276   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
277
278   //print it
279   event->print (event);
280   event->free (event);
281 }
282
283 void new_pajeSetVariable (double timestamp, container_t container, type_t type, double value)
284 {
285   paje_event_t event                        = xbt_new0(s_paje_event_t, 1);
286   event->event_type                         = PAJE_SetVariable;
287   event->timestamp                          = timestamp;
288   event->print                              = active_writer.print_SetVariable;
289   event->free                               = &free_paje_event;
290   event->data                               = xbt_new0(s_setVariable_t, 1);
291   ((setVariable_t)(event->data))->type      = type;
292   ((setVariable_t)(event->data))->container = container;
293   ((setVariable_t)(event->data))->value     = value;
294
295   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
296
297   insert_into_buffer (event);
298 }
299
300
301 void new_pajeAddVariable (double timestamp, container_t container, type_t type, double value)
302 {
303   paje_event_t event                        = xbt_new0(s_paje_event_t, 1);
304   event->event_type                         = PAJE_AddVariable;
305   event->timestamp                          = timestamp;
306   event->print                              = active_writer.print_AddVariable;
307   event->free                               = &free_paje_event;
308   event->data                               = xbt_new0(s_addVariable_t, 1);
309   ((addVariable_t)(event->data))->type      = type;
310   ((addVariable_t)(event->data))->container = container;
311   ((addVariable_t)(event->data))->value     = value;
312
313   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
314
315   insert_into_buffer (event);
316 }
317
318 void s_subVariable_t::new_pajeSubVariable (double timestamp, container_t container, type_t type, double value)
319 {
320   paje_event_t event                        = xbt_new0(s_paje_event_t, 1);
321   event->event_type                         = PAJE_SubVariable;
322   event->timestamp                          = timestamp;
323   event->print                              = active_writer.print_SubVariable;
324   event->free                               = &free_paje_event;
325   event->data                               = xbt_new0(s_subVariable_t, 1);
326   ((subVariable_t)(event->data))->type      = type;
327   ((subVariable_t)(event->data))->container = container;
328   ((subVariable_t)(event->data))->value     = value;
329
330   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
331
332   insert_into_buffer (event);
333 }
334
335 void new_pajeSetState (double timestamp, container_t container, type_t type, val_t value)
336 {
337   paje_event_t event                     = xbt_new0(s_paje_event_t, 1);
338   event->event_type                      = PAJE_SetState;
339   event->timestamp                       = timestamp;
340   event->print                           = active_writer.print_SetState;
341   event->free                            = &free_paje_event;
342   event->data                            = xbt_new0(s_setState_t, 1);
343   ((setState_t)(event->data))->type      = type;
344   ((setState_t)(event->data))->container = container;
345   ((setState_t)(event->data))->value     = value;
346
347 #if HAVE_SMPI
348   if (xbt_cfg_get_boolean("smpi/trace-call-location")) {
349     smpi_trace_call_location_t* loc = smpi_trace_get_call_location();
350     ((setState_t)(event->data))->filename   = loc->filename;
351     ((setState_t)(event->data))->linenumber = loc->linenumber;
352   }
353 #endif
354
355   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
356
357   insert_into_buffer (event);
358 }
359
360
361 void new_pajePushStateWithExtra (double timestamp, container_t container, type_t type, val_t value, void* extra)
362 {
363   paje_event_t event                 = xbt_new0(s_paje_event_t, 1);
364   event->event_type                  = PAJE_PushState;
365   event->timestamp                   = timestamp;
366   event->print                       = active_writer.print_PushState;
367   event->free                        = &free_paje_event;
368   event->data                        = xbt_new0(s_pushState_t, 1);
369   ((pushState_t)(event->data))->type = type;
370   ((pushState_t)(event->data))->container = container;
371   ((pushState_t)(event->data))->value     = value;
372   ((pushState_t)(event->data))->extra     = extra;
373
374 #if HAVE_SMPI
375   if (xbt_cfg_get_boolean("smpi/trace-call-location")) {
376     smpi_trace_call_location_t* loc = smpi_trace_get_call_location();
377     ((pushState_t)(event->data))->filename   = loc->filename;
378     ((pushState_t)(event->data))->linenumber = loc->linenumber;
379   }
380 #endif
381
382   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
383
384   insert_into_buffer (event);
385 }
386
387
388 void new_pajePushState (double timestamp, container_t container, type_t type, val_t value)
389 {
390   new_pajePushStateWithExtra(timestamp, container, type, value, nullptr);
391 }
392
393 void new_pajePopState (double timestamp, container_t container, type_t type)
394 {
395   paje_event_t event                     = xbt_new0(s_paje_event_t, 1);
396   event->event_type                      = PAJE_PopState;
397   event->timestamp                       = timestamp;
398   event->print                           = active_writer.print_PopState;
399   event->free                            = &free_paje_event;
400   event->data                            = xbt_new0(s_popState_t, 1);
401   ((popState_t)(event->data))->type      = type;
402   ((popState_t)(event->data))->container = container;
403
404   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
405
406   insert_into_buffer (event);
407 }
408
409
410 void new_pajeResetState (double timestamp, container_t container, type_t type)
411 {
412   paje_event_t event                       = xbt_new0(s_paje_event_t, 1);
413   event->event_type                        = PAJE_ResetState;
414   event->timestamp                         = timestamp;
415   event->print                             = active_writer.print_ResetState;
416   event->free                              = &free_paje_event;
417   event->data                              = xbt_new0(s_resetState_t, 1);
418   ((resetState_t)(event->data))->type      = type;
419   ((resetState_t)(event->data))->container = container;
420
421   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
422
423   insert_into_buffer (event);
424 }
425
426 void new_pajeStartLink (double timestamp, container_t container, type_t type, container_t sourceContainer,
427                         const char *value, const char *key)
428 {
429   new_pajeStartLinkWithSize(timestamp, container, type, sourceContainer, value, key, -1);
430 }
431
432 void new_pajeStartLinkWithSize (double timestamp, container_t container, type_t type, container_t sourceContainer,
433                                 const char *value, const char *key, int size)
434 {
435   paje_event_t event                            = xbt_new0(s_paje_event_t, 1);
436   event->event_type                             = PAJE_StartLink;
437   event->timestamp                              = timestamp;
438   event->print                                  = active_writer.print_StartLink;
439   event->free                                   = &free_paje_event;
440   event->data                                   = xbt_new0(s_startLink_t, 1);
441   ((startLink_t)(event->data))->type            = type;
442   ((startLink_t)(event->data))->container       = container;
443   ((startLink_t)(event->data))->sourceContainer = sourceContainer;
444   ((startLink_t)(event->data))->value           = xbt_strdup(value);
445   ((startLink_t)(event->data))->key             = xbt_strdup(key);
446   ((startLink_t)(event->data))->size            = size;
447
448   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
449
450   insert_into_buffer (event);
451 }
452
453 void new_pajeEndLink (double timestamp, container_t container, type_t type, container_t destContainer,
454                       const char *value, const char *key)
455 {
456   paje_event_t event                        = xbt_new0(s_paje_event_t, 1);
457   event->event_type                         = PAJE_EndLink;
458   event->timestamp                          = timestamp;
459   event->print                              = active_writer.print_EndLink;
460   event->free                               = &free_paje_event;
461   event->data                               = xbt_new0(s_endLink_t, 1);
462   ((endLink_t)(event->data))->type          = type;
463   ((endLink_t)(event->data))->container     = container;
464   ((endLink_t)(event->data))->destContainer = destContainer;
465   ((endLink_t)(event->data))->value         = xbt_strdup(value);
466   ((endLink_t)(event->data))->key           = xbt_strdup(key);
467
468   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
469
470   insert_into_buffer (event);
471 }
472
473 void new_pajeNewEvent (double timestamp, container_t container, type_t type, val_t value)
474 {
475   paje_event_t event                     = xbt_new0(s_paje_event_t, 1);
476   event->event_type                      = PAJE_NewEvent;
477   event->timestamp                       = timestamp;
478   event->print                           = active_writer.print_NewEvent;
479   event->free                            = &free_paje_event;
480   event->data                            = xbt_new0(s_newEvent_t, 1);
481   ((newEvent_t)(event->data))->type      = type;
482   ((newEvent_t)(event->data))->container = container;
483   ((newEvent_t)(event->data))->value     = value;
484
485   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
486
487   insert_into_buffer (event);
488 }