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);
39 void (*free) (paje_event_t event);
43 typedef struct s_defineContainerType *defineContainerType_t;
44 typedef struct s_defineContainerType {
46 }s_defineContainerType_t;
48 typedef struct s_defineVariableType *defineVariableType_t;
49 typedef struct s_defineVariableType {
51 }s_defineVariableType_t;
53 typedef struct s_defineStateType *defineStateType_t;
54 typedef struct s_defineStateType {
58 typedef struct s_defineEventType *defineEventType_t;
59 typedef struct s_defineEventType {
63 typedef struct s_defineLinkType *defineLinkType_t;
64 typedef struct s_defineLinkType {
70 typedef struct s_createContainer *createContainer_t;
71 typedef struct s_createContainer {
72 container_t container;
75 typedef struct s_destroyContainer *destroyContainer_t;
76 typedef struct s_destroyContainer {
77 container_t container;
78 }s_destroyContainer_t;
80 typedef struct s_setVariable *setVariable_t;
81 typedef struct s_setVariable {
82 container_t container;
87 typedef struct s_addVariable *addVariable_t;
88 typedef struct s_addVariable {
89 container_t container;
94 typedef struct s_subVariable *subVariable_t;
95 typedef struct s_subVariable {
96 container_t container;
101 typedef struct s_setState *setState_t;
102 typedef struct s_setState {
103 container_t container;
108 typedef struct s_pushState *pushState_t;
109 typedef struct s_pushState {
110 container_t container;
115 typedef struct s_popState *popState_t;
116 typedef struct s_popState {
117 container_t container;
121 typedef struct s_startLink *startLink_t;
122 typedef struct s_startLink {
123 container_t container;
125 container_t sourceContainer;
130 typedef struct s_endLink *endLink_t;
131 typedef struct s_endLink {
132 container_t container;
134 container_t destContainer;
139 typedef struct s_newEvent *newEvent_t;
140 typedef struct s_newEvent {
141 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);
181 void TRACE_paje_create_header(void)
183 DEBUG0 ("Define paje header");
184 fprintf(tracing_file, "\
185 %%EventDef PajeDefineContainerType %d \n\
187 %% ContainerType string \n\
190 %%EventDef PajeDefineVariableType %d \n\
192 %% ContainerType string \n\
196 %%EventDef PajeDefineStateType %d \n\
198 %% ContainerType string \n\
201 %%EventDef PajeDefineEventType %d \n\
203 %% EntityType string \n\
207 %%EventDef PajeDefineLinkType %d \n\
209 %% ContainerType string \n\
210 %% SourceContainerType string \n\
211 %% DestContainerType string \n\
214 %%EventDef PajeCreateContainer %d \n\
218 %% Container string \n\
221 %%EventDef PajeDestroyContainer %d \n\
224 %% Container string \n\
226 %%EventDef PajeSetVariable %d \n\
228 %% EntityType string \n\
229 %% Container string \n\
232 %%EventDef PajeAddVariable %d \n\
234 %% EntityType string \n\
235 %% Container string \n\
238 %%EventDef PajeSubVariable %d \n\
240 %% EntityType string \n\
241 %% Container string \n\
244 %%EventDef PajeSetState %d \n\
246 %% EntityType string \n\
247 %% Container string \n\
250 %%EventDef PajePushState %d \n\
252 %% EntityType string \n\
253 %% Container string \n\
256 %%EventDef PajePopState %d \n\
258 %% EntityType string \n\
259 %% Container string \n\
261 %%EventDef PajeStartLink %d \n\
263 %% EntityType string \n\
264 %% Container string \n\
266 %% SourceContainer string \n\
269 %%EventDef PajeEndLink %d \n\
271 %% EntityType string \n\
272 %% Container string \n\
274 %% DestContainer string \n\
277 %%EventDef PajeNewEvent %d \n\
279 %% EntityType string \n\
280 %% Container string \n\
283 PAJE_DefineContainerType,
284 PAJE_DefineVariableType,
285 PAJE_DefineStateType,
286 PAJE_DefineEventType,
288 PAJE_CreateContainer,
289 PAJE_DestroyContainer,
301 /* internal do the instrumentation module */
302 static void insert_into_buffer (paje_event_t tbi)
305 if (xbt_dynar_length(buffer) == 0){
306 xbt_dynar_push (buffer, &tbi);
309 for (i = 0; i < xbt_dynar_length(buffer); i++){
310 paje_event_t e1 = *(paje_event_t*)xbt_dynar_get_ptr(buffer, i);
311 if (e1->timestamp > tbi->timestamp){
312 xbt_dynar_insert_at (buffer, i, &tbi);
318 xbt_dynar_push (buffer, &tbi);
323 static void print_pajeDefineContainerType(paje_event_t event)
325 fprintf(tracing_file, "%d %s %s %s\n",
327 ((defineContainerType_t)event->data)->type->id,
328 ((defineContainerType_t)event->data)->type->father->id,
329 ((defineContainerType_t)event->data)->type->name);
332 static void print_pajeDefineVariableType(paje_event_t event)
334 fprintf(tracing_file, "%d %s %s %s \"%s\"\n",
336 ((defineVariableType_t)event->data)->type->id,
337 ((defineVariableType_t)event->data)->type->father->id,
338 ((defineVariableType_t)event->data)->type->name,
339 ((defineVariableType_t)event->data)->type->color);
342 static void print_pajeDefineStateType(paje_event_t event)
344 fprintf(tracing_file, "%d %s %s %s\n",
346 ((defineStateType_t)event->data)->type->id,
347 ((defineStateType_t)event->data)->type->father->id,
348 ((defineStateType_t)event->data)->type->name);
351 static void print_pajeDefineEventType(paje_event_t event)
353 fprintf(tracing_file, "%d %s %s %s \"%s\"\n",
355 ((defineEventType_t)event->data)->type->id,
356 ((defineEventType_t)event->data)->type->father->id,
357 ((defineEventType_t)event->data)->type->name,
358 ((defineEventType_t)event->data)->type->color);
361 static void print_pajeDefineLinkType(paje_event_t event)
363 fprintf(tracing_file, "%d %s %s %s %s %s\n",
365 ((defineLinkType_t)event->data)->type->id,
366 ((defineLinkType_t)event->data)->type->father->id,
367 ((defineLinkType_t)event->data)->source->id,
368 ((defineLinkType_t)event->data)->dest->id,
369 ((defineLinkType_t)event->data)->type->name);
372 static void print_pajeCreateContainer(paje_event_t event)
374 if (event->timestamp == 0){
375 fprintf(tracing_file, "%d 0 %s %s %s %s\n",
377 ((createContainer_t)event->data)->container->id,
378 ((createContainer_t)event->data)->container->type->id,
379 ((createContainer_t)event->data)->container->father->id,
380 ((createContainer_t)event->data)->container->name);
382 fprintf(tracing_file, "%d %lf %s %s %s %s\n",
385 ((createContainer_t)event->data)->container->id,
386 ((createContainer_t)event->data)->container->type->id,
387 ((createContainer_t)event->data)->container->father->id,
388 ((createContainer_t)event->data)->container->name);
392 static void print_pajeDestroyContainer(paje_event_t event)
394 if (event->timestamp == 0){
395 fprintf(tracing_file, "%d 0 %s %s\n",
397 ((destroyContainer_t)event->data)->container->type->id,
398 ((destroyContainer_t)event->data)->container->id);
400 fprintf(tracing_file, "%d %lf %s %s\n",
403 ((destroyContainer_t)event->data)->container->type->id,
404 ((destroyContainer_t)event->data)->container->id);
408 static void print_pajeSetVariable(paje_event_t event)
410 if (event->timestamp == 0){
411 fprintf(tracing_file, "%d 0 %s %s %f\n",
413 ((setVariable_t)event->data)->type->id,
414 ((setVariable_t)event->data)->container->id,
415 ((setVariable_t)event->data)->value);
417 fprintf(tracing_file, "%d %lf %s %s %f\n",
420 ((setVariable_t)event->data)->type->id,
421 ((setVariable_t)event->data)->container->id,
422 ((setVariable_t)event->data)->value);
426 static void print_pajeAddVariable(paje_event_t event)
428 if (event->timestamp == 0){
429 fprintf(tracing_file, "%d 0 %s %s %f\n",
431 ((addVariable_t)event->data)->type->id,
432 ((addVariable_t)event->data)->container->id,
433 ((addVariable_t)event->data)->value);
435 fprintf(tracing_file, "%d %lf %s %s %f\n",
438 ((addVariable_t)event->data)->type->id,
439 ((addVariable_t)event->data)->container->id,
440 ((addVariable_t)event->data)->value);
444 static void print_pajeSubVariable(paje_event_t event)
446 if (event->timestamp == 0){
447 fprintf(tracing_file, "%d 0 %s %s %f\n",
449 ((subVariable_t)event->data)->type->id,
450 ((subVariable_t)event->data)->container->id,
451 ((subVariable_t)event->data)->value);
453 fprintf(tracing_file, "%d %lf %s %s %f\n",
456 ((subVariable_t)event->data)->type->id,
457 ((subVariable_t)event->data)->container->id,
458 ((subVariable_t)event->data)->value);
462 static void print_pajeSetState(paje_event_t event)
464 if (event->timestamp == 0){
465 fprintf(tracing_file, "%d 0 %s %s %s\n",
467 ((setState_t)event->data)->type->id,
468 ((setState_t)event->data)->container->id,
469 ((setState_t)event->data)->value);
471 fprintf(tracing_file, "%d %lf %s %s %s\n",
474 ((setState_t)event->data)->type->id,
475 ((setState_t)event->data)->container->id,
476 ((setState_t)event->data)->value);
480 static void print_pajePushState(paje_event_t event)
482 if (event->timestamp == 0){
483 fprintf(tracing_file, "%d 0 %s %s %s\n",
485 ((pushState_t)event->data)->type->id,
486 ((pushState_t)event->data)->container->id,
487 ((pushState_t)event->data)->value);
489 fprintf(tracing_file, "%d %lf %s %s %s\n",
492 ((pushState_t)event->data)->type->id,
493 ((pushState_t)event->data)->container->id,
494 ((pushState_t)event->data)->value);
498 static void print_pajePopState(paje_event_t event)
500 if (event->timestamp == 0){
501 fprintf(tracing_file, "%d 0 %s %s\n",
503 ((popState_t)event->data)->type->id,
504 ((popState_t)event->data)->container->id);
506 fprintf(tracing_file, "%d %lf %s %s\n",
509 ((popState_t)event->data)->type->id,
510 ((popState_t)event->data)->container->id);
514 static void print_pajeStartLink(paje_event_t event)
516 if (event->timestamp == 0){
517 fprintf(tracing_file, "%d 0 %s %s %s %s %s\n",
519 ((startLink_t)event->data)->type->id,
520 ((startLink_t)event->data)->container->id,
521 ((startLink_t)event->data)->value,
522 ((startLink_t)event->data)->sourceContainer->id,
523 ((startLink_t)event->data)->key);
525 fprintf(tracing_file, "%d %lf %s %s %s %s %s\n",
528 ((startLink_t)event->data)->type->id,
529 ((startLink_t)event->data)->container->id,
530 ((startLink_t)event->data)->value,
531 ((startLink_t)event->data)->sourceContainer->id,
532 ((startLink_t)event->data)->key);
536 static void print_pajeEndLink(paje_event_t event)
538 if (event->timestamp == 0){
539 fprintf(tracing_file, "%d 0 %s %s %s %s %s\n",
541 ((endLink_t)event->data)->type->id,
542 ((endLink_t)event->data)->container->id,
543 ((endLink_t)event->data)->value,
544 ((endLink_t)event->data)->destContainer->id,
545 ((endLink_t)event->data)->key);
547 fprintf(tracing_file, "%d %lf %s %s %s %s %s\n",
550 ((endLink_t)event->data)->type->id,
551 ((endLink_t)event->data)->container->id,
552 ((endLink_t)event->data)->value,
553 ((endLink_t)event->data)->destContainer->id,
554 ((endLink_t)event->data)->key);
558 static void print_pajeNewEvent (paje_event_t event)
560 if (event->timestamp == 0){
561 fprintf(tracing_file, "%d 0 %s %s %s\n",
563 ((newEvent_t)event->data)->type->id,
564 ((newEvent_t)event->data)->container->id,
565 ((newEvent_t)event->data)->value);
567 fprintf(tracing_file, "%d %lf %s %s %s\n",
570 ((newEvent_t)event->data)->type->id,
571 ((newEvent_t)event->data)->container->id,
572 ((newEvent_t)event->data)->value);
576 static void free_paje_event (paje_event_t event)
578 if (event->event_type == PAJE_SetState) {
579 xbt_free (((setState_t)(event->data))->value);
580 }else if (event->event_type == PAJE_PushState) {
581 xbt_free (((pushState_t)(event->data))->value);
582 }else if (event->event_type == PAJE_NewEvent){
583 xbt_free (((newEvent_t)(event->data))->value);
584 }else if (event->event_type == PAJE_StartLink){
585 xbt_free (((startLink_t)(event->data))->value);
586 xbt_free (((startLink_t)(event->data))->key);
587 }else if (event->event_type == PAJE_EndLink){
588 xbt_free (((endLink_t)(event->data))->value);
589 xbt_free (((endLink_t)(event->data))->key);
591 xbt_free (event->data);
595 void new_pajeDefineContainerType(type_t type)
597 paje_event_t event = xbt_new0(s_paje_event_t, 1);
598 event->event_type = PAJE_DefineContainerType;
599 event->timestamp = 0;
600 event->print = print_pajeDefineContainerType;
601 event->free = free_paje_event;
602 event->data = xbt_new0(s_defineContainerType_t, 1);
603 ((defineContainerType_t)(event->data))->type = type;
606 event->print (event);
610 void new_pajeDefineVariableType(type_t type)
612 paje_event_t event = xbt_new0(s_paje_event_t, 1);
613 event->event_type = PAJE_DefineVariableType;
614 event->timestamp = 0;
615 event->print = print_pajeDefineVariableType;
616 event->free = free_paje_event;
617 event->data = xbt_new0(s_defineVariableType_t, 1);
618 ((defineVariableType_t)(event->data))->type = type;
621 event->print (event);
625 void new_pajeDefineStateType(type_t type)
627 paje_event_t event = xbt_new0(s_paje_event_t, 1);
628 event->event_type = PAJE_DefineStateType;
629 event->timestamp = 0;
630 event->print = print_pajeDefineStateType;
631 event->free = free_paje_event;
632 event->data = xbt_new0(s_defineStateType_t, 1);
633 ((defineStateType_t)(event->data))->type = type;
636 event->print (event);
640 void new_pajeDefineEventType(type_t type)
642 paje_event_t event = xbt_new0(s_paje_event_t, 1);
643 event->event_type = PAJE_DefineEventType;
644 event->timestamp = 0;
645 event->print = print_pajeDefineEventType;
646 event->free = free_paje_event;
647 event->data = xbt_new0(s_defineEventType_t, 1);
648 ((defineEventType_t)(event->data))->type = type;
651 event->print (event);
655 void new_pajeDefineLinkType(type_t type, type_t source, type_t dest)
657 paje_event_t event = xbt_new0(s_paje_event_t, 1);
658 event->event_type = PAJE_DefineLinkType;
659 event->timestamp = 0;
660 event->print = print_pajeDefineLinkType;
661 event->free = free_paje_event;
662 event->data = xbt_new0(s_defineLinkType_t, 1);
663 ((defineLinkType_t)(event->data))->type = type;
664 ((defineLinkType_t)(event->data))->source = source;
665 ((defineLinkType_t)(event->data))->dest = dest;
668 event->print (event);
672 void new_pajeCreateContainer (container_t container)
674 paje_event_t event = xbt_new0(s_paje_event_t, 1);
675 event->event_type = PAJE_CreateContainer;
676 event->timestamp = SIMIX_get_clock();
677 event->print = print_pajeCreateContainer;
678 event->free = free_paje_event;
679 event->data = xbt_new0(s_createContainer_t, 1);
680 ((createContainer_t)(event->data))->container = container;
683 event->print (event);
687 void new_pajeDestroyContainer (container_t container)
689 paje_event_t event = xbt_new0(s_paje_event_t, 1);
690 event->event_type = PAJE_DestroyContainer;
691 event->timestamp = SIMIX_get_clock();
692 event->print = print_pajeDestroyContainer;
693 event->free = free_paje_event;
694 event->data = xbt_new0(s_destroyContainer_t, 1);
695 ((destroyContainer_t)(event->data))->container = container;
698 event->print (event);
702 void new_pajeSetVariable (double timestamp, container_t container, type_t type, double value)
704 paje_event_t event = xbt_new0(s_paje_event_t, 1);
705 event->event_type = PAJE_SetVariable;
706 event->timestamp = timestamp;
707 event->print = print_pajeSetVariable;
708 event->free = free_paje_event;
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 void new_pajeAddVariable (double timestamp, container_t container, type_t type, double value)
720 paje_event_t event = xbt_new0(s_paje_event_t, 1);
721 event->event_type = PAJE_AddVariable;
722 event->timestamp = timestamp;
723 event->print = print_pajeAddVariable;
724 event->free = free_paje_event;
725 event->data = xbt_new0(s_addVariable_t, 1);
726 ((addVariable_t)(event->data))->type = type;
727 ((addVariable_t)(event->data))->container = container;
728 ((addVariable_t)(event->data))->value = value;
730 insert_into_buffer (event);
733 void new_pajeSubVariable (double timestamp, container_t container, type_t type, double value)
735 paje_event_t event = xbt_new0(s_paje_event_t, 1);
736 event->event_type = PAJE_SubVariable;
737 event->timestamp = timestamp;
738 event->print = print_pajeSubVariable;
739 event->free = free_paje_event;
740 event->data = xbt_new0(s_subVariable_t, 1);
741 ((subVariable_t)(event->data))->type = type;
742 ((subVariable_t)(event->data))->container = container;
743 ((subVariable_t)(event->data))->value = value;
745 insert_into_buffer (event);
748 void new_pajeSetState (double timestamp, container_t container, type_t type, const char *value)
750 paje_event_t event = xbt_new0(s_paje_event_t, 1);
751 event->event_type = PAJE_SetState;
752 event->timestamp = timestamp;
753 event->print = print_pajeSetState;
754 event->free = free_paje_event;
755 event->data = xbt_new0(s_setState_t, 1);
756 ((setState_t)(event->data))->type = type;
757 ((setState_t)(event->data))->container = container;
758 ((setState_t)(event->data))->value = xbt_strdup(value);
760 insert_into_buffer (event);
764 void new_pajePushState (double timestamp, container_t container, type_t type, const char *value)
766 paje_event_t event = xbt_new0(s_paje_event_t, 1);
767 event->event_type = PAJE_PushState;
768 event->timestamp = timestamp;
769 event->print = print_pajePushState;
770 event->free = free_paje_event;
771 event->data = xbt_new0(s_pushState_t, 1);
772 ((pushState_t)(event->data))->type = type;
773 ((pushState_t)(event->data))->container = container;
774 ((pushState_t)(event->data))->value = xbt_strdup(value);
776 insert_into_buffer (event);
780 void new_pajePopState (double timestamp, container_t container, type_t type)
782 paje_event_t event = xbt_new0(s_paje_event_t, 1);
783 event->event_type = PAJE_PopState;
784 event->timestamp = timestamp;
785 event->print = print_pajePopState;
786 event->free = free_paje_event;
787 event->data = xbt_new0(s_popState_t, 1);
788 ((popState_t)(event->data))->type = type;
789 ((popState_t)(event->data))->container = container;
791 insert_into_buffer (event);
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->free = free_paje_event;
801 event->data = xbt_new0(s_startLink_t, 1);
802 ((startLink_t)(event->data))->type = type;
803 ((startLink_t)(event->data))->container = container;
804 ((startLink_t)(event->data))->sourceContainer = sourceContainer;
805 ((startLink_t)(event->data))->value = xbt_strdup(value);
806 ((startLink_t)(event->data))->key = xbt_strdup(key);
808 insert_into_buffer (event);
811 void new_pajeEndLink (double timestamp, container_t container, type_t type, container_t destContainer, const char *value, const char *key)
813 paje_event_t event = xbt_new0(s_paje_event_t, 1);
814 event->event_type = PAJE_EndLink;
815 event->timestamp = timestamp;
816 event->print = print_pajeEndLink;
817 event->free = free_paje_event;
818 event->data = xbt_new0(s_endLink_t, 1);
819 ((endLink_t)(event->data))->type = type;
820 ((endLink_t)(event->data))->container = container;
821 ((endLink_t)(event->data))->destContainer = destContainer;
822 ((endLink_t)(event->data))->value = xbt_strdup(value);
823 ((endLink_t)(event->data))->key = xbt_strdup(key);
825 insert_into_buffer (event);
828 void new_pajeNewEvent (double timestamp, container_t container, type_t type, const char *value)
830 paje_event_t event = xbt_new0(s_paje_event_t, 1);
831 event->event_type = PAJE_NewEvent;
832 event->timestamp = timestamp;
833 event->print = print_pajeNewEvent;
834 event->free = free_paje_event;
835 event->data = xbt_new0(s_newEvent_t, 1);
836 ((newEvent_t)(event->data))->type = type;
837 ((newEvent_t)(event->data))->container = container;
838 ((newEvent_t)(event->data))->value = xbt_strdup(value);
840 insert_into_buffer (event);
843 //void pajeNewEvent(double time, const char *entityType,
844 // const char *container, const char *value)
846 // INSTR_PAJE_ASSERT(entityType);
847 // INSTR_PAJE_ASSERT(container);
848 // INSTR_PAJE_ASSERT(value);
851 // fprintf(tracing_file, "%d 0 %s %s %s\n", pajeNewEventId,
852 // entityType, container, value);
854 // fprintf(tracing_file, "%d %lf %s %s %s\n", pajeNewEventId, time,
855 // entityType, container, value);
859 #endif /* HAVE_TRACING */