Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
s_defineVariableType
[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
163 void new_pajeDefineVariableType(type_t type)
164 {
165   paje_event_t event                          = xbt_new0(s_paje_event_t, 1);
166   event->event_type                           = PAJE_DefineVariableType;
167   event->timestamp                            = 0;
168   event->print                                = active_writer.print_DefineVariableType;
169   event->free                                 = &free_paje_event;
170   event->data                                 = xbt_new0(s_defineVariableType_t, 1);
171   ((defineVariableType_t)(event->data))->type = type;
172
173   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
174
175   //print it
176   event->print (event);
177   event->free (event);
178 }
179
180 void new_pajeDefineStateType(type_t type)
181 {
182   paje_event_t event                       = xbt_new0(s_paje_event_t, 1);
183   event->event_type                        = PAJE_DefineStateType;
184   event->timestamp                         = 0;
185   event->print                             = active_writer.print_DefineStateType;
186   event->free                              = &free_paje_event;
187   event->data                              = xbt_new0(s_defineStateType_t, 1);
188   ((defineStateType_t)(event->data))->type = type;
189
190   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
191
192   //print it
193   event->print (event);
194   event->free (event);
195 }
196
197 void new_pajeDefineEventType(type_t type)
198 {
199   paje_event_t event                       = xbt_new0(s_paje_event_t, 1);
200   event->event_type                        = PAJE_DefineEventType;
201   event->timestamp                         = 0;
202   event->print                             = active_writer.print_DefineEventType;
203   event->free                              = &free_paje_event;
204   event->data                              = xbt_new0(s_defineEventType_t, 1);
205   ((defineEventType_t)(event->data))->type = type;
206
207   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
208
209   //print it
210   event->print (event);
211   event->free (event);
212 }
213
214 void new_pajeDefineLinkType(type_t type, type_t source, type_t dest)
215 {
216   paje_event_t event                        = xbt_new0(s_paje_event_t, 1);
217   event->event_type                         = PAJE_DefineLinkType;
218   event->timestamp                          = 0;
219   event->print                              = active_writer.print_DefineLinkType;
220   event->free                               = &free_paje_event;
221   event->data                               = xbt_new0(s_defineLinkType_t, 1);
222   ((defineLinkType_t)(event->data))->type   = type;
223   ((defineLinkType_t)(event->data))->source = source;
224   ((defineLinkType_t)(event->data))->dest   = dest;
225
226   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
227
228   //print it
229   event->print (event);
230   event->free (event);
231 }
232
233 void new_pajeDefineEntityValue (val_t value)
234 {
235   paje_event_t event                          = xbt_new0(s_paje_event_t, 1);
236   event->event_type                           = PAJE_DefineEntityValue;
237   event->timestamp                            = 0;
238   event->print                                = active_writer.print_DefineEntityValue;
239   event->free                                 = &free_paje_event;
240   event->data                                 = xbt_new0(s_defineEntityValue_t, 1);
241   ((defineEntityValue_t)(event->data))->value = value;
242
243   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
244
245   //print it
246   event->print (event);
247   event->free (event);
248 }
249
250 void new_pajeCreateContainer (container_t container)
251 {
252   paje_event_t event                            = xbt_new0(s_paje_event_t, 1);
253   event->event_type                             = PAJE_CreateContainer;
254   event->timestamp                              = SIMIX_get_clock();
255   event->print                                  = active_writer.print_CreateContainer;
256   event->free                                   = &free_paje_event;
257   event->data                                   = xbt_new0(s_createContainer_t, 1);
258   ((createContainer_t)(event->data))->container = container;
259
260   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
261
262   //print it
263   event->print (event);
264   event->free (event);
265 }
266
267 void new_pajeDestroyContainer (container_t container)
268 {
269   paje_event_t event                             = xbt_new0(s_paje_event_t, 1);
270   event->event_type                              = PAJE_DestroyContainer;
271   event->timestamp                               = SIMIX_get_clock();
272   event->print                                   = active_writer.print_DestroyContainer;
273   event->free                                    = &free_paje_event;
274   event->data                                    = xbt_new0(s_destroyContainer_t, 1);
275   ((destroyContainer_t)(event->data))->container = container;
276
277   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
278
279   //print it
280   event->print (event);
281   event->free (event);
282 }
283
284 void new_pajeSetVariable (double timestamp, container_t container, type_t type, double value)
285 {
286   paje_event_t event                        = xbt_new0(s_paje_event_t, 1);
287   event->event_type                         = PAJE_SetVariable;
288   event->timestamp                          = timestamp;
289   event->print                              = active_writer.print_SetVariable;
290   event->free                               = &free_paje_event;
291   event->data                               = xbt_new0(s_setVariable_t, 1);
292   ((setVariable_t)(event->data))->type      = type;
293   ((setVariable_t)(event->data))->container = container;
294   ((setVariable_t)(event->data))->value     = value;
295
296   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
297
298   insert_into_buffer (event);
299 }
300
301
302 void new_pajeAddVariable (double timestamp, container_t container, type_t type, double value)
303 {
304   paje_event_t event                        = xbt_new0(s_paje_event_t, 1);
305   event->event_type                         = PAJE_AddVariable;
306   event->timestamp                          = timestamp;
307   event->print                              = active_writer.print_AddVariable;
308   event->free                               = &free_paje_event;
309   event->data                               = xbt_new0(s_addVariable_t, 1);
310   ((addVariable_t)(event->data))->type      = type;
311   ((addVariable_t)(event->data))->container = container;
312   ((addVariable_t)(event->data))->value     = value;
313
314   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
315
316   insert_into_buffer (event);
317 }
318
319 void s_subVariable_t::new_pajeSubVariable (double timestamp, container_t container, type_t type, double value)
320 {
321   paje_event_t event                        = xbt_new0(s_paje_event_t, 1);
322   event->event_type                         = PAJE_SubVariable;
323   event->timestamp                          = timestamp;
324   event->print                              = active_writer.print_SubVariable;
325   event->free                               = &free_paje_event;
326   event->data                               = xbt_new0(s_subVariable_t, 1);
327   ((subVariable_t)(event->data))->type      = type;
328   ((subVariable_t)(event->data))->container = container;
329   ((subVariable_t)(event->data))->value     = value;
330
331   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
332
333   insert_into_buffer (event);
334 }
335
336 void new_pajeSetState (double timestamp, container_t container, type_t type, val_t value)
337 {
338   paje_event_t event                     = xbt_new0(s_paje_event_t, 1);
339   event->event_type                      = PAJE_SetState;
340   event->timestamp                       = timestamp;
341   event->print                           = active_writer.print_SetState;
342   event->free                            = &free_paje_event;
343   event->data                            = xbt_new0(s_setState_t, 1);
344   ((setState_t)(event->data))->type      = type;
345   ((setState_t)(event->data))->container = container;
346   ((setState_t)(event->data))->value     = value;
347
348 #if HAVE_SMPI
349   if (xbt_cfg_get_boolean("smpi/trace-call-location")) {
350     smpi_trace_call_location_t* loc = smpi_trace_get_call_location();
351     ((setState_t)(event->data))->filename   = loc->filename;
352     ((setState_t)(event->data))->linenumber = loc->linenumber;
353   }
354 #endif
355
356   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
357
358   insert_into_buffer (event);
359 }
360
361
362 void new_pajePushStateWithExtra (double timestamp, container_t container, type_t type, val_t value, void* extra)
363 {
364   paje_event_t event                 = xbt_new0(s_paje_event_t, 1);
365   event->event_type                  = PAJE_PushState;
366   event->timestamp                   = timestamp;
367   event->print                       = active_writer.print_PushState;
368   event->free                        = &free_paje_event;
369   event->data                        = xbt_new0(s_pushState_t, 1);
370   ((pushState_t)(event->data))->type = type;
371   ((pushState_t)(event->data))->container = container;
372   ((pushState_t)(event->data))->value     = value;
373   ((pushState_t)(event->data))->extra     = extra;
374
375 #if HAVE_SMPI
376   if (xbt_cfg_get_boolean("smpi/trace-call-location")) {
377     smpi_trace_call_location_t* loc = smpi_trace_get_call_location();
378     ((pushState_t)(event->data))->filename   = loc->filename;
379     ((pushState_t)(event->data))->linenumber = loc->linenumber;
380   }
381 #endif
382
383   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
384
385   insert_into_buffer (event);
386 }
387
388
389 void new_pajePushState (double timestamp, container_t container, type_t type, val_t value)
390 {
391   new_pajePushStateWithExtra(timestamp, container, type, value, nullptr);
392 }
393
394 void new_pajePopState (double timestamp, container_t container, type_t type)
395 {
396   paje_event_t event                     = xbt_new0(s_paje_event_t, 1);
397   event->event_type                      = PAJE_PopState;
398   event->timestamp                       = timestamp;
399   event->print                           = active_writer.print_PopState;
400   event->free                            = &free_paje_event;
401   event->data                            = xbt_new0(s_popState_t, 1);
402   ((popState_t)(event->data))->type      = type;
403   ((popState_t)(event->data))->container = container;
404
405   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
406
407   insert_into_buffer (event);
408 }
409
410
411 void new_pajeResetState (double timestamp, container_t container, type_t type)
412 {
413   paje_event_t event                       = xbt_new0(s_paje_event_t, 1);
414   event->event_type                        = PAJE_ResetState;
415   event->timestamp                         = timestamp;
416   event->print                             = active_writer.print_ResetState;
417   event->free                              = &free_paje_event;
418   event->data                              = xbt_new0(s_resetState_t, 1);
419   ((resetState_t)(event->data))->type      = type;
420   ((resetState_t)(event->data))->container = container;
421
422   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
423
424   insert_into_buffer (event);
425 }
426
427 void new_pajeStartLink (double timestamp, container_t container, type_t type, container_t sourceContainer,
428                         const char *value, const char *key)
429 {
430   new_pajeStartLinkWithSize(timestamp, container, type, sourceContainer, value, key, -1);
431 }
432
433 void new_pajeStartLinkWithSize (double timestamp, container_t container, type_t type, container_t sourceContainer,
434                                 const char *value, const char *key, int size)
435 {
436   paje_event_t event                            = xbt_new0(s_paje_event_t, 1);
437   event->event_type                             = PAJE_StartLink;
438   event->timestamp                              = timestamp;
439   event->print                                  = active_writer.print_StartLink;
440   event->free                                   = &free_paje_event;
441   event->data                                   = xbt_new0(s_startLink_t, 1);
442   ((startLink_t)(event->data))->type            = type;
443   ((startLink_t)(event->data))->container       = container;
444   ((startLink_t)(event->data))->sourceContainer = sourceContainer;
445   ((startLink_t)(event->data))->value           = xbt_strdup(value);
446   ((startLink_t)(event->data))->key             = xbt_strdup(key);
447   ((startLink_t)(event->data))->size            = size;
448
449   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
450
451   insert_into_buffer (event);
452 }
453
454 void new_pajeEndLink (double timestamp, container_t container, type_t type, container_t destContainer,
455                       const char *value, const char *key)
456 {
457   paje_event_t event                        = xbt_new0(s_paje_event_t, 1);
458   event->event_type                         = PAJE_EndLink;
459   event->timestamp                          = timestamp;
460   event->print                              = active_writer.print_EndLink;
461   event->free                               = &free_paje_event;
462   event->data                               = xbt_new0(s_endLink_t, 1);
463   ((endLink_t)(event->data))->type          = type;
464   ((endLink_t)(event->data))->container     = container;
465   ((endLink_t)(event->data))->destContainer = destContainer;
466   ((endLink_t)(event->data))->value         = xbt_strdup(value);
467   ((endLink_t)(event->data))->key           = xbt_strdup(key);
468
469   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
470
471   insert_into_buffer (event);
472 }
473
474 void new_pajeNewEvent (double timestamp, container_t container, type_t type, val_t value)
475 {
476   paje_event_t event                     = xbt_new0(s_paje_event_t, 1);
477   event->event_type                      = PAJE_NewEvent;
478   event->timestamp                       = timestamp;
479   event->print                           = active_writer.print_NewEvent;
480   event->free                            = &free_paje_event;
481   event->data                            = xbt_new0(s_newEvent_t, 1);
482   ((newEvent_t)(event->data))->type      = type;
483   ((newEvent_t)(event->data))->container = container;
484   ((newEvent_t)(event->data))->value     = value;
485
486   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
487
488   insert_into_buffer (event);
489 }