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;
148 static xbt_dynar_t buffer = NULL;
150 void TRACE_paje_start(void)
152 char *filename = TRACE_get_filename();
153 tracing_file = fopen(filename, "w");
154 xbt_assert1 (tracing_file != NULL, "Tracefile %s could not be opened for writing.", filename);
156 DEBUG1("Filename %s is open for writing", filename);
159 TRACE_paje_create_header();
161 buffer = xbt_dynar_new (sizeof(paje_event_t), NULL);
164 void TRACE_paje_end(void)
166 fclose(tracing_file);
167 char *filename = TRACE_get_filename();
168 DEBUG1("Filename %s is closed", filename);
171 void TRACE_paje_dump_buffer (void)
174 while (xbt_dynar_length (buffer) > 0){
175 xbt_dynar_remove_at (buffer, 0, &event);
176 event->print (event);
180 void TRACE_paje_create_header(void)
182 DEBUG0 ("Define paje header");
183 fprintf(tracing_file, "\
184 %%EventDef PajeDefineContainerType %d \n\
186 %% ContainerType string \n\
189 %%EventDef PajeDefineVariableType %d \n\
191 %% ContainerType string \n\
195 %%EventDef PajeDefineStateType %d \n\
197 %% ContainerType string \n\
200 %%EventDef PajeDefineEventType %d \n\
202 %% EntityType string \n\
206 %%EventDef PajeDefineLinkType %d \n\
208 %% ContainerType string \n\
209 %% SourceContainerType string \n\
210 %% DestContainerType string \n\
213 %%EventDef PajeCreateContainer %d \n\
217 %% Container string \n\
220 %%EventDef PajeDestroyContainer %d \n\
223 %% Container string \n\
225 %%EventDef PajeSetVariable %d \n\
227 %% EntityType string \n\
228 %% Container string \n\
231 %%EventDef PajeAddVariable %d \n\
233 %% EntityType string \n\
234 %% Container string \n\
237 %%EventDef PajeSubVariable %d \n\
239 %% EntityType string \n\
240 %% Container string \n\
243 %%EventDef PajeSetState %d \n\
245 %% EntityType string \n\
246 %% Container string \n\
249 %%EventDef PajePushState %d \n\
251 %% EntityType string \n\
252 %% Container string \n\
255 %%EventDef PajePopState %d \n\
257 %% EntityType string \n\
258 %% Container string \n\
260 %%EventDef PajeStartLink %d \n\
262 %% EntityType string \n\
263 %% Container string \n\
265 %% SourceContainer string \n\
268 %%EventDef PajeEndLink %d \n\
270 %% EntityType string \n\
271 %% Container string \n\
273 %% DestContainer string \n\
276 %%EventDef PajeNewEvent %d \n\
278 %% EntityType string \n\
279 %% Container string \n\
282 PAJE_DefineContainerType,
283 PAJE_DefineVariableType,
284 PAJE_DefineStateType,
285 PAJE_DefineEventType,
287 PAJE_CreateContainer,
288 PAJE_DestroyContainer,
300 /* internal do the instrumentation module */
301 static void insert_into_buffer (paje_event_t tbi)
304 if (xbt_dynar_length(buffer) == 0){
305 xbt_dynar_push (buffer, &tbi);
308 for (i = 0; i < xbt_dynar_length(buffer); i++){
309 paje_event_t e1 = *(paje_event_t*)xbt_dynar_get_ptr(buffer, i);
310 if (e1->timestamp > tbi->timestamp){
311 xbt_dynar_insert_at (buffer, i, &tbi);
317 xbt_dynar_push (buffer, &tbi);
322 static void print_pajeDefineContainerType(paje_event_t event)
324 fprintf(tracing_file, "%d %s %s %s\n",
326 ((defineContainerType_t)event->data)->type->id,
327 ((defineContainerType_t)event->data)->type->father->id,
328 ((defineContainerType_t)event->data)->type->name);
331 static void print_pajeDefineVariableType(paje_event_t event)
333 fprintf(tracing_file, "%d %s %s %s \"%s\"\n",
335 ((defineVariableType_t)event->data)->type->id,
336 ((defineVariableType_t)event->data)->type->father->id,
337 ((defineVariableType_t)event->data)->type->name,
338 ((defineVariableType_t)event->data)->type->color);
341 static void print_pajeDefineStateType(paje_event_t event)
343 fprintf(tracing_file, "%d %s %s %s\n",
345 ((defineStateType_t)event->data)->type->id,
346 ((defineStateType_t)event->data)->type->father->id,
347 ((defineStateType_t)event->data)->type->name);
350 static void print_pajeDefineEventType(paje_event_t event)
352 fprintf(tracing_file, "%d %s %s %s \"%s\"\n",
354 ((defineEventType_t)event->data)->type->id,
355 ((defineEventType_t)event->data)->type->father->id,
356 ((defineEventType_t)event->data)->type->name,
357 ((defineEventType_t)event->data)->type->color);
360 static void print_pajeDefineLinkType(paje_event_t event)
362 fprintf(tracing_file, "%d %s %s %s %s %s\n",
364 ((defineLinkType_t)event->data)->type->id,
365 ((defineLinkType_t)event->data)->type->father->id,
366 ((defineLinkType_t)event->data)->source->id,
367 ((defineLinkType_t)event->data)->dest->id,
368 ((defineLinkType_t)event->data)->type->name);
371 static void print_pajeCreateContainer(paje_event_t event)
373 if (event->timestamp == 0){
374 fprintf(tracing_file, "%d 0 %s %s %s %s\n",
376 ((createContainer_t)event->data)->container->id,
377 ((createContainer_t)event->data)->container->type->id,
378 ((createContainer_t)event->data)->container->father->id,
379 ((createContainer_t)event->data)->container->name);
381 fprintf(tracing_file, "%d %lf %s %s %s %s\n",
384 ((createContainer_t)event->data)->container->id,
385 ((createContainer_t)event->data)->container->type->id,
386 ((createContainer_t)event->data)->container->father->id,
387 ((createContainer_t)event->data)->container->name);
391 static void print_pajeDestroyContainer(paje_event_t event)
393 if (event->timestamp == 0){
394 fprintf(tracing_file, "%d 0 %s %s\n",
396 ((destroyContainer_t)event->data)->container->type->id,
397 ((destroyContainer_t)event->data)->container->id);
399 fprintf(tracing_file, "%d %lf %s %s\n",
402 ((destroyContainer_t)event->data)->container->type->id,
403 ((destroyContainer_t)event->data)->container->id);
407 static void print_pajeSetVariable(paje_event_t event)
409 if (event->timestamp == 0){
410 fprintf(tracing_file, "%d 0 %s %s %f\n",
412 ((setVariable_t)event->data)->type->id,
413 ((setVariable_t)event->data)->container->id,
414 ((setVariable_t)event->data)->value);
416 fprintf(tracing_file, "%d %lf %s %s %f\n",
419 ((setVariable_t)event->data)->type->id,
420 ((setVariable_t)event->data)->container->id,
421 ((setVariable_t)event->data)->value);
425 static void print_pajeAddVariable(paje_event_t event)
427 if (event->timestamp == 0){
428 fprintf(tracing_file, "%d 0 %s %s %f\n",
430 ((addVariable_t)event->data)->type->id,
431 ((addVariable_t)event->data)->container->id,
432 ((addVariable_t)event->data)->value);
434 fprintf(tracing_file, "%d %lf %s %s %f\n",
437 ((addVariable_t)event->data)->type->id,
438 ((addVariable_t)event->data)->container->id,
439 ((addVariable_t)event->data)->value);
443 static void print_pajeSubVariable(paje_event_t event)
445 if (event->timestamp == 0){
446 fprintf(tracing_file, "%d 0 %s %s %f\n",
448 ((subVariable_t)event->data)->type->id,
449 ((subVariable_t)event->data)->container->id,
450 ((subVariable_t)event->data)->value);
452 fprintf(tracing_file, "%d %lf %s %s %f\n",
455 ((subVariable_t)event->data)->type->id,
456 ((subVariable_t)event->data)->container->id,
457 ((subVariable_t)event->data)->value);
461 static void print_pajeSetState(paje_event_t event)
463 if (event->timestamp == 0){
464 fprintf(tracing_file, "%d 0 %s %s %s\n",
466 ((setState_t)event->data)->type->id,
467 ((setState_t)event->data)->container->id,
468 ((setState_t)event->data)->value);
470 fprintf(tracing_file, "%d %lf %s %s %s\n",
473 ((setState_t)event->data)->type->id,
474 ((setState_t)event->data)->container->id,
475 ((setState_t)event->data)->value);
479 static void print_pajePushState(paje_event_t event)
481 if (event->timestamp == 0){
482 fprintf(tracing_file, "%d 0 %s %s %s\n",
484 ((pushState_t)event->data)->type->id,
485 ((pushState_t)event->data)->container->id,
486 ((pushState_t)event->data)->value);
488 fprintf(tracing_file, "%d %lf %s %s %s\n",
491 ((pushState_t)event->data)->type->id,
492 ((pushState_t)event->data)->container->id,
493 ((pushState_t)event->data)->value);
497 static void print_pajePopState(paje_event_t event)
499 if (event->timestamp == 0){
500 fprintf(tracing_file, "%d 0 %s %s\n",
502 ((popState_t)event->data)->type->id,
503 ((popState_t)event->data)->container->id);
505 fprintf(tracing_file, "%d %lf %s %s\n",
508 ((popState_t)event->data)->type->id,
509 ((popState_t)event->data)->container->id);
513 static void print_pajeStartLink(paje_event_t event)
515 if (event->timestamp == 0){
516 fprintf(tracing_file, "%d 0 %s %s %s %s %s\n",
518 ((startLink_t)event->data)->type->id,
519 ((startLink_t)event->data)->container->id,
520 ((startLink_t)event->data)->value,
521 ((startLink_t)event->data)->sourceContainer->id,
522 ((startLink_t)event->data)->key);
524 fprintf(tracing_file, "%d %lf %s %s %s %s %s\n",
527 ((startLink_t)event->data)->type->id,
528 ((startLink_t)event->data)->container->id,
529 ((startLink_t)event->data)->value,
530 ((startLink_t)event->data)->sourceContainer->id,
531 ((startLink_t)event->data)->key);
535 static void print_pajeEndLink(paje_event_t event)
537 if (event->timestamp == 0){
538 fprintf(tracing_file, "%d 0 %s %s %s %s %s\n",
540 ((endLink_t)event->data)->type->id,
541 ((endLink_t)event->data)->container->id,
542 ((endLink_t)event->data)->value,
543 ((endLink_t)event->data)->destContainer->id,
544 ((endLink_t)event->data)->key);
546 fprintf(tracing_file, "%d %lf %s %s %s %s %s\n",
549 ((endLink_t)event->data)->type->id,
550 ((endLink_t)event->data)->container->id,
551 ((endLink_t)event->data)->value,
552 ((endLink_t)event->data)->destContainer->id,
553 ((endLink_t)event->data)->key);
557 static void print_pajeNewEvent (paje_event_t event)
559 if (event->timestamp == 0){
560 fprintf(tracing_file, "%d 0 %s %s %s\n",
562 ((newEvent_t)event->data)->type->id,
563 ((newEvent_t)event->data)->container->id,
564 ((newEvent_t)event->data)->value);
566 fprintf(tracing_file, "%d %lf %s %s %s\n",
569 ((newEvent_t)event->data)->type->id,
570 ((newEvent_t)event->data)->container->id,
571 ((newEvent_t)event->data)->value);
575 void new_pajeDefineContainerType(type_t type)
577 paje_event_t event = xbt_new0(s_paje_event_t, 1);
578 event->event_type = PAJE_DefineContainerType;
579 event->timestamp = 0;
580 event->print = print_pajeDefineContainerType;
581 event->data = xbt_new0(s_defineContainerType_t, 1);
582 ((defineContainerType_t)(event->data))->type = type;
585 event->print (event);
588 xbt_free (event->data);
593 void new_pajeDefineVariableType(type_t type)
595 paje_event_t event = xbt_new0(s_paje_event_t, 1);
596 event->event_type = PAJE_DefineVariableType;
597 event->timestamp = 0;
598 event->print = print_pajeDefineVariableType;
599 event->data = xbt_new0(s_defineVariableType_t, 1);
600 ((defineVariableType_t)(event->data))->type = type;
603 event->print (event);
606 xbt_free (event->data);
611 void new_pajeDefineStateType(type_t type)
613 paje_event_t event = xbt_new0(s_paje_event_t, 1);
614 event->event_type = PAJE_DefineStateType;
615 event->timestamp = 0;
616 event->print = print_pajeDefineStateType;
617 event->data = xbt_new0(s_defineStateType_t, 1);
618 ((defineStateType_t)(event->data))->type = type;
621 event->print (event);
624 xbt_free (event->data);
629 void new_pajeDefineEventType(type_t type)
631 paje_event_t event = xbt_new0(s_paje_event_t, 1);
632 event->event_type = PAJE_DefineEventType;
633 event->timestamp = 0;
634 event->print = print_pajeDefineEventType;
635 event->data = xbt_new0(s_defineEventType_t, 1);
636 ((defineEventType_t)(event->data))->type = type;
639 event->print (event);
642 xbt_free (event->data);
647 void new_pajeDefineLinkType(type_t type, type_t source, type_t dest)
649 paje_event_t event = xbt_new0(s_paje_event_t, 1);
650 event->event_type = PAJE_DefineLinkType;
651 event->timestamp = 0;
652 event->print = print_pajeDefineLinkType;
653 event->data = xbt_new0(s_defineLinkType_t, 1);
654 ((defineLinkType_t)(event->data))->type = type;
655 ((defineLinkType_t)(event->data))->source = source;
656 ((defineLinkType_t)(event->data))->dest = dest;
659 event->print (event);
662 xbt_free (event->data);
667 void new_pajeCreateContainer (container_t container)
669 paje_event_t event = xbt_new0(s_paje_event_t, 1);
670 event->event_type = PAJE_CreateContainer;
671 event->timestamp = SIMIX_get_clock();
672 event->print = print_pajeCreateContainer;
673 event->data = xbt_new0(s_createContainer_t, 1);
674 ((createContainer_t)(event->data))->container = container;
677 event->print (event);
680 xbt_free (event->data);
685 void new_pajeDestroyContainer (container_t container)
687 paje_event_t event = xbt_new0(s_paje_event_t, 1);
688 event->event_type = PAJE_DestroyContainer;
689 event->timestamp = SIMIX_get_clock();
690 event->print = print_pajeDestroyContainer;
691 event->data = xbt_new0(s_destroyContainer_t, 1);
692 ((destroyContainer_t)(event->data))->container = container;
695 event->print (event);
698 xbt_free (event->data);
703 void new_pajeSetVariable (double timestamp, container_t container, type_t type, double value)
705 paje_event_t event = xbt_new0(s_paje_event_t, 1);
706 event->event_type = PAJE_SetVariable;
707 event->timestamp = timestamp;
708 event->print = print_pajeSetVariable;
709 event->data = xbt_new0(s_setVariable_t, 1);
710 ((setVariable_t)(event->data))->type = type;
711 ((setVariable_t)(event->data))->container = container;
712 ((setVariable_t)(event->data))->value = value;
714 insert_into_buffer (event);
718 event->print (event);
721 xbt_free (event->data);
727 void new_pajeAddVariable (double timestamp, container_t container, type_t type, double value)
729 paje_event_t event = xbt_new0(s_paje_event_t, 1);
730 event->event_type = PAJE_AddVariable;
731 event->timestamp = timestamp;
732 event->print = print_pajeAddVariable;
733 event->data = xbt_new0(s_addVariable_t, 1);
734 ((addVariable_t)(event->data))->type = type;
735 ((addVariable_t)(event->data))->container = container;
736 ((addVariable_t)(event->data))->value = value;
738 insert_into_buffer (event);
742 event->print (event);
745 xbt_free (event->data);
750 void new_pajeSubVariable (double timestamp, container_t container, type_t type, double value)
752 paje_event_t event = xbt_new0(s_paje_event_t, 1);
753 event->event_type = PAJE_SubVariable;
754 event->timestamp = timestamp;
755 event->print = print_pajeSubVariable;
756 event->data = xbt_new0(s_subVariable_t, 1);
757 ((subVariable_t)(event->data))->type = type;
758 ((subVariable_t)(event->data))->container = container;
759 ((subVariable_t)(event->data))->value = value;
761 insert_into_buffer (event);
765 event->print (event);
768 xbt_free (event->data);
773 void new_pajeSetState (double timestamp, container_t container, type_t type, const char *value)
775 paje_event_t event = xbt_new0(s_paje_event_t, 1);
776 event->event_type = PAJE_SetState;
777 event->timestamp = timestamp;
778 event->print = print_pajeSetState;
779 event->data = xbt_new0(s_setState_t, 1);
780 ((setState_t)(event->data))->type = type;
781 ((setState_t)(event->data))->container = container;
782 ((setState_t)(event->data))->value = xbt_strdup(value);
784 insert_into_buffer (event);
788 event->print (event);
791 xbt_free (((setState_t)(event->data))->value);
792 xbt_free (event->data);
798 void new_pajePushState (double timestamp, container_t container, type_t type, const char *value)
800 paje_event_t event = xbt_new0(s_paje_event_t, 1);
801 event->event_type = PAJE_PushState;
802 event->timestamp = timestamp;
803 event->print = print_pajePushState;
804 event->data = xbt_new0(s_pushState_t, 1);
805 ((pushState_t)(event->data))->type = type;
806 ((pushState_t)(event->data))->container = container;
807 ((pushState_t)(event->data))->value = xbt_strdup(value);
809 insert_into_buffer (event);
813 event->print (event);
816 xbt_free (((pushState_t)(event->data))->value);
817 xbt_free (event->data);
823 void new_pajePopState (double timestamp, container_t container, type_t type)
825 paje_event_t event = xbt_new0(s_paje_event_t, 1);
826 event->event_type = PAJE_PopState;
827 event->timestamp = timestamp;
828 event->print = print_pajePopState;
829 event->data = xbt_new0(s_popState_t, 1);
830 ((popState_t)(event->data))->type = type;
831 ((popState_t)(event->data))->container = container;
833 insert_into_buffer (event);
837 event->print (event);
840 xbt_free (event->data);
845 void new_pajeStartLink (double timestamp, container_t container, type_t type, container_t sourceContainer, const char *value, const char *key)
847 paje_event_t event = xbt_new0(s_paje_event_t, 1);
848 event->event_type = PAJE_StartLink;
849 event->timestamp = timestamp;
850 event->print = print_pajeStartLink;
851 event->data = xbt_new0(s_startLink_t, 1);
852 ((startLink_t)(event->data))->type = type;
853 ((startLink_t)(event->data))->container = container;
854 ((startLink_t)(event->data))->sourceContainer = sourceContainer;
855 ((startLink_t)(event->data))->value = xbt_strdup(value);
856 ((startLink_t)(event->data))->key = xbt_strdup(key);
858 insert_into_buffer (event);
862 event->print (event);
865 xbt_free (((startLink_t)(event->data))->value);
866 xbt_free (((startLink_t)(event->data))->key);
867 xbt_free (event->data);
872 void new_pajeEndLink (double timestamp, container_t container, type_t type, container_t destContainer, const char *value, const char *key)
874 paje_event_t event = xbt_new0(s_paje_event_t, 1);
875 event->event_type = PAJE_EndLink;
876 event->timestamp = timestamp;
877 event->print = print_pajeEndLink;
878 event->data = xbt_new0(s_endLink_t, 1);
879 ((endLink_t)(event->data))->type = type;
880 ((endLink_t)(event->data))->container = container;
881 ((endLink_t)(event->data))->destContainer = destContainer;
882 ((endLink_t)(event->data))->value = xbt_strdup(value);
883 ((endLink_t)(event->data))->key = xbt_strdup(key);
885 insert_into_buffer (event);
889 event->print (event);
892 xbt_free (((endLink_t)(event->data))->value);
893 xbt_free (((endLink_t)(event->data))->key);
894 xbt_free (event->data);
899 void new_pajeNewEvent (double timestamp, container_t container, type_t type, const char *value)
901 paje_event_t event = xbt_new0(s_paje_event_t, 1);
902 event->event_type = PAJE_NewEvent;
903 event->timestamp = timestamp;
904 event->print = print_pajeNewEvent;
905 event->data = xbt_new0(s_newEvent_t, 1);
906 ((newEvent_t)(event->data))->type = type;
907 ((newEvent_t)(event->data))->container = container;
908 ((newEvent_t)(event->data))->value = xbt_strdup(value);
910 insert_into_buffer (event);
914 event->print (event);
917 xbt_free (((newEvent_t)(event->data))->value);
918 xbt_free (event->data);
923 //void pajeNewEvent(double time, const char *entityType,
924 // const char *container, const char *value)
926 // INSTR_PAJE_ASSERT(entityType);
927 // INSTR_PAJE_ASSERT(container);
928 // INSTR_PAJE_ASSERT(value);
931 // fprintf(tracing_file, "%d 0 %s %s %s\n", pajeNewEventId,
932 // entityType, container, value);
934 // fprintf(tracing_file, "%d %lf %s %s %s\n", pajeNewEventId, time,
935 // entityType, container, value);
939 #endif /* HAVE_TRACING */