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");
15 typedef struct paje_event *paje_event_t;
16 typedef struct paje_event {
23 typedef struct s_defineContainerType *defineContainerType_t;
24 typedef struct s_defineContainerType {
27 void (*print) (defineContainerType_t event);
28 }s_defineContainerType_t;
30 typedef struct s_defineVariableType *defineVariableType_t;
31 typedef struct s_defineVariableType {
34 void (*print) (defineVariableType_t event);
35 }s_defineVariableType_t;
37 typedef struct s_defineStateType *defineStateType_t;
38 typedef struct s_defineStateType {
41 void (*print) (defineStateType_t event);
44 typedef struct s_defineEventType *defineEventType_t;
45 typedef struct s_defineEventType {
48 void (*print) (defineEventType_t event);
51 typedef struct s_defineLinkType *defineLinkType_t;
52 typedef struct s_defineLinkType {
57 void (*print) (defineLinkType_t event);
60 typedef struct s_createContainer *createContainer_t;
61 typedef struct s_createContainer {
63 container_t container;
64 void (*print) (createContainer_t event);
67 typedef struct s_destroyContainer *destroyContainer_t;
68 typedef struct s_destroyContainer {
70 container_t container;
71 void (*print) (destroyContainer_t event);
72 }s_destroyContainer_t;
74 typedef struct s_setVariable *setVariable_t;
75 typedef struct s_setVariable {
77 container_t container;
80 void (*print) (setVariable_t event);
83 typedef struct s_addVariable *addVariable_t;
84 typedef struct s_addVariable {
86 container_t container;
89 void (*print) (addVariable_t event);
92 typedef struct s_subVariable *subVariable_t;
93 typedef struct s_subVariable {
95 container_t container;
98 void (*print) (subVariable_t event);
101 typedef struct s_setState *setState_t;
102 typedef struct s_setState {
103 s_paje_event_t event;
104 container_t container;
107 void (*print) (setState_t event);
110 typedef struct s_pushState *pushState_t;
111 typedef struct s_pushState {
112 s_paje_event_t event;
113 container_t container;
116 void (*print) (pushState_t event);
119 typedef struct s_popState *popState_t;
120 typedef struct s_popState {
121 s_paje_event_t event;
122 container_t container;
125 void (*print) (popState_t event);
128 typedef struct s_startLink *startLink_t;
129 typedef struct s_startLink {
130 s_paje_event_t event;
132 container_t container;
133 container_t sourceContainer;
136 void (*print) (startLink_t event);
139 typedef struct s_endLink *endLink_t;
140 typedef struct s_endLink {
141 s_paje_event_t event;
143 container_t container;
144 container_t destContainer;
147 void (*print) (endLink_t event);
150 typedef struct s_newEvent *newEvent_t;
151 typedef struct s_newEvent {
152 s_paje_event_t event;
154 container_t container;
156 void (*print) (newEvent_t event);
159 static FILE *tracing_file = NULL;
161 static int pajeDefineContainerTypeId = 0;
162 static int pajeDefineStateTypeId = 1;
163 static int pajeDefineEntityValueId = 2;
164 static int pajeDefineEventTypeId = 3;
165 static int pajeDefineLinkTypeId = 4;
166 static int pajeCreateContainerId = 5;
167 static int pajeSetStateId = 6;
169 static int pajePopStateId = 8;
170 static int pajeDestroyContainerId = 9;
173 static int pajeStartLinkId = 12;
174 static int pajeEndLinkId = 13;
180 static int pajePushStateId = 19;
181 static int pajeDefineEventTypeWithColorId = 20;
182 static int pajeDefineVariableTypeWithColorId = 21;
183 static int pajeSetVariableId = 22;
184 static int pajeAddVariableId = 23;
185 static int pajeSubVariableId = 24;
186 static int pajeDefineVariableTypeId = 25;
188 static int pajeNewEventId = 27;
190 #define TRACE_LINE_SIZE 1000
192 void TRACE_paje_start(void)
194 char *filename = TRACE_get_filename();
195 tracing_file = fopen(filename, "w");
196 xbt_assert1 (tracing_file != NULL, "Tracefile %s could not be opened for writing.", filename);
198 DEBUG1("Filename %s is open for writing", filename);
201 TRACE_paje_create_header();
204 void TRACE_paje_end(void)
206 fclose(tracing_file);
207 char *filename = TRACE_get_filename();
208 DEBUG1("Filename %s is closed", filename);
211 void TRACE_paje_create_header(void)
213 DEBUG0 ("Define paje header");
214 fprintf(tracing_file, "\
215 %%EventDef PajeDefineContainerType %d \n\
217 %% ContainerType string \n\
220 %%EventDef PajeDefineStateType %d \n\
222 %% ContainerType string \n\
225 %%EventDef PajeDefineEntityValue %d \n\
227 %% EntityType string \n\
230 %%EventDef PajeDefineEventType %d \n\
232 %% EntityType string \n\
236 %%EventDef PajeDefineEventType %d \n\
238 %% EntityType string \n\
241 %%EventDef PajeDefineLinkType %d \n\
243 %% ContainerType string \n\
244 %% SourceContainerType string \n\
245 %% DestContainerType string \n\
248 %%EventDef PajeCreateContainer %d \n\
252 %% Container string \n\
255 %%EventDef PajeDestroyContainer %d \n\
258 %% Container string \n\
260 %%EventDef PajeSetState %d \n\
262 %% EntityType string \n\
263 %% Container string \n\
266 %%EventDef PajePopState %d \n\
268 %% EntityType string \n\
269 %% Container string \n\
271 %%EventDef PajeStartLink %d \n\
273 %% EntityType string \n\
274 %% Container string \n\
276 %% SourceContainer string \n\
279 %%EventDef PajeEndLink %d \n\
281 %% EntityType string \n\
282 %% Container string \n\
284 %% DestContainer string \n\
287 %%EventDef PajePushState %d \n\
289 %% EntityType string \n\
290 %% Container string \n\
293 %%EventDef PajeSetVariable %d \n\
295 %% EntityType string \n\
296 %% Container string \n\
299 %%EventDef PajeAddVariable %d \n\
301 %% EntityType string \n\
302 %% Container string \n\
305 %%EventDef PajeSubVariable %d \n\
307 %% EntityType string \n\
308 %% Container string \n\
311 %%EventDef PajeDefineVariableType %d \n\
313 %% ContainerType string \n\
316 %%EventDef PajeDefineVariableType %d \n\
318 %% ContainerType string \n\
322 %%EventDef PajeNewEvent %d \n\
324 %% EntityType string \n\
325 %% Container string \n\
327 %%EndEventDef\n", pajeDefineContainerTypeId, pajeDefineStateTypeId, pajeDefineEntityValueId, pajeDefineEventTypeWithColorId, pajeDefineEventTypeId, pajeDefineLinkTypeId, pajeCreateContainerId, pajeDestroyContainerId, pajeSetStateId, pajePopStateId, pajeStartLinkId, pajeEndLinkId, pajePushStateId, pajeSetVariableId, pajeAddVariableId, pajeSubVariableId, pajeDefineVariableTypeId, pajeDefineVariableTypeWithColorId, pajeNewEventId);
330 /* internal do the instrumentation module */
331 static void print_pajeDefineContainerType(defineContainerType_t event)
333 fprintf(tracing_file, "%d %s %s %s\n",
336 event->type->father->id,
340 static void print_pajeDefineVariableType(defineVariableType_t event)
342 fprintf(tracing_file, "%d %s %s %s \"%s\"\n",
345 event->type->father->id,
350 static void print_pajeDefineStateType(defineStateType_t event)
352 fprintf(tracing_file, "%d %s %s %s\n",
355 event->type->father->id,
359 static void print_pajeDefineEventType(defineEventType_t event)
361 fprintf(tracing_file, "%d %s %s %s \"%s\"\n",
364 event->type->father->id,
369 static void print_pajeDefineLinkType(defineLinkType_t event)
371 fprintf(tracing_file, "%d %s %s %s %s %s\n",
374 event->type->father->id,
380 static void print_pajeCreateContainer(createContainer_t event)
382 if (event->event.timestamp == 0){
383 fprintf(tracing_file, "%d 0 %s %s %s %s\n",
385 event->container->id,
386 event->container->type->id,
387 event->container->father->id,
388 event->container->name);
390 fprintf(tracing_file, "%d %lf %s %s %s %s\n",
392 event->event.timestamp,
393 event->container->id,
394 event->container->type->id,
395 event->container->father->id,
396 event->container->name);
400 static void print_pajeDestroyContainer(destroyContainer_t event)
402 if (event->event.timestamp == 0){
403 fprintf(tracing_file, "%d 0 %s %s\n",
405 event->container->type->id,
406 event->container->id);
408 fprintf(tracing_file, "%d %lf %s %s\n",
410 event->event.timestamp,
411 event->container->type->id,
412 event->container->id);
416 static void print_pajeSetVariable(setVariable_t event)
418 if (event->event.timestamp == 0){
419 fprintf(tracing_file, "%d 0 %s %s %f\n",
422 event->container->id,
425 fprintf(tracing_file, "%d %lf %s %s %f\n",
427 event->event.timestamp,
429 event->container->id,
434 static void print_pajeAddVariable(addVariable_t event)
436 if (event->event.timestamp == 0){
437 fprintf(tracing_file, "%d 0 %s %s %f\n",
440 event->container->id,
443 fprintf(tracing_file, "%d %lf %s %s %f\n",
445 event->event.timestamp,
447 event->container->id,
452 static void print_pajeSubVariable(subVariable_t event)
454 if (event->event.timestamp == 0){
455 fprintf(tracing_file, "%d 0 %s %s %f\n",
458 event->container->id,
461 fprintf(tracing_file, "%d %lf %s %s %f\n",
463 event->event.timestamp,
465 event->container->id,
470 static void print_pajeSetState(setState_t event)
472 if (event->event.timestamp == 0){
473 fprintf(tracing_file, "%d 0 %s %s %s\n",
476 event->container->id,
479 fprintf(tracing_file, "%d %lf %s %s %s\n",
481 event->event.timestamp,
483 event->container->id,
488 static void print_pajePushState(pushState_t event)
490 if (event->event.timestamp == 0){
491 fprintf(tracing_file, "%d 0 %s %s %s\n",
494 event->container->id,
497 fprintf(tracing_file, "%d %lf %s %s %s\n",
499 event->event.timestamp,
501 event->container->id,
506 static void print_pajePopState(popState_t event)
508 if (event->event.timestamp == 0){
509 fprintf(tracing_file, "%d 0 %s %s\n",
512 event->container->id);
514 fprintf(tracing_file, "%d %lf %s %s\n",
516 event->event.timestamp,
518 event->container->id);
522 static void print_pajeStartLink(startLink_t event)
524 if (event->event.timestamp == 0){
525 fprintf(tracing_file, "%d 0 %s %s %s %s %s\n",
528 event->container->id,
530 event->sourceContainer->id,
533 fprintf(tracing_file, "%d %lf %s %s %s %s %s\n",
535 event->event.timestamp,
537 event->container->id,
539 event->sourceContainer->id,
544 static void print_pajeEndLink(endLink_t event)
546 if (event->event.timestamp == 0){
547 fprintf(tracing_file, "%d 0 %s %s %s %s %s\n",
550 event->container->id,
552 event->destContainer->id,
555 fprintf(tracing_file, "%d %lf %s %s %s %s %s\n",
557 event->event.timestamp,
559 event->container->id,
561 event->destContainer->id,
566 static void print_pajeNewEvent (newEvent_t event)
568 if (event->event.timestamp == 0){
569 fprintf(tracing_file, "%d 0 %s %s %s\n",
572 event->container->id,
575 fprintf(tracing_file, "%d %lf %s %s %s\n",
577 event->event.timestamp,
579 event->container->id,
584 void new_pajeDefineContainerType(type_t type)
586 defineContainerType_t event = xbt_new0(s_defineContainerType_t, 1);
588 event->print = print_pajeDefineContainerType;
589 event->event.name = xbt_strdup("PajeDefineContainerType");
590 event->event.id = pajeDefineContainerTypeId;
591 event->event.timestamp = 0;
592 event->event.header = xbt_strdup("");
595 event->print (event);
598 xbt_free (event->event.name);
599 xbt_free (event->event.header);
604 void new_pajeDefineVariableType(type_t type)
606 defineVariableType_t event = xbt_new0(s_defineVariableType_t, 1);
608 event->print = print_pajeDefineVariableType;
609 event->event.name = xbt_strdup("PajeDefineVariableType");
610 event->event.id = pajeDefineVariableTypeWithColorId;
611 event->event.timestamp = 0;
612 event->event.header = xbt_strdup ("");
615 event->print (event);
618 xbt_free (event->event.name);
619 xbt_free (event->event.header);
624 void new_pajeDefineStateType(type_t type)
626 defineStateType_t event = xbt_new0(s_defineStateType_t, 1);
628 event->print = print_pajeDefineStateType;
629 event->event.name = xbt_strdup("PajeDefineStateType");
630 event->event.id = pajeDefineStateTypeId;
631 event->event.timestamp = 0;
632 event->event.header = xbt_strdup ("");
635 event->print (event);
638 xbt_free (event->event.name);
639 xbt_free (event->event.header);
644 void new_pajeDefineEventType(type_t type)
646 defineEventType_t event = xbt_new0(s_defineEventType_t, 1);
648 event->print = print_pajeDefineEventType;
649 event->event.name = xbt_strdup("PajeDefineEventType");
650 event->event.id = pajeDefineEventTypeWithColorId;
651 event->event.timestamp = 0;
652 event->event.header = xbt_strdup ("");
655 event->print (event);
658 xbt_free (event->event.name);
659 xbt_free (event->event.header);
664 void new_pajeDefineLinkType(type_t type, type_t source, type_t dest)
666 defineLinkType_t event = xbt_new0(s_defineLinkType_t, 1);
668 event->source = source;
670 event->print = print_pajeDefineLinkType;
671 event->event.name = xbt_strdup("PajeDefineLinkType");
672 event->event.id = pajeDefineLinkTypeId;
673 event->event.timestamp = 0;
674 event->event.header = xbt_strdup ("");
677 event->print (event);
680 xbt_free (event->event.name);
681 xbt_free (event->event.header);
686 void new_pajeCreateContainer (container_t container)
688 createContainer_t event = xbt_new0(s_createContainer_t, 1);
689 event->container = container;
690 event->print = print_pajeCreateContainer;
691 event->event.name = xbt_strdup("PajeCreateContainer");
692 event->event.id = pajeCreateContainerId;
693 event->event.timestamp = SIMIX_get_clock();
694 event->event.header = xbt_strdup("");
697 event->print (event);
700 xbt_free (event->event.name);
701 xbt_free (event->event.header);
706 void new_pajeDestroyContainer (container_t container)
708 destroyContainer_t event = xbt_new0(s_destroyContainer_t, 1);
709 event->container = container;
710 event->print = print_pajeDestroyContainer;
711 event->event.name = xbt_strdup("PajeDestroyContainer");
712 event->event.id = pajeDestroyContainerId;
713 event->event.timestamp = SIMIX_get_clock();
714 event->event.header = xbt_strdup("");
717 event->print (event);
720 xbt_free (event->event.name);
721 xbt_free (event->event.header);
725 fflush (tracing_file);
728 void new_pajeSetVariable (double timestamp, container_t container, type_t type, double value)
730 setVariable_t event = xbt_new0(s_setVariable_t, 1);
732 event->container = container;
733 event->value = value;
734 event->print = print_pajeSetVariable;
735 event->event.name = xbt_strdup("PajeSetVariable");
736 event->event.id = pajeSetVariableId;
737 event->event.timestamp = timestamp;
738 event->event.header = xbt_strdup("");
741 event->print (event);
744 xbt_free (event->event.name);
745 xbt_free (event->event.header);
751 void new_pajeAddVariable (double timestamp, container_t container, type_t type, double value)
753 addVariable_t event = xbt_new0(s_addVariable_t, 1);
755 event->container = container;
756 event->value = value;
757 event->print = print_pajeAddVariable;
758 event->event.name = xbt_strdup("PajeAddVariable");
759 event->event.id = pajeAddVariableId;
760 event->event.timestamp = timestamp;
761 event->event.header = xbt_strdup("");
764 event->print (event);
767 xbt_free (event->event.name);
768 xbt_free (event->event.header);
773 void new_pajeSubVariable (double timestamp, container_t container, type_t type, double value)
775 subVariable_t event = xbt_new0(s_subVariable_t, 1);
777 event->container = container;
778 event->value = value;
779 event->print = print_pajeSubVariable;
780 event->event.name = xbt_strdup("PajeSubVariable");
781 event->event.id = pajeSubVariableId;
782 event->event.timestamp = timestamp;
783 event->event.header = xbt_strdup("");
786 event->print (event);
789 xbt_free (event->event.name);
790 xbt_free (event->event.header);
795 void new_pajeSetState (double timestamp, container_t container, type_t type, const char *value)
797 setState_t event = xbt_new0(s_setState_t, 1);
799 event->container = container;
800 event->value = xbt_strdup(value);
801 event->print = print_pajeSetState;
802 event->event.name = xbt_strdup("PajeSetState");
803 event->event.id = pajeSetStateId;
804 event->event.timestamp = timestamp;
805 event->event.header = xbt_strdup("");
808 event->print (event);
811 xbt_free (event->value);
812 xbt_free (event->event.name);
813 xbt_free (event->event.header);
819 void new_pajePushState (double timestamp, container_t container, type_t type, const char *value)
821 pushState_t event = xbt_new0(s_pushState_t, 1);
823 event->container = container;
824 event->value = xbt_strdup(value);
825 event->print = print_pajePushState;
826 event->event.name = xbt_strdup("PajePushState");
827 event->event.id = pajePushStateId;
828 event->event.timestamp = timestamp;
829 event->event.header = xbt_strdup("");
832 event->print (event);
835 xbt_free (event->value);
836 xbt_free (event->event.name);
837 xbt_free (event->event.header);
843 void new_pajePopState (double timestamp, container_t container, type_t type)
845 popState_t event = xbt_new0(s_popState_t, 1);
847 event->container = container;
848 event->print = print_pajePopState;
849 event->event.name = xbt_strdup("PajePopState");
850 event->event.id = pajePopStateId;
851 event->event.timestamp = timestamp;
852 event->event.header = xbt_strdup("");
855 event->print (event);
858 xbt_free (event->event.name);
859 xbt_free (event->event.header);
864 void new_pajeStartLink (double timestamp, container_t container, type_t type, container_t sourceContainer, const char *value, const char *key)
866 startLink_t event = xbt_new0(s_startLink_t, 1);
868 event->container = container;
869 event->sourceContainer = sourceContainer;
870 event->value = xbt_strdup (value);
871 event->key = xbt_strdup (key);
872 event->print = print_pajeStartLink;
873 event->event.name = xbt_strdup("PajeStartLink");
874 event->event.id = pajeStartLinkId;
875 event->event.timestamp = timestamp;
876 event->event.header = xbt_strdup("");
879 event->print (event);
882 xbt_free (event->value);
883 xbt_free (event->key);
884 xbt_free (event->event.name);
885 xbt_free (event->event.header);
890 void new_pajeEndLink (double timestamp, container_t container, type_t type, container_t destContainer, const char *value, const char *key)
892 endLink_t event = xbt_new0(s_endLink_t, 1);
894 event->container = container;
895 event->destContainer = destContainer;
896 event->value = xbt_strdup (value);
897 event->key = xbt_strdup (key);
898 event->print = print_pajeEndLink;
899 event->event.name = xbt_strdup("PajeEndLink");
900 event->event.id = pajeEndLinkId;
901 event->event.timestamp = timestamp;
902 event->event.header = xbt_strdup("");
905 event->print (event);
908 xbt_free (event->value);
909 xbt_free (event->key);
910 xbt_free (event->event.name);
911 xbt_free (event->event.header);
916 void new_pajeNewEvent (double timestamp, container_t container, type_t type, const char *value)
918 newEvent_t event = xbt_new0(s_newEvent_t, 1);
920 event->container = container;
921 event->value = xbt_strdup (value);
922 event->print = print_pajeNewEvent;
923 event->event.name = xbt_strdup("PajeNewEvent");
924 event->event.id = pajeNewEventId;
925 event->event.timestamp = timestamp;
926 event->event.header = xbt_strdup("");
929 event->print (event);
932 xbt_free (event->value);
933 xbt_free (event->event.name);
934 xbt_free (event->event.header);
939 //void pajeNewEvent(double time, const char *entityType,
940 // const char *container, const char *value)
942 // INSTR_PAJE_ASSERT(entityType);
943 // INSTR_PAJE_ASSERT(container);
944 // INSTR_PAJE_ASSERT(value);
947 // fprintf(tracing_file, "%d 0 %s %s %s\n", pajeNewEventId,
948 // entityType, container, value);
950 // fprintf(tracing_file, "%d %lf %s %s %s\n", pajeNewEventId, time,
951 // entityType, container, value);
955 #endif /* HAVE_TRACING */