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 {
21 typedef struct s_defineContainerType *defineContainerType_t;
22 typedef struct s_defineContainerType {
25 void (*print) (defineContainerType_t event);
26 }s_defineContainerType_t;
28 typedef struct s_defineVariableType *defineVariableType_t;
29 typedef struct s_defineVariableType {
32 void (*print) (defineVariableType_t event);
33 }s_defineVariableType_t;
35 typedef struct s_defineStateType *defineStateType_t;
36 typedef struct s_defineStateType {
39 void (*print) (defineStateType_t event);
42 typedef struct s_defineEventType *defineEventType_t;
43 typedef struct s_defineEventType {
46 void (*print) (defineEventType_t event);
49 typedef struct s_defineLinkType *defineLinkType_t;
50 typedef struct s_defineLinkType {
55 void (*print) (defineLinkType_t event);
58 typedef struct s_createContainer *createContainer_t;
59 typedef struct s_createContainer {
61 container_t container;
62 void (*print) (createContainer_t event);
65 typedef struct s_destroyContainer *destroyContainer_t;
66 typedef struct s_destroyContainer {
68 container_t container;
69 void (*print) (destroyContainer_t event);
70 }s_destroyContainer_t;
72 typedef struct s_setVariable *setVariable_t;
73 typedef struct s_setVariable {
75 container_t container;
78 void (*print) (setVariable_t event);
81 typedef struct s_addVariable *addVariable_t;
82 typedef struct s_addVariable {
84 container_t container;
87 void (*print) (addVariable_t event);
90 typedef struct s_subVariable *subVariable_t;
91 typedef struct s_subVariable {
93 container_t container;
96 void (*print) (subVariable_t event);
99 typedef struct s_setState *setState_t;
100 typedef struct s_setState {
101 s_paje_event_t event;
102 container_t container;
105 void (*print) (setState_t event);
108 typedef struct s_pushState *pushState_t;
109 typedef struct s_pushState {
110 s_paje_event_t event;
111 container_t container;
114 void (*print) (pushState_t event);
117 typedef struct s_popState *popState_t;
118 typedef struct s_popState {
119 s_paje_event_t event;
120 container_t container;
123 void (*print) (popState_t event);
126 typedef struct s_startLink *startLink_t;
127 typedef struct s_startLink {
128 s_paje_event_t event;
130 container_t container;
131 container_t sourceContainer;
134 void (*print) (startLink_t event);
137 typedef struct s_endLink *endLink_t;
138 typedef struct s_endLink {
139 s_paje_event_t event;
141 container_t container;
142 container_t destContainer;
145 void (*print) (endLink_t event);
148 typedef struct s_newEvent *newEvent_t;
149 typedef struct s_newEvent {
150 s_paje_event_t event;
152 container_t container;
154 void (*print) (newEvent_t event);
157 static FILE *tracing_file = NULL;
159 static int pajeDefineContainerTypeId = 0;
160 static int pajeDefineStateTypeId = 1;
161 static int pajeDefineEntityValueId = 2;
162 static int pajeDefineEventTypeId = 3;
163 static int pajeDefineLinkTypeId = 4;
164 static int pajeCreateContainerId = 5;
165 static int pajeSetStateId = 6;
167 static int pajePopStateId = 8;
168 static int pajeDestroyContainerId = 9;
171 static int pajeStartLinkId = 12;
172 static int pajeEndLinkId = 13;
178 static int pajePushStateId = 19;
179 static int pajeDefineEventTypeWithColorId = 20;
180 static int pajeDefineVariableTypeWithColorId = 21;
181 static int pajeSetVariableId = 22;
182 static int pajeAddVariableId = 23;
183 static int pajeSubVariableId = 24;
184 static int pajeDefineVariableTypeId = 25;
186 static int pajeNewEventId = 27;
188 #define TRACE_LINE_SIZE 1000
190 void TRACE_paje_start(void)
192 char *filename = TRACE_get_filename();
193 tracing_file = fopen(filename, "w");
194 xbt_assert1 (tracing_file != NULL, "Tracefile %s could not be opened for writing.", filename);
196 DEBUG1("Filename %s is open for writing", filename);
199 TRACE_paje_create_header();
202 void TRACE_paje_end(void)
204 fclose(tracing_file);
205 char *filename = TRACE_get_filename();
206 DEBUG1("Filename %s is closed", filename);
209 void TRACE_paje_create_header(void)
211 DEBUG0 ("Define paje header");
212 fprintf(tracing_file, "\
213 %%EventDef PajeDefineContainerType %d \n\
215 %% ContainerType string \n\
218 %%EventDef PajeDefineStateType %d \n\
220 %% ContainerType string \n\
223 %%EventDef PajeDefineEntityValue %d \n\
225 %% EntityType string \n\
228 %%EventDef PajeDefineEventType %d \n\
230 %% EntityType string \n\
234 %%EventDef PajeDefineEventType %d \n\
236 %% EntityType string \n\
239 %%EventDef PajeDefineLinkType %d \n\
241 %% ContainerType string \n\
242 %% SourceContainerType string \n\
243 %% DestContainerType string \n\
246 %%EventDef PajeCreateContainer %d \n\
250 %% Container string \n\
253 %%EventDef PajeDestroyContainer %d \n\
256 %% Container string \n\
258 %%EventDef PajeSetState %d \n\
260 %% EntityType string \n\
261 %% Container string \n\
264 %%EventDef PajePopState %d \n\
266 %% EntityType string \n\
267 %% Container string \n\
269 %%EventDef PajeStartLink %d \n\
271 %% EntityType string \n\
272 %% Container string \n\
274 %% SourceContainer string \n\
277 %%EventDef PajeEndLink %d \n\
279 %% EntityType string \n\
280 %% Container string \n\
282 %% DestContainer string \n\
285 %%EventDef PajePushState %d \n\
287 %% EntityType string \n\
288 %% Container string \n\
291 %%EventDef PajeSetVariable %d \n\
293 %% EntityType string \n\
294 %% Container string \n\
297 %%EventDef PajeAddVariable %d \n\
299 %% EntityType string \n\
300 %% Container string \n\
303 %%EventDef PajeSubVariable %d \n\
305 %% EntityType string \n\
306 %% Container string \n\
309 %%EventDef PajeDefineVariableType %d \n\
311 %% ContainerType string \n\
314 %%EventDef PajeDefineVariableType %d \n\
316 %% ContainerType string \n\
320 %%EventDef PajeNewEvent %d \n\
322 %% EntityType string \n\
323 %% Container string \n\
325 %%EndEventDef\n", pajeDefineContainerTypeId, pajeDefineStateTypeId, pajeDefineEntityValueId, pajeDefineEventTypeWithColorId, pajeDefineEventTypeId, pajeDefineLinkTypeId, pajeCreateContainerId, pajeDestroyContainerId, pajeSetStateId, pajePopStateId, pajeStartLinkId, pajeEndLinkId, pajePushStateId, pajeSetVariableId, pajeAddVariableId, pajeSubVariableId, pajeDefineVariableTypeId, pajeDefineVariableTypeWithColorId, pajeNewEventId);
328 /* internal do the instrumentation module */
329 static void print_pajeDefineContainerType(defineContainerType_t event)
331 fprintf(tracing_file, "%d %s %s %s\n",
334 event->type->father->id,
338 static void print_pajeDefineVariableType(defineVariableType_t event)
340 fprintf(tracing_file, "%d %s %s %s \"%s\"\n",
343 event->type->father->id,
348 static void print_pajeDefineStateType(defineStateType_t event)
350 fprintf(tracing_file, "%d %s %s %s\n",
353 event->type->father->id,
357 static void print_pajeDefineEventType(defineEventType_t event)
359 fprintf(tracing_file, "%d %s %s %s \"%s\"\n",
362 event->type->father->id,
367 static void print_pajeDefineLinkType(defineLinkType_t event)
369 fprintf(tracing_file, "%d %s %s %s %s %s\n",
372 event->type->father->id,
378 static void print_pajeCreateContainer(createContainer_t event)
380 if (event->event.timestamp == 0){
381 fprintf(tracing_file, "%d 0 %s %s %s %s\n",
383 event->container->id,
384 event->container->type->id,
385 event->container->father->id,
386 event->container->name);
388 fprintf(tracing_file, "%d %lf %s %s %s %s\n",
390 event->event.timestamp,
391 event->container->id,
392 event->container->type->id,
393 event->container->father->id,
394 event->container->name);
398 static void print_pajeDestroyContainer(destroyContainer_t event)
400 if (event->event.timestamp == 0){
401 fprintf(tracing_file, "%d 0 %s %s\n",
403 event->container->type->id,
404 event->container->id);
406 fprintf(tracing_file, "%d %lf %s %s\n",
408 event->event.timestamp,
409 event->container->type->id,
410 event->container->id);
414 static void print_pajeSetVariable(setVariable_t event)
416 if (event->event.timestamp == 0){
417 fprintf(tracing_file, "%d 0 %s %s %f\n",
420 event->container->id,
423 fprintf(tracing_file, "%d %lf %s %s %f\n",
425 event->event.timestamp,
427 event->container->id,
432 static void print_pajeAddVariable(addVariable_t event)
434 if (event->event.timestamp == 0){
435 fprintf(tracing_file, "%d 0 %s %s %f\n",
438 event->container->id,
441 fprintf(tracing_file, "%d %lf %s %s %f\n",
443 event->event.timestamp,
445 event->container->id,
450 static void print_pajeSubVariable(subVariable_t event)
452 if (event->event.timestamp == 0){
453 fprintf(tracing_file, "%d 0 %s %s %f\n",
456 event->container->id,
459 fprintf(tracing_file, "%d %lf %s %s %f\n",
461 event->event.timestamp,
463 event->container->id,
468 static void print_pajeSetState(setState_t event)
470 if (event->event.timestamp == 0){
471 fprintf(tracing_file, "%d 0 %s %s %s\n",
474 event->container->id,
477 fprintf(tracing_file, "%d %lf %s %s %s\n",
479 event->event.timestamp,
481 event->container->id,
486 static void print_pajePushState(pushState_t event)
488 if (event->event.timestamp == 0){
489 fprintf(tracing_file, "%d 0 %s %s %s\n",
492 event->container->id,
495 fprintf(tracing_file, "%d %lf %s %s %s\n",
497 event->event.timestamp,
499 event->container->id,
504 static void print_pajePopState(popState_t event)
506 if (event->event.timestamp == 0){
507 fprintf(tracing_file, "%d 0 %s %s\n",
510 event->container->id);
512 fprintf(tracing_file, "%d %lf %s %s\n",
514 event->event.timestamp,
516 event->container->id);
520 static void print_pajeStartLink(startLink_t event)
522 if (event->event.timestamp == 0){
523 fprintf(tracing_file, "%d 0 %s %s %s %s %s\n",
526 event->container->id,
528 event->sourceContainer->id,
531 fprintf(tracing_file, "%d %lf %s %s %s %s %s\n",
533 event->event.timestamp,
535 event->container->id,
537 event->sourceContainer->id,
542 static void print_pajeEndLink(endLink_t event)
544 if (event->event.timestamp == 0){
545 fprintf(tracing_file, "%d 0 %s %s %s %s %s\n",
548 event->container->id,
550 event->destContainer->id,
553 fprintf(tracing_file, "%d %lf %s %s %s %s %s\n",
555 event->event.timestamp,
557 event->container->id,
559 event->destContainer->id,
564 static void print_pajeNewEvent (newEvent_t event)
566 if (event->event.timestamp == 0){
567 fprintf(tracing_file, "%d 0 %s %s %s\n",
570 event->container->id,
573 fprintf(tracing_file, "%d %lf %s %s %s\n",
575 event->event.timestamp,
577 event->container->id,
582 void new_pajeDefineContainerType(type_t type)
584 defineContainerType_t event = xbt_new0(s_defineContainerType_t, 1);
586 event->print = print_pajeDefineContainerType;
587 event->event.id = pajeDefineContainerTypeId;
588 event->event.timestamp = 0;
591 event->print (event);
598 void new_pajeDefineVariableType(type_t type)
600 defineVariableType_t event = xbt_new0(s_defineVariableType_t, 1);
602 event->print = print_pajeDefineVariableType;
603 event->event.id = pajeDefineVariableTypeWithColorId;
604 event->event.timestamp = 0;
607 event->print (event);
614 void new_pajeDefineStateType(type_t type)
616 defineStateType_t event = xbt_new0(s_defineStateType_t, 1);
618 event->print = print_pajeDefineStateType;
619 event->event.id = pajeDefineStateTypeId;
620 event->event.timestamp = 0;
623 event->print (event);
630 void new_pajeDefineEventType(type_t type)
632 defineEventType_t event = xbt_new0(s_defineEventType_t, 1);
634 event->print = print_pajeDefineEventType;
635 event->event.id = pajeDefineEventTypeWithColorId;
636 event->event.timestamp = 0;
639 event->print (event);
646 void new_pajeDefineLinkType(type_t type, type_t source, type_t dest)
648 defineLinkType_t event = xbt_new0(s_defineLinkType_t, 1);
650 event->source = source;
652 event->print = print_pajeDefineLinkType;
653 event->event.id = pajeDefineLinkTypeId;
654 event->event.timestamp = 0;
657 event->print (event);
664 void new_pajeCreateContainer (container_t container)
666 createContainer_t event = xbt_new0(s_createContainer_t, 1);
667 event->container = container;
668 event->print = print_pajeCreateContainer;
669 event->event.id = pajeCreateContainerId;
670 event->event.timestamp = SIMIX_get_clock();
673 event->print (event);
680 void new_pajeDestroyContainer (container_t container)
682 destroyContainer_t event = xbt_new0(s_destroyContainer_t, 1);
683 event->container = container;
684 event->print = print_pajeDestroyContainer;
685 event->event.id = pajeDestroyContainerId;
686 event->event.timestamp = SIMIX_get_clock();
689 event->print (event);
695 fflush (tracing_file);
698 void new_pajeSetVariable (double timestamp, container_t container, type_t type, double value)
700 setVariable_t event = xbt_new0(s_setVariable_t, 1);
702 event->container = container;
703 event->value = value;
704 event->print = print_pajeSetVariable;
705 event->event.id = pajeSetVariableId;
706 event->event.timestamp = timestamp;
709 event->print (event);
717 void new_pajeAddVariable (double timestamp, container_t container, type_t type, double value)
719 addVariable_t event = xbt_new0(s_addVariable_t, 1);
721 event->container = container;
722 event->value = value;
723 event->print = print_pajeAddVariable;
724 event->event.id = pajeAddVariableId;
725 event->event.timestamp = timestamp;
728 event->print (event);
735 void new_pajeSubVariable (double timestamp, container_t container, type_t type, double value)
737 subVariable_t event = xbt_new0(s_subVariable_t, 1);
739 event->container = container;
740 event->value = value;
741 event->print = print_pajeSubVariable;
742 event->event.id = pajeSubVariableId;
743 event->event.timestamp = timestamp;
746 event->print (event);
753 void new_pajeSetState (double timestamp, container_t container, type_t type, const char *value)
755 setState_t event = xbt_new0(s_setState_t, 1);
757 event->container = container;
758 event->value = xbt_strdup(value);
759 event->print = print_pajeSetState;
760 event->event.id = pajeSetStateId;
761 event->event.timestamp = timestamp;
764 event->print (event);
767 xbt_free (event->value);
773 void new_pajePushState (double timestamp, container_t container, type_t type, const char *value)
775 pushState_t event = xbt_new0(s_pushState_t, 1);
777 event->container = container;
778 event->value = xbt_strdup(value);
779 event->print = print_pajePushState;
780 event->event.id = pajePushStateId;
781 event->event.timestamp = timestamp;
784 event->print (event);
787 xbt_free (event->value);
793 void new_pajePopState (double timestamp, container_t container, type_t type)
795 popState_t event = xbt_new0(s_popState_t, 1);
797 event->container = container;
798 event->print = print_pajePopState;
799 event->event.id = pajePopStateId;
800 event->event.timestamp = timestamp;
803 event->print (event);
810 void new_pajeStartLink (double timestamp, container_t container, type_t type, container_t sourceContainer, const char *value, const char *key)
812 startLink_t event = xbt_new0(s_startLink_t, 1);
814 event->container = container;
815 event->sourceContainer = sourceContainer;
816 event->value = xbt_strdup (value);
817 event->key = xbt_strdup (key);
818 event->print = print_pajeStartLink;
819 event->event.id = pajeStartLinkId;
820 event->event.timestamp = timestamp;
823 event->print (event);
826 xbt_free (event->value);
827 xbt_free (event->key);
832 void new_pajeEndLink (double timestamp, container_t container, type_t type, container_t destContainer, const char *value, const char *key)
834 endLink_t event = xbt_new0(s_endLink_t, 1);
836 event->container = container;
837 event->destContainer = destContainer;
838 event->value = xbt_strdup (value);
839 event->key = xbt_strdup (key);
840 event->print = print_pajeEndLink;
841 event->event.id = pajeEndLinkId;
842 event->event.timestamp = timestamp;
845 event->print (event);
848 xbt_free (event->value);
849 xbt_free (event->key);
854 void new_pajeNewEvent (double timestamp, container_t container, type_t type, const char *value)
856 newEvent_t event = xbt_new0(s_newEvent_t, 1);
858 event->container = container;
859 event->value = xbt_strdup (value);
860 event->print = print_pajeNewEvent;
861 event->event.id = pajeNewEventId;
862 event->event.timestamp = timestamp;
865 event->print (event);
868 xbt_free (event->value);
873 //void pajeNewEvent(double time, const char *entityType,
874 // const char *container, const char *value)
876 // INSTR_PAJE_ASSERT(entityType);
877 // INSTR_PAJE_ASSERT(container);
878 // INSTR_PAJE_ASSERT(value);
881 // fprintf(tracing_file, "%d 0 %s %s %s\n", pajeNewEventId,
882 // entityType, container, value);
884 // fprintf(tracing_file, "%d %lf %s %s %s\n", pajeNewEventId, time,
885 // entityType, container, value);
889 #endif /* HAVE_TRACING */