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 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(instr_paje_trace, instr, "Paje tracing event system");
14 PAJE_DefineContainerType,
15 PAJE_DefineVariableType,
20 PAJE_DestroyContainer,
32 typedef struct paje_event *paje_event_t;
33 typedef struct paje_event {
35 e_event_type event_type;
36 void (*print) (paje_event_t event);
37 void (*free) (paje_event_t event);
41 typedef struct s_defineContainerType *defineContainerType_t;
42 typedef struct s_defineContainerType {
44 }s_defineContainerType_t;
46 typedef struct s_defineVariableType *defineVariableType_t;
47 typedef struct s_defineVariableType {
49 }s_defineVariableType_t;
51 typedef struct s_defineStateType *defineStateType_t;
52 typedef struct s_defineStateType {
56 typedef struct s_defineEventType *defineEventType_t;
57 typedef struct s_defineEventType {
61 typedef struct s_defineLinkType *defineLinkType_t;
62 typedef struct s_defineLinkType {
68 typedef struct s_createContainer *createContainer_t;
69 typedef struct s_createContainer {
70 container_t container;
73 typedef struct s_destroyContainer *destroyContainer_t;
74 typedef struct s_destroyContainer {
75 container_t container;
76 }s_destroyContainer_t;
78 typedef struct s_setVariable *setVariable_t;
79 typedef struct s_setVariable {
80 container_t container;
85 typedef struct s_addVariable *addVariable_t;
86 typedef struct s_addVariable {
87 container_t container;
92 typedef struct s_subVariable *subVariable_t;
93 typedef struct s_subVariable {
94 container_t container;
99 typedef struct s_setState *setState_t;
100 typedef struct s_setState {
101 container_t container;
106 typedef struct s_pushState *pushState_t;
107 typedef struct s_pushState {
108 container_t container;
113 typedef struct s_popState *popState_t;
114 typedef struct s_popState {
115 container_t container;
119 typedef struct s_startLink *startLink_t;
120 typedef struct s_startLink {
121 container_t container;
123 container_t sourceContainer;
128 typedef struct s_endLink *endLink_t;
129 typedef struct s_endLink {
130 container_t container;
132 container_t destContainer;
137 typedef struct s_newEvent *newEvent_t;
138 typedef struct s_newEvent {
139 container_t container;
144 static FILE *tracing_file = NULL;
146 static xbt_dynar_t buffer = NULL;
148 void TRACE_paje_start(void)
150 char *filename = TRACE_get_filename();
151 tracing_file = fopen(filename, "w");
152 xbt_assert1 (tracing_file != NULL, "Tracefile %s could not be opened for writing.", filename);
154 DEBUG1("Filename %s is open for writing", filename);
157 TRACE_paje_create_header();
159 buffer = xbt_dynar_new (sizeof(paje_event_t), NULL);
162 void TRACE_paje_end(void)
164 fclose(tracing_file);
165 char *filename = TRACE_get_filename();
166 DEBUG1("Filename %s is closed", filename);
169 double TRACE_last_timestamp_to_dump = 0;
170 //dumps the trace file until the timestamp TRACE_last_timestamp_to_dump
171 void TRACE_paje_dump_buffer (void)
174 while (xbt_dynar_length (buffer) > 0){
175 double head_timestamp = (*(paje_event_t*)xbt_dynar_get_ptr(buffer, 0))->timestamp;
176 if (head_timestamp > TRACE_last_timestamp_to_dump){
179 xbt_dynar_remove_at (buffer, 0, &event);
180 event->print (event);
185 void TRACE_paje_create_header(void)
187 DEBUG0 ("Define paje header");
188 fprintf(tracing_file, "\
189 %%EventDef PajeDefineContainerType %d \n\
191 %% ContainerType string \n\
194 %%EventDef PajeDefineVariableType %d \n\
196 %% ContainerType string \n\
200 %%EventDef PajeDefineStateType %d \n\
202 %% ContainerType string \n\
205 %%EventDef PajeDefineEventType %d \n\
207 %% EntityType string \n\
211 %%EventDef PajeDefineLinkType %d \n\
213 %% ContainerType string \n\
214 %% SourceContainerType string \n\
215 %% DestContainerType string \n\
218 %%EventDef PajeCreateContainer %d \n\
222 %% Container string \n\
225 %%EventDef PajeDestroyContainer %d \n\
228 %% Container string \n\
230 %%EventDef PajeSetVariable %d \n\
232 %% EntityType string \n\
233 %% Container string \n\
236 %%EventDef PajeAddVariable %d \n\
238 %% EntityType string \n\
239 %% Container string \n\
242 %%EventDef PajeSubVariable %d \n\
244 %% EntityType string \n\
245 %% Container string \n\
248 %%EventDef PajeSetState %d \n\
250 %% EntityType string \n\
251 %% Container string \n\
254 %%EventDef PajePushState %d \n\
256 %% EntityType string \n\
257 %% Container string \n\
260 %%EventDef PajePopState %d \n\
262 %% EntityType string \n\
263 %% Container string \n\
265 %%EventDef PajeStartLink %d \n\
267 %% EntityType string \n\
268 %% Container string \n\
270 %% SourceContainer string \n\
273 %%EventDef PajeEndLink %d \n\
275 %% EntityType string \n\
276 %% Container string \n\
278 %% DestContainer string \n\
281 %%EventDef PajeNewEvent %d \n\
283 %% EntityType string \n\
284 %% Container string \n\
287 PAJE_DefineContainerType,
288 PAJE_DefineVariableType,
289 PAJE_DefineStateType,
290 PAJE_DefineEventType,
292 PAJE_CreateContainer,
293 PAJE_DestroyContainer,
305 /* internal do the instrumentation module */
306 static void insert_into_buffer (paje_event_t tbi)
309 if (xbt_dynar_length(buffer) == 0){
310 xbt_dynar_push (buffer, &tbi);
313 for (i = 0; i < xbt_dynar_length(buffer); i++){
314 paje_event_t e1 = *(paje_event_t*)xbt_dynar_get_ptr(buffer, i);
315 if (e1->timestamp > tbi->timestamp){
316 xbt_dynar_insert_at (buffer, i, &tbi);
322 xbt_dynar_push (buffer, &tbi);
327 static void print_pajeDefineContainerType(paje_event_t event)
329 fprintf(tracing_file, "%d %s %s %s\n",
331 ((defineContainerType_t)event->data)->type->id,
332 ((defineContainerType_t)event->data)->type->father->id,
333 ((defineContainerType_t)event->data)->type->name);
336 static void print_pajeDefineVariableType(paje_event_t event)
338 fprintf(tracing_file, "%d %s %s %s \"%s\"\n",
340 ((defineVariableType_t)event->data)->type->id,
341 ((defineVariableType_t)event->data)->type->father->id,
342 ((defineVariableType_t)event->data)->type->name,
343 ((defineVariableType_t)event->data)->type->color);
346 static void print_pajeDefineStateType(paje_event_t event)
348 fprintf(tracing_file, "%d %s %s %s\n",
350 ((defineStateType_t)event->data)->type->id,
351 ((defineStateType_t)event->data)->type->father->id,
352 ((defineStateType_t)event->data)->type->name);
355 static void print_pajeDefineEventType(paje_event_t event)
357 fprintf(tracing_file, "%d %s %s %s \"%s\"\n",
359 ((defineEventType_t)event->data)->type->id,
360 ((defineEventType_t)event->data)->type->father->id,
361 ((defineEventType_t)event->data)->type->name,
362 ((defineEventType_t)event->data)->type->color);
365 static void print_pajeDefineLinkType(paje_event_t event)
367 fprintf(tracing_file, "%d %s %s %s %s %s\n",
369 ((defineLinkType_t)event->data)->type->id,
370 ((defineLinkType_t)event->data)->type->father->id,
371 ((defineLinkType_t)event->data)->source->id,
372 ((defineLinkType_t)event->data)->dest->id,
373 ((defineLinkType_t)event->data)->type->name);
376 static void print_pajeCreateContainer(paje_event_t event)
378 if (event->timestamp == 0){
379 fprintf(tracing_file, "%d 0 %s %s %s %s\n",
381 ((createContainer_t)event->data)->container->id,
382 ((createContainer_t)event->data)->container->type->id,
383 ((createContainer_t)event->data)->container->father->id,
384 ((createContainer_t)event->data)->container->name);
386 fprintf(tracing_file, "%d %lf %s %s %s %s\n",
389 ((createContainer_t)event->data)->container->id,
390 ((createContainer_t)event->data)->container->type->id,
391 ((createContainer_t)event->data)->container->father->id,
392 ((createContainer_t)event->data)->container->name);
396 static void print_pajeDestroyContainer(paje_event_t event)
398 if (event->timestamp == 0){
399 fprintf(tracing_file, "%d 0 %s %s\n",
401 ((destroyContainer_t)event->data)->container->type->id,
402 ((destroyContainer_t)event->data)->container->id);
404 fprintf(tracing_file, "%d %lf %s %s\n",
407 ((destroyContainer_t)event->data)->container->type->id,
408 ((destroyContainer_t)event->data)->container->id);
412 static void print_pajeSetVariable(paje_event_t event)
414 if (event->timestamp == 0){
415 fprintf(tracing_file, "%d 0 %s %s %f\n",
417 ((setVariable_t)event->data)->type->id,
418 ((setVariable_t)event->data)->container->id,
419 ((setVariable_t)event->data)->value);
421 fprintf(tracing_file, "%d %lf %s %s %f\n",
424 ((setVariable_t)event->data)->type->id,
425 ((setVariable_t)event->data)->container->id,
426 ((setVariable_t)event->data)->value);
430 static void print_pajeAddVariable(paje_event_t event)
432 if (event->timestamp == 0){
433 fprintf(tracing_file, "%d 0 %s %s %f\n",
435 ((addVariable_t)event->data)->type->id,
436 ((addVariable_t)event->data)->container->id,
437 ((addVariable_t)event->data)->value);
439 fprintf(tracing_file, "%d %lf %s %s %f\n",
442 ((addVariable_t)event->data)->type->id,
443 ((addVariable_t)event->data)->container->id,
444 ((addVariable_t)event->data)->value);
448 static void print_pajeSubVariable(paje_event_t event)
450 if (event->timestamp == 0){
451 fprintf(tracing_file, "%d 0 %s %s %f\n",
453 ((subVariable_t)event->data)->type->id,
454 ((subVariable_t)event->data)->container->id,
455 ((subVariable_t)event->data)->value);
457 fprintf(tracing_file, "%d %lf %s %s %f\n",
460 ((subVariable_t)event->data)->type->id,
461 ((subVariable_t)event->data)->container->id,
462 ((subVariable_t)event->data)->value);
466 static void print_pajeSetState(paje_event_t event)
468 if (event->timestamp == 0){
469 fprintf(tracing_file, "%d 0 %s %s %s\n",
471 ((setState_t)event->data)->type->id,
472 ((setState_t)event->data)->container->id,
473 ((setState_t)event->data)->value);
475 fprintf(tracing_file, "%d %lf %s %s %s\n",
478 ((setState_t)event->data)->type->id,
479 ((setState_t)event->data)->container->id,
480 ((setState_t)event->data)->value);
484 static void print_pajePushState(paje_event_t event)
486 if (event->timestamp == 0){
487 fprintf(tracing_file, "%d 0 %s %s %s\n",
489 ((pushState_t)event->data)->type->id,
490 ((pushState_t)event->data)->container->id,
491 ((pushState_t)event->data)->value);
493 fprintf(tracing_file, "%d %lf %s %s %s\n",
496 ((pushState_t)event->data)->type->id,
497 ((pushState_t)event->data)->container->id,
498 ((pushState_t)event->data)->value);
502 static void print_pajePopState(paje_event_t event)
504 if (event->timestamp == 0){
505 fprintf(tracing_file, "%d 0 %s %s\n",
507 ((popState_t)event->data)->type->id,
508 ((popState_t)event->data)->container->id);
510 fprintf(tracing_file, "%d %lf %s %s\n",
513 ((popState_t)event->data)->type->id,
514 ((popState_t)event->data)->container->id);
518 static void print_pajeStartLink(paje_event_t event)
520 if (event->timestamp == 0){
521 fprintf(tracing_file, "%d 0 %s %s %s %s %s\n",
523 ((startLink_t)event->data)->type->id,
524 ((startLink_t)event->data)->container->id,
525 ((startLink_t)event->data)->value,
526 ((startLink_t)event->data)->sourceContainer->id,
527 ((startLink_t)event->data)->key);
529 fprintf(tracing_file, "%d %lf %s %s %s %s %s\n",
532 ((startLink_t)event->data)->type->id,
533 ((startLink_t)event->data)->container->id,
534 ((startLink_t)event->data)->value,
535 ((startLink_t)event->data)->sourceContainer->id,
536 ((startLink_t)event->data)->key);
540 static void print_pajeEndLink(paje_event_t event)
542 if (event->timestamp == 0){
543 fprintf(tracing_file, "%d 0 %s %s %s %s %s\n",
545 ((endLink_t)event->data)->type->id,
546 ((endLink_t)event->data)->container->id,
547 ((endLink_t)event->data)->value,
548 ((endLink_t)event->data)->destContainer->id,
549 ((endLink_t)event->data)->key);
551 fprintf(tracing_file, "%d %lf %s %s %s %s %s\n",
554 ((endLink_t)event->data)->type->id,
555 ((endLink_t)event->data)->container->id,
556 ((endLink_t)event->data)->value,
557 ((endLink_t)event->data)->destContainer->id,
558 ((endLink_t)event->data)->key);
562 static void print_pajeNewEvent (paje_event_t event)
564 if (event->timestamp == 0){
565 fprintf(tracing_file, "%d 0 %s %s %s\n",
567 ((newEvent_t)event->data)->type->id,
568 ((newEvent_t)event->data)->container->id,
569 ((newEvent_t)event->data)->value);
571 fprintf(tracing_file, "%d %lf %s %s %s\n",
574 ((newEvent_t)event->data)->type->id,
575 ((newEvent_t)event->data)->container->id,
576 ((newEvent_t)event->data)->value);
580 static void free_paje_event (paje_event_t event)
582 if (event->event_type == PAJE_SetState) {
583 xbt_free (((setState_t)(event->data))->value);
584 }else if (event->event_type == PAJE_PushState) {
585 xbt_free (((pushState_t)(event->data))->value);
586 }else if (event->event_type == PAJE_NewEvent){
587 xbt_free (((newEvent_t)(event->data))->value);
588 }else if (event->event_type == PAJE_StartLink){
589 xbt_free (((startLink_t)(event->data))->value);
590 xbt_free (((startLink_t)(event->data))->key);
591 }else if (event->event_type == PAJE_EndLink){
592 xbt_free (((endLink_t)(event->data))->value);
593 xbt_free (((endLink_t)(event->data))->key);
595 xbt_free (event->data);
599 void new_pajeDefineContainerType(type_t type)
601 paje_event_t event = xbt_new0(s_paje_event_t, 1);
602 event->event_type = PAJE_DefineContainerType;
603 event->timestamp = 0;
604 event->print = print_pajeDefineContainerType;
605 event->free = free_paje_event;
606 event->data = xbt_new0(s_defineContainerType_t, 1);
607 ((defineContainerType_t)(event->data))->type = type;
610 event->print (event);
614 void new_pajeDefineVariableType(type_t type)
616 paje_event_t event = xbt_new0(s_paje_event_t, 1);
617 event->event_type = PAJE_DefineVariableType;
618 event->timestamp = 0;
619 event->print = print_pajeDefineVariableType;
620 event->free = free_paje_event;
621 event->data = xbt_new0(s_defineVariableType_t, 1);
622 ((defineVariableType_t)(event->data))->type = type;
625 event->print (event);
629 void new_pajeDefineStateType(type_t type)
631 paje_event_t event = xbt_new0(s_paje_event_t, 1);
632 event->event_type = PAJE_DefineStateType;
633 event->timestamp = 0;
634 event->print = print_pajeDefineStateType;
635 event->free = free_paje_event;
636 event->data = xbt_new0(s_defineStateType_t, 1);
637 ((defineStateType_t)(event->data))->type = type;
640 event->print (event);
644 void new_pajeDefineEventType(type_t type)
646 paje_event_t event = xbt_new0(s_paje_event_t, 1);
647 event->event_type = PAJE_DefineEventType;
648 event->timestamp = 0;
649 event->print = print_pajeDefineEventType;
650 event->free = free_paje_event;
651 event->data = xbt_new0(s_defineEventType_t, 1);
652 ((defineEventType_t)(event->data))->type = type;
655 event->print (event);
659 void new_pajeDefineLinkType(type_t type, type_t source, type_t dest)
661 paje_event_t event = xbt_new0(s_paje_event_t, 1);
662 event->event_type = PAJE_DefineLinkType;
663 event->timestamp = 0;
664 event->print = print_pajeDefineLinkType;
665 event->free = free_paje_event;
666 event->data = xbt_new0(s_defineLinkType_t, 1);
667 ((defineLinkType_t)(event->data))->type = type;
668 ((defineLinkType_t)(event->data))->source = source;
669 ((defineLinkType_t)(event->data))->dest = dest;
672 event->print (event);
676 void new_pajeCreateContainer (container_t container)
678 paje_event_t event = xbt_new0(s_paje_event_t, 1);
679 event->event_type = PAJE_CreateContainer;
680 event->timestamp = SIMIX_get_clock();
681 event->print = print_pajeCreateContainer;
682 event->free = free_paje_event;
683 event->data = xbt_new0(s_createContainer_t, 1);
684 ((createContainer_t)(event->data))->container = container;
687 event->print (event);
691 void new_pajeDestroyContainer (container_t container)
693 paje_event_t event = xbt_new0(s_paje_event_t, 1);
694 event->event_type = PAJE_DestroyContainer;
695 event->timestamp = SIMIX_get_clock();
696 event->print = print_pajeDestroyContainer;
697 event->free = free_paje_event;
698 event->data = xbt_new0(s_destroyContainer_t, 1);
699 ((destroyContainer_t)(event->data))->container = container;
702 event->print (event);
706 void new_pajeSetVariable (double timestamp, container_t container, type_t type, double value)
708 paje_event_t event = xbt_new0(s_paje_event_t, 1);
709 event->event_type = PAJE_SetVariable;
710 event->timestamp = timestamp;
711 event->print = print_pajeSetVariable;
712 event->free = free_paje_event;
713 event->data = xbt_new0(s_setVariable_t, 1);
714 ((setVariable_t)(event->data))->type = type;
715 ((setVariable_t)(event->data))->container = container;
716 ((setVariable_t)(event->data))->value = value;
718 insert_into_buffer (event);
722 void new_pajeAddVariable (double timestamp, container_t container, type_t type, double value)
724 paje_event_t event = xbt_new0(s_paje_event_t, 1);
725 event->event_type = PAJE_AddVariable;
726 event->timestamp = timestamp;
727 event->print = print_pajeAddVariable;
728 event->free = free_paje_event;
729 event->data = xbt_new0(s_addVariable_t, 1);
730 ((addVariable_t)(event->data))->type = type;
731 ((addVariable_t)(event->data))->container = container;
732 ((addVariable_t)(event->data))->value = value;
734 insert_into_buffer (event);
737 void new_pajeSubVariable (double timestamp, container_t container, type_t type, double value)
739 paje_event_t event = xbt_new0(s_paje_event_t, 1);
740 event->event_type = PAJE_SubVariable;
741 event->timestamp = timestamp;
742 event->print = print_pajeSubVariable;
743 event->free = free_paje_event;
744 event->data = xbt_new0(s_subVariable_t, 1);
745 ((subVariable_t)(event->data))->type = type;
746 ((subVariable_t)(event->data))->container = container;
747 ((subVariable_t)(event->data))->value = value;
749 insert_into_buffer (event);
752 void new_pajeSetState (double timestamp, container_t container, type_t type, const char *value)
754 paje_event_t event = xbt_new0(s_paje_event_t, 1);
755 event->event_type = PAJE_SetState;
756 event->timestamp = timestamp;
757 event->print = print_pajeSetState;
758 event->free = free_paje_event;
759 event->data = xbt_new0(s_setState_t, 1);
760 ((setState_t)(event->data))->type = type;
761 ((setState_t)(event->data))->container = container;
762 ((setState_t)(event->data))->value = xbt_strdup(value);
764 insert_into_buffer (event);
768 void new_pajePushState (double timestamp, container_t container, type_t type, const char *value)
770 paje_event_t event = xbt_new0(s_paje_event_t, 1);
771 event->event_type = PAJE_PushState;
772 event->timestamp = timestamp;
773 event->print = print_pajePushState;
774 event->free = free_paje_event;
775 event->data = xbt_new0(s_pushState_t, 1);
776 ((pushState_t)(event->data))->type = type;
777 ((pushState_t)(event->data))->container = container;
778 ((pushState_t)(event->data))->value = xbt_strdup(value);
780 insert_into_buffer (event);
784 void new_pajePopState (double timestamp, container_t container, type_t type)
786 paje_event_t event = xbt_new0(s_paje_event_t, 1);
787 event->event_type = PAJE_PopState;
788 event->timestamp = timestamp;
789 event->print = print_pajePopState;
790 event->free = free_paje_event;
791 event->data = xbt_new0(s_popState_t, 1);
792 ((popState_t)(event->data))->type = type;
793 ((popState_t)(event->data))->container = container;
795 insert_into_buffer (event);
798 void new_pajeStartLink (double timestamp, container_t container, type_t type, container_t sourceContainer, const char *value, const char *key)
800 paje_event_t event = xbt_new0(s_paje_event_t, 1);
801 event->event_type = PAJE_StartLink;
802 event->timestamp = timestamp;
803 event->print = print_pajeStartLink;
804 event->free = free_paje_event;
805 event->data = xbt_new0(s_startLink_t, 1);
806 ((startLink_t)(event->data))->type = type;
807 ((startLink_t)(event->data))->container = container;
808 ((startLink_t)(event->data))->sourceContainer = sourceContainer;
809 ((startLink_t)(event->data))->value = xbt_strdup(value);
810 ((startLink_t)(event->data))->key = xbt_strdup(key);
812 insert_into_buffer (event);
815 void new_pajeEndLink (double timestamp, container_t container, type_t type, container_t destContainer, const char *value, const char *key)
817 paje_event_t event = xbt_new0(s_paje_event_t, 1);
818 event->event_type = PAJE_EndLink;
819 event->timestamp = timestamp;
820 event->print = print_pajeEndLink;
821 event->free = free_paje_event;
822 event->data = xbt_new0(s_endLink_t, 1);
823 ((endLink_t)(event->data))->type = type;
824 ((endLink_t)(event->data))->container = container;
825 ((endLink_t)(event->data))->destContainer = destContainer;
826 ((endLink_t)(event->data))->value = xbt_strdup(value);
827 ((endLink_t)(event->data))->key = xbt_strdup(key);
829 insert_into_buffer (event);
832 void new_pajeNewEvent (double timestamp, container_t container, type_t type, const char *value)
834 paje_event_t event = xbt_new0(s_paje_event_t, 1);
835 event->event_type = PAJE_NewEvent;
836 event->timestamp = timestamp;
837 event->print = print_pajeNewEvent;
838 event->free = free_paje_event;
839 event->data = xbt_new0(s_newEvent_t, 1);
840 ((newEvent_t)(event->data))->type = type;
841 ((newEvent_t)(event->data))->container = container;
842 ((newEvent_t)(event->data))->value = xbt_strdup(value);
844 insert_into_buffer (event);
847 #endif /* HAVE_TRACING */