1 /* Copyright (c) 2010. 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"
11 #define INSTR_PAJE_ASSERT(str) {xbt_assert1(str!=NULL&&strlen(str)>0, "'%s' is NULL or length is zero", #str);}
13 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(instr_paje_trace, instr, "Paje tracing event system");
16 PAJE_DefineContainerType,
17 PAJE_DefineVariableType,
22 PAJE_DestroyContainer,
34 typedef struct paje_event *paje_event_t;
35 typedef struct paje_event {
37 e_event_type event_type;
38 void (*print) (paje_event_t event);
42 typedef struct s_defineContainerType *defineContainerType_t;
43 typedef struct s_defineContainerType {
45 }s_defineContainerType_t;
47 typedef struct s_defineVariableType *defineVariableType_t;
48 typedef struct s_defineVariableType {
50 }s_defineVariableType_t;
52 typedef struct s_defineStateType *defineStateType_t;
53 typedef struct s_defineStateType {
57 typedef struct s_defineEventType *defineEventType_t;
58 typedef struct s_defineEventType {
62 typedef struct s_defineLinkType *defineLinkType_t;
63 typedef struct s_defineLinkType {
69 typedef struct s_createContainer *createContainer_t;
70 typedef struct s_createContainer {
71 container_t container;
74 typedef struct s_destroyContainer *destroyContainer_t;
75 typedef struct s_destroyContainer {
76 container_t container;
77 }s_destroyContainer_t;
79 typedef struct s_setVariable *setVariable_t;
80 typedef struct s_setVariable {
81 container_t container;
86 typedef struct s_addVariable *addVariable_t;
87 typedef struct s_addVariable {
88 container_t container;
93 typedef struct s_subVariable *subVariable_t;
94 typedef struct s_subVariable {
95 container_t container;
100 typedef struct s_setState *setState_t;
101 typedef struct s_setState {
102 container_t container;
107 typedef struct s_pushState *pushState_t;
108 typedef struct s_pushState {
109 container_t container;
114 typedef struct s_popState *popState_t;
115 typedef struct s_popState {
116 container_t container;
121 typedef struct s_startLink *startLink_t;
122 typedef struct s_startLink {
124 container_t container;
125 container_t sourceContainer;
130 typedef struct s_endLink *endLink_t;
131 typedef struct s_endLink {
133 container_t container;
134 container_t destContainer;
139 typedef struct s_newEvent *newEvent_t;
140 typedef struct s_newEvent {
142 container_t container;
146 static FILE *tracing_file = NULL;
149 void TRACE_paje_start(void)
151 char *filename = TRACE_get_filename();
152 tracing_file = fopen(filename, "w");
153 xbt_assert1 (tracing_file != NULL, "Tracefile %s could not be opened for writing.", filename);
155 DEBUG1("Filename %s is open for writing", filename);
158 TRACE_paje_create_header();
161 void TRACE_paje_end(void)
163 fclose(tracing_file);
164 char *filename = TRACE_get_filename();
165 DEBUG1("Filename %s is closed", filename);
168 void TRACE_paje_create_header(void)
170 DEBUG0 ("Define paje header");
171 fprintf(tracing_file, "\
172 %%EventDef PajeDefineContainerType %d \n\
174 %% ContainerType string \n\
177 %%EventDef PajeDefineVariableType %d \n\
179 %% ContainerType string \n\
183 %%EventDef PajeDefineStateType %d \n\
185 %% ContainerType string \n\
188 %%EventDef PajeDefineEventType %d \n\
190 %% EntityType string \n\
194 %%EventDef PajeDefineLinkType %d \n\
196 %% ContainerType string \n\
197 %% SourceContainerType string \n\
198 %% DestContainerType string \n\
201 %%EventDef PajeCreateContainer %d \n\
205 %% Container string \n\
208 %%EventDef PajeDestroyContainer %d \n\
211 %% Container string \n\
213 %%EventDef PajeSetVariable %d \n\
215 %% EntityType string \n\
216 %% Container string \n\
219 %%EventDef PajeAddVariable %d \n\
221 %% EntityType string \n\
222 %% Container string \n\
225 %%EventDef PajeSubVariable %d \n\
227 %% EntityType string \n\
228 %% Container string \n\
231 %%EventDef PajeSetState %d \n\
233 %% EntityType string \n\
234 %% Container string \n\
237 %%EventDef PajePushState %d \n\
239 %% EntityType string \n\
240 %% Container string \n\
243 %%EventDef PajePopState %d \n\
245 %% EntityType string \n\
246 %% Container string \n\
248 %%EventDef PajeStartLink %d \n\
250 %% EntityType string \n\
251 %% Container string \n\
253 %% SourceContainer string \n\
256 %%EventDef PajeEndLink %d \n\
258 %% EntityType string \n\
259 %% Container string \n\
261 %% DestContainer string \n\
264 %%EventDef PajeNewEvent %d \n\
266 %% EntityType string \n\
267 %% Container string \n\
270 PAJE_DefineContainerType,
271 PAJE_DefineVariableType,
272 PAJE_DefineStateType,
273 PAJE_DefineEventType,
275 PAJE_CreateContainer,
276 PAJE_DestroyContainer,
288 /* internal do the instrumentation module */
289 static void print_pajeDefineContainerType(paje_event_t event)
291 fprintf(tracing_file, "%d %s %s %s\n",
293 ((defineContainerType_t)event->data)->type->id,
294 ((defineContainerType_t)event->data)->type->father->id,
295 ((defineContainerType_t)event->data)->type->name);
298 static void print_pajeDefineVariableType(paje_event_t event)
300 fprintf(tracing_file, "%d %s %s %s \"%s\"\n",
302 ((defineVariableType_t)event->data)->type->id,
303 ((defineVariableType_t)event->data)->type->father->id,
304 ((defineVariableType_t)event->data)->type->name,
305 ((defineVariableType_t)event->data)->type->color);
308 static void print_pajeDefineStateType(paje_event_t event)
310 fprintf(tracing_file, "%d %s %s %s\n",
312 ((defineStateType_t)event->data)->type->id,
313 ((defineStateType_t)event->data)->type->father->id,
314 ((defineStateType_t)event->data)->type->name);
317 static void print_pajeDefineEventType(paje_event_t event)
319 fprintf(tracing_file, "%d %s %s %s \"%s\"\n",
321 ((defineEventType_t)event->data)->type->id,
322 ((defineEventType_t)event->data)->type->father->id,
323 ((defineEventType_t)event->data)->type->name,
324 ((defineEventType_t)event->data)->type->color);
327 static void print_pajeDefineLinkType(paje_event_t event)
329 fprintf(tracing_file, "%d %s %s %s %s %s\n",
331 ((defineLinkType_t)event->data)->type->id,
332 ((defineLinkType_t)event->data)->type->father->id,
333 ((defineLinkType_t)event->data)->source->id,
334 ((defineLinkType_t)event->data)->dest->id,
335 ((defineLinkType_t)event->data)->type->name);
338 static void print_pajeCreateContainer(paje_event_t event)
340 if (event->timestamp == 0){
341 fprintf(tracing_file, "%d 0 %s %s %s %s\n",
343 ((createContainer_t)event->data)->container->id,
344 ((createContainer_t)event->data)->container->type->id,
345 ((createContainer_t)event->data)->container->father->id,
346 ((createContainer_t)event->data)->container->name);
348 fprintf(tracing_file, "%d %lf %s %s %s %s\n",
351 ((createContainer_t)event->data)->container->id,
352 ((createContainer_t)event->data)->container->type->id,
353 ((createContainer_t)event->data)->container->father->id,
354 ((createContainer_t)event->data)->container->name);
358 static void print_pajeDestroyContainer(paje_event_t event)
360 if (event->timestamp == 0){
361 fprintf(tracing_file, "%d 0 %s %s\n",
363 ((destroyContainer_t)event->data)->container->type->id,
364 ((destroyContainer_t)event->data)->container->id);
366 fprintf(tracing_file, "%d %lf %s %s\n",
369 ((destroyContainer_t)event->data)->container->type->id,
370 ((destroyContainer_t)event->data)->container->id);
374 static void print_pajeSetVariable(paje_event_t event)
376 if (event->timestamp == 0){
377 fprintf(tracing_file, "%d 0 %s %s %f\n",
379 ((setVariable_t)event->data)->type->id,
380 ((setVariable_t)event->data)->container->id,
381 ((setVariable_t)event->data)->value);
383 fprintf(tracing_file, "%d %lf %s %s %f\n",
386 ((setVariable_t)event->data)->type->id,
387 ((setVariable_t)event->data)->container->id,
388 ((setVariable_t)event->data)->value);
392 static void print_pajeAddVariable(paje_event_t event)
394 if (event->timestamp == 0){
395 fprintf(tracing_file, "%d 0 %s %s %f\n",
397 ((addVariable_t)event->data)->type->id,
398 ((addVariable_t)event->data)->container->id,
399 ((addVariable_t)event->data)->value);
401 fprintf(tracing_file, "%d %lf %s %s %f\n",
404 ((addVariable_t)event->data)->type->id,
405 ((addVariable_t)event->data)->container->id,
406 ((addVariable_t)event->data)->value);
410 static void print_pajeSubVariable(paje_event_t event)
412 if (event->timestamp == 0){
413 fprintf(tracing_file, "%d 0 %s %s %f\n",
415 ((subVariable_t)event->data)->type->id,
416 ((subVariable_t)event->data)->container->id,
417 ((subVariable_t)event->data)->value);
419 fprintf(tracing_file, "%d %lf %s %s %f\n",
422 ((subVariable_t)event->data)->type->id,
423 ((subVariable_t)event->data)->container->id,
424 ((subVariable_t)event->data)->value);
428 static void print_pajeSetState(paje_event_t event)
430 if (event->timestamp == 0){
431 fprintf(tracing_file, "%d 0 %s %s %s\n",
433 ((setState_t)event->data)->type->id,
434 ((setState_t)event->data)->container->id,
435 ((setState_t)event->data)->value);
437 fprintf(tracing_file, "%d %lf %s %s %s\n",
440 ((setState_t)event->data)->type->id,
441 ((setState_t)event->data)->container->id,
442 ((setState_t)event->data)->value);
446 static void print_pajePushState(paje_event_t event)
448 if (event->timestamp == 0){
449 fprintf(tracing_file, "%d 0 %s %s %s\n",
451 ((pushState_t)event->data)->type->id,
452 ((pushState_t)event->data)->container->id,
453 ((pushState_t)event->data)->value);
455 fprintf(tracing_file, "%d %lf %s %s %s\n",
458 ((pushState_t)event->data)->type->id,
459 ((pushState_t)event->data)->container->id,
460 ((pushState_t)event->data)->value);
464 static void print_pajePopState(paje_event_t event)
466 if (event->timestamp == 0){
467 fprintf(tracing_file, "%d 0 %s %s\n",
469 ((popState_t)event->data)->type->id,
470 ((popState_t)event->data)->container->id);
472 fprintf(tracing_file, "%d %lf %s %s\n",
475 ((popState_t)event->data)->type->id,
476 ((popState_t)event->data)->container->id);
480 static void print_pajeStartLink(paje_event_t event)
482 if (event->timestamp == 0){
483 fprintf(tracing_file, "%d 0 %s %s %s %s %s\n",
485 ((startLink_t)event->data)->type->id,
486 ((startLink_t)event->data)->container->id,
487 ((startLink_t)event->data)->value,
488 ((startLink_t)event->data)->sourceContainer->id,
489 ((startLink_t)event->data)->key);
491 fprintf(tracing_file, "%d %lf %s %s %s %s %s\n",
494 ((startLink_t)event->data)->type->id,
495 ((startLink_t)event->data)->container->id,
496 ((startLink_t)event->data)->value,
497 ((startLink_t)event->data)->sourceContainer->id,
498 ((startLink_t)event->data)->key);
502 static void print_pajeEndLink(paje_event_t event)
504 if (event->timestamp == 0){
505 fprintf(tracing_file, "%d 0 %s %s %s %s %s\n",
507 ((endLink_t)event->data)->type->id,
508 ((endLink_t)event->data)->container->id,
509 ((endLink_t)event->data)->value,
510 ((endLink_t)event->data)->destContainer->id,
511 ((endLink_t)event->data)->key);
513 fprintf(tracing_file, "%d %lf %s %s %s %s %s\n",
516 ((endLink_t)event->data)->type->id,
517 ((endLink_t)event->data)->container->id,
518 ((endLink_t)event->data)->value,
519 ((endLink_t)event->data)->destContainer->id,
520 ((endLink_t)event->data)->key);
524 static void print_pajeNewEvent (paje_event_t event)
526 if (event->timestamp == 0){
527 fprintf(tracing_file, "%d 0 %s %s %s\n",
529 ((newEvent_t)event->data)->type->id,
530 ((newEvent_t)event->data)->container->id,
531 ((newEvent_t)event->data)->value);
533 fprintf(tracing_file, "%d %lf %s %s %s\n",
536 ((newEvent_t)event->data)->type->id,
537 ((newEvent_t)event->data)->container->id,
538 ((newEvent_t)event->data)->value);
542 void new_pajeDefineContainerType(type_t type)
544 paje_event_t event = xbt_new0(s_paje_event_t, 1);
545 event->event_type = PAJE_DefineContainerType;
546 event->timestamp = 0;
547 event->print = print_pajeDefineContainerType;
548 event->data = xbt_new0(s_defineContainerType_t, 1);
549 ((defineContainerType_t)(event->data))->type = type;
552 event->print (event);
555 xbt_free (event->data);
560 void new_pajeDefineVariableType(type_t type)
562 paje_event_t event = xbt_new0(s_paje_event_t, 1);
563 event->event_type = PAJE_DefineVariableType;
564 event->timestamp = 0;
565 event->print = print_pajeDefineVariableType;
566 event->data = xbt_new0(s_defineVariableType_t, 1);
567 ((defineVariableType_t)(event->data))->type = type;
570 event->print (event);
573 xbt_free (event->data);
578 void new_pajeDefineStateType(type_t type)
580 paje_event_t event = xbt_new0(s_paje_event_t, 1);
581 event->event_type = PAJE_DefineStateType;
582 event->timestamp = 0;
583 event->print = print_pajeDefineStateType;
584 event->data = xbt_new0(s_defineStateType_t, 1);
585 ((defineStateType_t)(event->data))->type = type;
588 event->print (event);
591 xbt_free (event->data);
596 void new_pajeDefineEventType(type_t type)
598 paje_event_t event = xbt_new0(s_paje_event_t, 1);
599 event->event_type = PAJE_DefineEventType;
600 event->timestamp = 0;
601 event->print = print_pajeDefineEventType;
602 event->data = xbt_new0(s_defineEventType_t, 1);
603 ((defineEventType_t)(event->data))->type = type;
606 event->print (event);
609 xbt_free (event->data);
614 void new_pajeDefineLinkType(type_t type, type_t source, type_t dest)
616 paje_event_t event = xbt_new0(s_paje_event_t, 1);
617 event->event_type = PAJE_DefineLinkType;
618 event->timestamp = 0;
619 event->print = print_pajeDefineLinkType;
620 event->data = xbt_new0(s_defineLinkType_t, 1);
621 ((defineLinkType_t)(event->data))->type = type;
622 ((defineLinkType_t)(event->data))->source = source;
623 ((defineLinkType_t)(event->data))->dest = dest;
626 event->print (event);
629 xbt_free (event->data);
634 void new_pajeCreateContainer (container_t container)
636 paje_event_t event = xbt_new0(s_paje_event_t, 1);
637 event->event_type = PAJE_CreateContainer;
638 event->timestamp = SIMIX_get_clock();
639 event->print = print_pajeCreateContainer;
640 event->data = xbt_new0(s_createContainer_t, 1);
641 ((createContainer_t)(event->data))->container = container;
644 event->print (event);
647 xbt_free (event->data);
652 void new_pajeDestroyContainer (container_t container)
654 paje_event_t event = xbt_new0(s_paje_event_t, 1);
655 event->event_type = PAJE_DestroyContainer;
656 event->timestamp = SIMIX_get_clock();
657 event->print = print_pajeDestroyContainer;
658 event->data = xbt_new0(s_destroyContainer_t, 1);
659 ((destroyContainer_t)(event->data))->container = container;
662 event->print (event);
665 xbt_free (event->data);
670 void new_pajeSetVariable (double timestamp, container_t container, type_t type, double value)
672 paje_event_t event = xbt_new0(s_paje_event_t, 1);
673 event->event_type = PAJE_SetVariable;
674 event->timestamp = timestamp;
675 event->print = print_pajeSetVariable;
676 event->data = xbt_new0(s_setVariable_t, 1);
677 ((setVariable_t)(event->data))->type = type;
678 ((setVariable_t)(event->data))->container = container;
679 ((setVariable_t)(event->data))->value = value;
682 event->print (event);
685 xbt_free (event->data);
691 void new_pajeAddVariable (double timestamp, container_t container, type_t type, double value)
693 paje_event_t event = xbt_new0(s_paje_event_t, 1);
694 event->event_type = PAJE_AddVariable;
695 event->timestamp = timestamp;
696 event->print = print_pajeAddVariable;
697 event->data = xbt_new0(s_addVariable_t, 1);
698 ((addVariable_t)(event->data))->type = type;
699 ((addVariable_t)(event->data))->container = container;
700 ((addVariable_t)(event->data))->value = value;
703 event->print (event);
706 xbt_free (event->data);
711 void new_pajeSubVariable (double timestamp, container_t container, type_t type, double value)
713 paje_event_t event = xbt_new0(s_paje_event_t, 1);
714 event->event_type = PAJE_SubVariable;
715 event->timestamp = timestamp;
716 event->print = print_pajeSubVariable;
717 event->data = xbt_new0(s_subVariable_t, 1);
718 ((subVariable_t)(event->data))->type = type;
719 ((subVariable_t)(event->data))->container = container;
720 ((subVariable_t)(event->data))->value = value;
723 event->print (event);
726 xbt_free (event->data);
731 void new_pajeSetState (double timestamp, container_t container, type_t type, const char *value)
733 paje_event_t event = xbt_new0(s_paje_event_t, 1);
734 event->event_type = PAJE_SetState;
735 event->timestamp = timestamp;
736 event->print = print_pajeSetState;
737 event->data = xbt_new0(s_setState_t, 1);
738 ((setState_t)(event->data))->type = type;
739 ((setState_t)(event->data))->container = container;
740 ((setState_t)(event->data))->value = xbt_strdup(value);
743 event->print (event);
746 xbt_free (((setState_t)(event->data))->value);
747 xbt_free (event->data);
753 void new_pajePushState (double timestamp, container_t container, type_t type, const char *value)
755 paje_event_t event = xbt_new0(s_paje_event_t, 1);
756 event->event_type = PAJE_PushState;
757 event->timestamp = timestamp;
758 event->print = print_pajePushState;
759 event->data = xbt_new0(s_pushState_t, 1);
760 ((pushState_t)(event->data))->type = type;
761 ((pushState_t)(event->data))->container = container;
762 ((pushState_t)(event->data))->value = xbt_strdup(value);
765 event->print (event);
768 xbt_free (((pushState_t)(event->data))->value);
769 xbt_free (event->data);
775 void new_pajePopState (double timestamp, container_t container, type_t type)
777 paje_event_t event = xbt_new0(s_paje_event_t, 1);
778 event->event_type = PAJE_PopState;
779 event->timestamp = timestamp;
780 event->print = print_pajePopState;
781 event->data = xbt_new0(s_popState_t, 1);
782 ((popState_t)(event->data))->type = type;
783 ((popState_t)(event->data))->container = container;
786 event->print (event);
789 xbt_free (event->data);
794 void new_pajeStartLink (double timestamp, container_t container, type_t type, container_t sourceContainer, const char *value, const char *key)
796 paje_event_t event = xbt_new0(s_paje_event_t, 1);
797 event->event_type = PAJE_StartLink;
798 event->timestamp = timestamp;
799 event->print = print_pajeStartLink;
800 event->data = xbt_new0(s_startLink_t, 1);
801 ((startLink_t)(event->data))->type = type;
802 ((startLink_t)(event->data))->container = container;
803 ((startLink_t)(event->data))->sourceContainer = sourceContainer;
804 ((startLink_t)(event->data))->value = xbt_strdup(value);
805 ((startLink_t)(event->data))->key = xbt_strdup(key);
808 event->print (event);
811 xbt_free (((startLink_t)(event->data))->value);
812 xbt_free (((startLink_t)(event->data))->key);
813 xbt_free (event->data);
818 void new_pajeEndLink (double timestamp, container_t container, type_t type, container_t destContainer, const char *value, const char *key)
820 paje_event_t event = xbt_new0(s_paje_event_t, 1);
821 event->event_type = PAJE_EndLink;
822 event->timestamp = timestamp;
823 event->print = print_pajeEndLink;
824 event->data = xbt_new0(s_endLink_t, 1);
825 ((endLink_t)(event->data))->type = type;
826 ((endLink_t)(event->data))->container = container;
827 ((endLink_t)(event->data))->destContainer = destContainer;
828 ((endLink_t)(event->data))->value = xbt_strdup(value);
829 ((endLink_t)(event->data))->key = xbt_strdup(key);
832 event->print (event);
835 xbt_free (((endLink_t)(event->data))->value);
836 xbt_free (((endLink_t)(event->data))->key);
837 xbt_free (event->data);
842 void new_pajeNewEvent (double timestamp, container_t container, type_t type, const char *value)
844 paje_event_t event = xbt_new0(s_paje_event_t, 1);
845 event->event_type = PAJE_NewEvent;
846 event->timestamp = timestamp;
847 event->print = print_pajeNewEvent;
848 event->data = xbt_new0(s_newEvent_t, 1);
849 ((newEvent_t)(event->data))->type = type;
850 ((newEvent_t)(event->data))->container = container;
851 ((newEvent_t)(event->data))->value = xbt_strdup(value);
854 event->print (event);
857 xbt_free (((newEvent_t)(event->data))->value);
858 xbt_free (event->data);
863 //void pajeNewEvent(double time, const char *entityType,
864 // const char *container, const char *value)
866 // INSTR_PAJE_ASSERT(entityType);
867 // INSTR_PAJE_ASSERT(container);
868 // INSTR_PAJE_ASSERT(value);
871 // fprintf(tracing_file, "%d 0 %s %s %s\n", pajeNewEventId,
872 // entityType, container, value);
874 // fprintf(tracing_file, "%d %lf %s %s %s\n", pajeNewEventId, time,
875 // entityType, container, value);
879 #endif /* HAVE_TRACING */