Logo AND Algorithmique Numérique Distribuée

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