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 double TRACE_last_timestamp_to_dump = 0;
172 //dumps the trace file until the timestamp TRACE_last_timestamp_to_dump
173 void TRACE_paje_dump_buffer (void)
176 while (xbt_dynar_length (buffer) > 0){
177 double head_timestamp = (*(paje_event_t*)xbt_dynar_get_ptr(buffer, 0))->timestamp;
178 if (head_timestamp > TRACE_last_timestamp_to_dump){
181 xbt_dynar_remove_at (buffer, 0, &event);
182 event->print (event);
187 void TRACE_paje_create_header(void)
189 DEBUG0 ("Define paje header");
190 fprintf(tracing_file, "\
191 %%EventDef PajeDefineContainerType %d \n\
193 %% ContainerType string \n\
196 %%EventDef PajeDefineVariableType %d \n\
198 %% ContainerType string \n\
202 %%EventDef PajeDefineStateType %d \n\
204 %% ContainerType string \n\
207 %%EventDef PajeDefineEventType %d \n\
209 %% EntityType string \n\
213 %%EventDef PajeDefineLinkType %d \n\
215 %% ContainerType string \n\
216 %% SourceContainerType string \n\
217 %% DestContainerType string \n\
220 %%EventDef PajeCreateContainer %d \n\
224 %% Container string \n\
227 %%EventDef PajeDestroyContainer %d \n\
230 %% Container string \n\
232 %%EventDef PajeSetVariable %d \n\
234 %% EntityType string \n\
235 %% Container string \n\
238 %%EventDef PajeAddVariable %d \n\
240 %% EntityType string \n\
241 %% Container string \n\
244 %%EventDef PajeSubVariable %d \n\
246 %% EntityType string \n\
247 %% Container string \n\
250 %%EventDef PajeSetState %d \n\
252 %% EntityType string \n\
253 %% Container string \n\
256 %%EventDef PajePushState %d \n\
258 %% EntityType string \n\
259 %% Container string \n\
262 %%EventDef PajePopState %d \n\
264 %% EntityType string \n\
265 %% Container string \n\
267 %%EventDef PajeStartLink %d \n\
269 %% EntityType string \n\
270 %% Container string \n\
272 %% SourceContainer string \n\
275 %%EventDef PajeEndLink %d \n\
277 %% EntityType string \n\
278 %% Container string \n\
280 %% DestContainer string \n\
283 %%EventDef PajeNewEvent %d \n\
285 %% EntityType string \n\
286 %% Container string \n\
289 PAJE_DefineContainerType,
290 PAJE_DefineVariableType,
291 PAJE_DefineStateType,
292 PAJE_DefineEventType,
294 PAJE_CreateContainer,
295 PAJE_DestroyContainer,
307 /* internal do the instrumentation module */
308 static void insert_into_buffer (paje_event_t tbi)
311 if (xbt_dynar_length(buffer) == 0){
312 xbt_dynar_push (buffer, &tbi);
315 for (i = 0; i < xbt_dynar_length(buffer); i++){
316 paje_event_t e1 = *(paje_event_t*)xbt_dynar_get_ptr(buffer, i);
317 if (e1->timestamp > tbi->timestamp){
318 xbt_dynar_insert_at (buffer, i, &tbi);
324 xbt_dynar_push (buffer, &tbi);
329 static void print_pajeDefineContainerType(paje_event_t event)
331 fprintf(tracing_file, "%d %s %s %s\n",
333 ((defineContainerType_t)event->data)->type->id,
334 ((defineContainerType_t)event->data)->type->father->id,
335 ((defineContainerType_t)event->data)->type->name);
338 static void print_pajeDefineVariableType(paje_event_t event)
340 fprintf(tracing_file, "%d %s %s %s \"%s\"\n",
342 ((defineVariableType_t)event->data)->type->id,
343 ((defineVariableType_t)event->data)->type->father->id,
344 ((defineVariableType_t)event->data)->type->name,
345 ((defineVariableType_t)event->data)->type->color);
348 static void print_pajeDefineStateType(paje_event_t event)
350 fprintf(tracing_file, "%d %s %s %s\n",
352 ((defineStateType_t)event->data)->type->id,
353 ((defineStateType_t)event->data)->type->father->id,
354 ((defineStateType_t)event->data)->type->name);
357 static void print_pajeDefineEventType(paje_event_t event)
359 fprintf(tracing_file, "%d %s %s %s \"%s\"\n",
361 ((defineEventType_t)event->data)->type->id,
362 ((defineEventType_t)event->data)->type->father->id,
363 ((defineEventType_t)event->data)->type->name,
364 ((defineEventType_t)event->data)->type->color);
367 static void print_pajeDefineLinkType(paje_event_t event)
369 fprintf(tracing_file, "%d %s %s %s %s %s\n",
371 ((defineLinkType_t)event->data)->type->id,
372 ((defineLinkType_t)event->data)->type->father->id,
373 ((defineLinkType_t)event->data)->source->id,
374 ((defineLinkType_t)event->data)->dest->id,
375 ((defineLinkType_t)event->data)->type->name);
378 static void print_pajeCreateContainer(paje_event_t event)
380 if (event->timestamp == 0){
381 fprintf(tracing_file, "%d 0 %s %s %s %s\n",
383 ((createContainer_t)event->data)->container->id,
384 ((createContainer_t)event->data)->container->type->id,
385 ((createContainer_t)event->data)->container->father->id,
386 ((createContainer_t)event->data)->container->name);
388 fprintf(tracing_file, "%d %lf %s %s %s %s\n",
391 ((createContainer_t)event->data)->container->id,
392 ((createContainer_t)event->data)->container->type->id,
393 ((createContainer_t)event->data)->container->father->id,
394 ((createContainer_t)event->data)->container->name);
398 static void print_pajeDestroyContainer(paje_event_t event)
400 if (event->timestamp == 0){
401 fprintf(tracing_file, "%d 0 %s %s\n",
403 ((destroyContainer_t)event->data)->container->type->id,
404 ((destroyContainer_t)event->data)->container->id);
406 fprintf(tracing_file, "%d %lf %s %s\n",
409 ((destroyContainer_t)event->data)->container->type->id,
410 ((destroyContainer_t)event->data)->container->id);
414 static void print_pajeSetVariable(paje_event_t event)
416 if (event->timestamp == 0){
417 fprintf(tracing_file, "%d 0 %s %s %f\n",
419 ((setVariable_t)event->data)->type->id,
420 ((setVariable_t)event->data)->container->id,
421 ((setVariable_t)event->data)->value);
423 fprintf(tracing_file, "%d %lf %s %s %f\n",
426 ((setVariable_t)event->data)->type->id,
427 ((setVariable_t)event->data)->container->id,
428 ((setVariable_t)event->data)->value);
432 static void print_pajeAddVariable(paje_event_t event)
434 if (event->timestamp == 0){
435 fprintf(tracing_file, "%d 0 %s %s %f\n",
437 ((addVariable_t)event->data)->type->id,
438 ((addVariable_t)event->data)->container->id,
439 ((addVariable_t)event->data)->value);
441 fprintf(tracing_file, "%d %lf %s %s %f\n",
444 ((addVariable_t)event->data)->type->id,
445 ((addVariable_t)event->data)->container->id,
446 ((addVariable_t)event->data)->value);
450 static void print_pajeSubVariable(paje_event_t event)
452 if (event->timestamp == 0){
453 fprintf(tracing_file, "%d 0 %s %s %f\n",
455 ((subVariable_t)event->data)->type->id,
456 ((subVariable_t)event->data)->container->id,
457 ((subVariable_t)event->data)->value);
459 fprintf(tracing_file, "%d %lf %s %s %f\n",
462 ((subVariable_t)event->data)->type->id,
463 ((subVariable_t)event->data)->container->id,
464 ((subVariable_t)event->data)->value);
468 static void print_pajeSetState(paje_event_t event)
470 if (event->timestamp == 0){
471 fprintf(tracing_file, "%d 0 %s %s %s\n",
473 ((setState_t)event->data)->type->id,
474 ((setState_t)event->data)->container->id,
475 ((setState_t)event->data)->value);
477 fprintf(tracing_file, "%d %lf %s %s %s\n",
480 ((setState_t)event->data)->type->id,
481 ((setState_t)event->data)->container->id,
482 ((setState_t)event->data)->value);
486 static void print_pajePushState(paje_event_t event)
488 if (event->timestamp == 0){
489 fprintf(tracing_file, "%d 0 %s %s %s\n",
491 ((pushState_t)event->data)->type->id,
492 ((pushState_t)event->data)->container->id,
493 ((pushState_t)event->data)->value);
495 fprintf(tracing_file, "%d %lf %s %s %s\n",
498 ((pushState_t)event->data)->type->id,
499 ((pushState_t)event->data)->container->id,
500 ((pushState_t)event->data)->value);
504 static void print_pajePopState(paje_event_t event)
506 if (event->timestamp == 0){
507 fprintf(tracing_file, "%d 0 %s %s\n",
509 ((popState_t)event->data)->type->id,
510 ((popState_t)event->data)->container->id);
512 fprintf(tracing_file, "%d %lf %s %s\n",
515 ((popState_t)event->data)->type->id,
516 ((popState_t)event->data)->container->id);
520 static void print_pajeStartLink(paje_event_t event)
522 if (event->timestamp == 0){
523 fprintf(tracing_file, "%d 0 %s %s %s %s %s\n",
525 ((startLink_t)event->data)->type->id,
526 ((startLink_t)event->data)->container->id,
527 ((startLink_t)event->data)->value,
528 ((startLink_t)event->data)->sourceContainer->id,
529 ((startLink_t)event->data)->key);
531 fprintf(tracing_file, "%d %lf %s %s %s %s %s\n",
534 ((startLink_t)event->data)->type->id,
535 ((startLink_t)event->data)->container->id,
536 ((startLink_t)event->data)->value,
537 ((startLink_t)event->data)->sourceContainer->id,
538 ((startLink_t)event->data)->key);
542 static void print_pajeEndLink(paje_event_t event)
544 if (event->timestamp == 0){
545 fprintf(tracing_file, "%d 0 %s %s %s %s %s\n",
547 ((endLink_t)event->data)->type->id,
548 ((endLink_t)event->data)->container->id,
549 ((endLink_t)event->data)->value,
550 ((endLink_t)event->data)->destContainer->id,
551 ((endLink_t)event->data)->key);
553 fprintf(tracing_file, "%d %lf %s %s %s %s %s\n",
556 ((endLink_t)event->data)->type->id,
557 ((endLink_t)event->data)->container->id,
558 ((endLink_t)event->data)->value,
559 ((endLink_t)event->data)->destContainer->id,
560 ((endLink_t)event->data)->key);
564 static void print_pajeNewEvent (paje_event_t event)
566 if (event->timestamp == 0){
567 fprintf(tracing_file, "%d 0 %s %s %s\n",
569 ((newEvent_t)event->data)->type->id,
570 ((newEvent_t)event->data)->container->id,
571 ((newEvent_t)event->data)->value);
573 fprintf(tracing_file, "%d %lf %s %s %s\n",
576 ((newEvent_t)event->data)->type->id,
577 ((newEvent_t)event->data)->container->id,
578 ((newEvent_t)event->data)->value);
582 static void free_paje_event (paje_event_t event)
584 if (event->event_type == PAJE_SetState) {
585 xbt_free (((setState_t)(event->data))->value);
586 }else if (event->event_type == PAJE_PushState) {
587 xbt_free (((pushState_t)(event->data))->value);
588 }else if (event->event_type == PAJE_NewEvent){
589 xbt_free (((newEvent_t)(event->data))->value);
590 }else if (event->event_type == PAJE_StartLink){
591 xbt_free (((startLink_t)(event->data))->value);
592 xbt_free (((startLink_t)(event->data))->key);
593 }else if (event->event_type == PAJE_EndLink){
594 xbt_free (((endLink_t)(event->data))->value);
595 xbt_free (((endLink_t)(event->data))->key);
597 xbt_free (event->data);
601 void new_pajeDefineContainerType(type_t type)
603 paje_event_t event = xbt_new0(s_paje_event_t, 1);
604 event->event_type = PAJE_DefineContainerType;
605 event->timestamp = 0;
606 event->print = print_pajeDefineContainerType;
607 event->free = free_paje_event;
608 event->data = xbt_new0(s_defineContainerType_t, 1);
609 ((defineContainerType_t)(event->data))->type = type;
612 event->print (event);
616 void new_pajeDefineVariableType(type_t type)
618 paje_event_t event = xbt_new0(s_paje_event_t, 1);
619 event->event_type = PAJE_DefineVariableType;
620 event->timestamp = 0;
621 event->print = print_pajeDefineVariableType;
622 event->free = free_paje_event;
623 event->data = xbt_new0(s_defineVariableType_t, 1);
624 ((defineVariableType_t)(event->data))->type = type;
627 event->print (event);
631 void new_pajeDefineStateType(type_t type)
633 paje_event_t event = xbt_new0(s_paje_event_t, 1);
634 event->event_type = PAJE_DefineStateType;
635 event->timestamp = 0;
636 event->print = print_pajeDefineStateType;
637 event->free = free_paje_event;
638 event->data = xbt_new0(s_defineStateType_t, 1);
639 ((defineStateType_t)(event->data))->type = type;
642 event->print (event);
646 void new_pajeDefineEventType(type_t type)
648 paje_event_t event = xbt_new0(s_paje_event_t, 1);
649 event->event_type = PAJE_DefineEventType;
650 event->timestamp = 0;
651 event->print = print_pajeDefineEventType;
652 event->free = free_paje_event;
653 event->data = xbt_new0(s_defineEventType_t, 1);
654 ((defineEventType_t)(event->data))->type = type;
657 event->print (event);
661 void new_pajeDefineLinkType(type_t type, type_t source, type_t dest)
663 paje_event_t event = xbt_new0(s_paje_event_t, 1);
664 event->event_type = PAJE_DefineLinkType;
665 event->timestamp = 0;
666 event->print = print_pajeDefineLinkType;
667 event->free = free_paje_event;
668 event->data = xbt_new0(s_defineLinkType_t, 1);
669 ((defineLinkType_t)(event->data))->type = type;
670 ((defineLinkType_t)(event->data))->source = source;
671 ((defineLinkType_t)(event->data))->dest = dest;
674 event->print (event);
678 void new_pajeCreateContainer (container_t container)
680 paje_event_t event = xbt_new0(s_paje_event_t, 1);
681 event->event_type = PAJE_CreateContainer;
682 event->timestamp = SIMIX_get_clock();
683 event->print = print_pajeCreateContainer;
684 event->free = free_paje_event;
685 event->data = xbt_new0(s_createContainer_t, 1);
686 ((createContainer_t)(event->data))->container = container;
689 event->print (event);
693 void new_pajeDestroyContainer (container_t container)
695 paje_event_t event = xbt_new0(s_paje_event_t, 1);
696 event->event_type = PAJE_DestroyContainer;
697 event->timestamp = SIMIX_get_clock();
698 event->print = print_pajeDestroyContainer;
699 event->free = free_paje_event;
700 event->data = xbt_new0(s_destroyContainer_t, 1);
701 ((destroyContainer_t)(event->data))->container = container;
704 event->print (event);
708 void new_pajeSetVariable (double timestamp, container_t container, type_t type, double value)
710 paje_event_t event = xbt_new0(s_paje_event_t, 1);
711 event->event_type = PAJE_SetVariable;
712 event->timestamp = timestamp;
713 event->print = print_pajeSetVariable;
714 event->free = free_paje_event;
715 event->data = xbt_new0(s_setVariable_t, 1);
716 ((setVariable_t)(event->data))->type = type;
717 ((setVariable_t)(event->data))->container = container;
718 ((setVariable_t)(event->data))->value = value;
720 insert_into_buffer (event);
724 void new_pajeAddVariable (double timestamp, container_t container, type_t type, double value)
726 paje_event_t event = xbt_new0(s_paje_event_t, 1);
727 event->event_type = PAJE_AddVariable;
728 event->timestamp = timestamp;
729 event->print = print_pajeAddVariable;
730 event->free = free_paje_event;
731 event->data = xbt_new0(s_addVariable_t, 1);
732 ((addVariable_t)(event->data))->type = type;
733 ((addVariable_t)(event->data))->container = container;
734 ((addVariable_t)(event->data))->value = value;
736 insert_into_buffer (event);
739 void new_pajeSubVariable (double timestamp, container_t container, type_t type, double value)
741 paje_event_t event = xbt_new0(s_paje_event_t, 1);
742 event->event_type = PAJE_SubVariable;
743 event->timestamp = timestamp;
744 event->print = print_pajeSubVariable;
745 event->free = free_paje_event;
746 event->data = xbt_new0(s_subVariable_t, 1);
747 ((subVariable_t)(event->data))->type = type;
748 ((subVariable_t)(event->data))->container = container;
749 ((subVariable_t)(event->data))->value = value;
751 insert_into_buffer (event);
754 void new_pajeSetState (double timestamp, container_t container, type_t type, const char *value)
756 paje_event_t event = xbt_new0(s_paje_event_t, 1);
757 event->event_type = PAJE_SetState;
758 event->timestamp = timestamp;
759 event->print = print_pajeSetState;
760 event->free = free_paje_event;
761 event->data = xbt_new0(s_setState_t, 1);
762 ((setState_t)(event->data))->type = type;
763 ((setState_t)(event->data))->container = container;
764 ((setState_t)(event->data))->value = xbt_strdup(value);
766 insert_into_buffer (event);
770 void new_pajePushState (double timestamp, container_t container, type_t type, const char *value)
772 paje_event_t event = xbt_new0(s_paje_event_t, 1);
773 event->event_type = PAJE_PushState;
774 event->timestamp = timestamp;
775 event->print = print_pajePushState;
776 event->free = free_paje_event;
777 event->data = xbt_new0(s_pushState_t, 1);
778 ((pushState_t)(event->data))->type = type;
779 ((pushState_t)(event->data))->container = container;
780 ((pushState_t)(event->data))->value = xbt_strdup(value);
782 insert_into_buffer (event);
786 void new_pajePopState (double timestamp, container_t container, type_t type)
788 paje_event_t event = xbt_new0(s_paje_event_t, 1);
789 event->event_type = PAJE_PopState;
790 event->timestamp = timestamp;
791 event->print = print_pajePopState;
792 event->free = free_paje_event;
793 event->data = xbt_new0(s_popState_t, 1);
794 ((popState_t)(event->data))->type = type;
795 ((popState_t)(event->data))->container = container;
797 insert_into_buffer (event);
800 void new_pajeStartLink (double timestamp, container_t container, type_t type, container_t sourceContainer, const char *value, const char *key)
802 paje_event_t event = xbt_new0(s_paje_event_t, 1);
803 event->event_type = PAJE_StartLink;
804 event->timestamp = timestamp;
805 event->print = print_pajeStartLink;
806 event->free = free_paje_event;
807 event->data = xbt_new0(s_startLink_t, 1);
808 ((startLink_t)(event->data))->type = type;
809 ((startLink_t)(event->data))->container = container;
810 ((startLink_t)(event->data))->sourceContainer = sourceContainer;
811 ((startLink_t)(event->data))->value = xbt_strdup(value);
812 ((startLink_t)(event->data))->key = xbt_strdup(key);
814 insert_into_buffer (event);
817 void new_pajeEndLink (double timestamp, container_t container, type_t type, container_t destContainer, const char *value, const char *key)
819 paje_event_t event = xbt_new0(s_paje_event_t, 1);
820 event->event_type = PAJE_EndLink;
821 event->timestamp = timestamp;
822 event->print = print_pajeEndLink;
823 event->free = free_paje_event;
824 event->data = xbt_new0(s_endLink_t, 1);
825 ((endLink_t)(event->data))->type = type;
826 ((endLink_t)(event->data))->container = container;
827 ((endLink_t)(event->data))->destContainer = destContainer;
828 ((endLink_t)(event->data))->value = xbt_strdup(value);
829 ((endLink_t)(event->data))->key = xbt_strdup(key);
831 insert_into_buffer (event);
834 void new_pajeNewEvent (double timestamp, container_t container, type_t type, const char *value)
836 paje_event_t event = xbt_new0(s_paje_event_t, 1);
837 event->event_type = PAJE_NewEvent;
838 event->timestamp = timestamp;
839 event->print = print_pajeNewEvent;
840 event->free = free_paje_event;
841 event->data = xbt_new0(s_newEvent_t, 1);
842 ((newEvent_t)(event->data))->type = type;
843 ((newEvent_t)(event->data))->container = container;
844 ((newEvent_t)(event->data))->value = xbt_strdup(value);
846 insert_into_buffer (event);
849 #endif /* HAVE_TRACING */