1 /* Copyright (c) 2010-2013. 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"
8 #include "xbt/virtu.h" /* sg_cmdline */
12 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(instr_trace, instr, "tracing event system");
15 FILE *tracing_file = NULL;
17 void print_NULL(paje_event_t event){}
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 */
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
32 xbt_dynar_t buffer = NULL;
34 void dump_comment (const char *comment)
36 if (!strlen(comment)) return;
37 fprintf (tracing_file, "# %s\n", comment);
40 void dump_comment_file (const char *filename)
42 if (!strlen(filename)) return;
43 FILE *file = fopen (filename, "r");
45 THROWF (system_error, 1, "Comment file %s could not be opened for reading.", filename);
50 if (feof(file)) break;
51 fprintf (tracing_file, "# ");
53 fprintf (tracing_file, "%c", c);
55 if (feof(file)) break;
57 fprintf (tracing_file, "\n");
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)
69 if (!TRACE_is_enabled()) return;
70 XBT_DEBUG("%s: dump until %f. starts", __FUNCTION__, TRACE_last_timestamp_to_dump);
74 xbt_dynar_foreach(buffer, i, event){
78 xbt_dynar_free (&buffer);
79 buffer = xbt_dynar_new (sizeof(paje_event_t), NULL);
83 xbt_dynar_foreach(buffer, cursor, event) {
84 double head_timestamp = event->timestamp;
85 if (head_timestamp > TRACE_last_timestamp_to_dump){
91 xbt_dynar_remove_n_at(buffer, cursor, 0);
93 XBT_DEBUG("%s: ends", __FUNCTION__);
96 /* internal do the instrumentation module */
97 static void insert_into_buffer (paje_event_t tbi)
99 if (TRACE_buffer() == 0){
104 XBT_DEBUG("%s: insert event_type=%d, timestamp=%f, buffersize=%lu)",
105 __FUNCTION__, (int)tbi->event_type, tbi->timestamp, xbt_dynar_length(buffer));
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)
113 xbt_dynar_insert_at(buffer, i, &tbi);
115 XBT_DEBUG("%s: inserted at beginning", __FUNCTION__);
117 XBT_DEBUG("%s: inserted at%s %u", __FUNCTION__,
118 (i == xbt_dynar_length(buffer) - 1 ? " end, pos =" : ""), i);
122 static void free_paje_event (paje_event_t event)
124 XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
125 switch (event->event_type){
127 xbt_free (((startLink_t)(event->data))->value);
128 xbt_free (((startLink_t)(event->data))->key);
131 xbt_free (((endLink_t)(event->data))->value);
132 xbt_free (((endLink_t)(event->data))->key);
137 xbt_free (event->data);
141 void new_pajeDefineContainerType(type_t type)
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;
151 XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
154 event->print (event);
158 void new_pajeDefineVariableType(type_t type)
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;
168 XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
171 event->print (event);
175 void new_pajeDefineStateType(type_t type)
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;
185 XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
188 event->print (event);
192 void new_pajeDefineEventType(type_t type)
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;
202 XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
205 event->print (event);
209 void new_pajeDefineLinkType(type_t type, type_t source, type_t dest)
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;
221 XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
224 event->print (event);
228 void new_pajeDefineEntityValue (val_t value)
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;
238 XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
241 event->print (event);
245 void new_pajeCreateContainer (container_t container)
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;
255 XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
258 event->print (event);
262 void new_pajeDestroyContainer (container_t container)
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;
272 XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
275 event->print (event);
279 void new_pajeSetVariable (double timestamp, container_t container, type_t type, double value)
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;
291 XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
293 insert_into_buffer (event);
297 void new_pajeAddVariable (double timestamp, container_t container, type_t type, double value)
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;
309 XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
311 insert_into_buffer (event);
314 void new_pajeSubVariable (double timestamp, container_t container, type_t type, double value)
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;
326 XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
328 insert_into_buffer (event);
331 void new_pajeSetState (double timestamp, container_t container, type_t type, val_t value)
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;
343 XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
345 insert_into_buffer (event);
349 void new_pajePushStateWithExtra (double timestamp, container_t container, type_t type, val_t value, void* extra)
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;
362 XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
364 insert_into_buffer (event);
368 void new_pajePushState (double timestamp, container_t container, type_t type, val_t value)
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);
381 insert_into_buffer (event);
384 void new_pajePopState (double timestamp, container_t container, type_t type)
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;
395 XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
397 insert_into_buffer (event);
401 void new_pajeResetState (double timestamp, container_t container, type_t type)
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;
412 XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
414 insert_into_buffer (event);
417 void new_pajeStartLink (double timestamp, container_t container, type_t type, container_t sourceContainer, const char *value, const char *key)
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);
433 insert_into_buffer (event);
436 void new_pajeStartLinkWithSize (double timestamp, container_t container, type_t type, container_t sourceContainer, const char *value, const char *key, int size)
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;
451 XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
453 insert_into_buffer (event);
456 void new_pajeEndLink (double timestamp, container_t container, type_t type, container_t destContainer, const char *value, const char *key)
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);
470 XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
472 insert_into_buffer (event);
475 void new_pajeNewEvent (double timestamp, container_t container, type_t type, val_t value)
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;
487 XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
489 insert_into_buffer (event);
492 #endif /* HAVE_TRACING */