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;
120 typedef struct s_startLink *startLink_t;
121 typedef struct s_startLink {
122 container_t container;
124 container_t sourceContainer;
129 typedef struct s_endLink *endLink_t;
130 typedef struct s_endLink {
131 container_t container;
133 container_t destContainer;
138 typedef struct s_newEvent *newEvent_t;
139 typedef struct s_newEvent {
140 container_t container;
145 static FILE *tracing_file = NULL;
147 static xbt_dynar_t buffer = NULL;
149 void TRACE_paje_start(void)
151 char *filename = TRACE_get_filename();
152 tracing_file = fopen(filename, "w");
153 xbt_assert1 (tracing_file != NULL, "Tracefile %s could not be opened for writing.", filename);
155 DEBUG1("Filename %s is open for writing", filename);
158 TRACE_paje_create_header();
160 buffer = xbt_dynar_new (sizeof(paje_event_t), NULL);
163 void TRACE_paje_end(void)
165 fclose(tracing_file);
166 char *filename = TRACE_get_filename();
167 DEBUG1("Filename %s is closed", filename);
170 void TRACE_paje_dump_buffer (void)
173 while (xbt_dynar_length (buffer) > 0){
174 xbt_dynar_remove_at (buffer, 0, &event);
175 event->print (event);
179 void TRACE_paje_create_header(void)
181 DEBUG0 ("Define paje header");
182 fprintf(tracing_file, "\
183 %%EventDef PajeDefineContainerType %d \n\
185 %% ContainerType string \n\
188 %%EventDef PajeDefineVariableType %d \n\
190 %% ContainerType string \n\
194 %%EventDef PajeDefineStateType %d \n\
196 %% ContainerType string \n\
199 %%EventDef PajeDefineEventType %d \n\
201 %% EntityType string \n\
205 %%EventDef PajeDefineLinkType %d \n\
207 %% ContainerType string \n\
208 %% SourceContainerType string \n\
209 %% DestContainerType string \n\
212 %%EventDef PajeCreateContainer %d \n\
216 %% Container string \n\
219 %%EventDef PajeDestroyContainer %d \n\
222 %% Container string \n\
224 %%EventDef PajeSetVariable %d \n\
226 %% EntityType string \n\
227 %% Container string \n\
230 %%EventDef PajeAddVariable %d \n\
232 %% EntityType string \n\
233 %% Container string \n\
236 %%EventDef PajeSubVariable %d \n\
238 %% EntityType string \n\
239 %% Container string \n\
242 %%EventDef PajeSetState %d \n\
244 %% EntityType string \n\
245 %% Container string \n\
248 %%EventDef PajePushState %d \n\
250 %% EntityType string \n\
251 %% Container string \n\
254 %%EventDef PajePopState %d \n\
256 %% EntityType string \n\
257 %% Container string \n\
259 %%EventDef PajeStartLink %d \n\
261 %% EntityType string \n\
262 %% Container string \n\
264 %% SourceContainer string \n\
267 %%EventDef PajeEndLink %d \n\
269 %% EntityType string \n\
270 %% Container string \n\
272 %% DestContainer string \n\
275 %%EventDef PajeNewEvent %d \n\
277 %% EntityType string \n\
278 %% Container string \n\
281 PAJE_DefineContainerType,
282 PAJE_DefineVariableType,
283 PAJE_DefineStateType,
284 PAJE_DefineEventType,
286 PAJE_CreateContainer,
287 PAJE_DestroyContainer,
299 /* internal do the instrumentation module */
300 static void insert_into_buffer (paje_event_t tbi)
303 if (xbt_dynar_length(buffer) == 0){
304 xbt_dynar_push (buffer, &tbi);
307 for (i = 0; i < xbt_dynar_length(buffer); i++){
308 paje_event_t e1 = *(paje_event_t*)xbt_dynar_get_ptr(buffer, i);
309 if (e1->timestamp > tbi->timestamp){
310 xbt_dynar_insert_at (buffer, i, &tbi);
316 xbt_dynar_push (buffer, &tbi);
321 static void print_pajeDefineContainerType(paje_event_t event)
323 fprintf(tracing_file, "%d %s %s %s\n",
325 ((defineContainerType_t)event->data)->type->id,
326 ((defineContainerType_t)event->data)->type->father->id,
327 ((defineContainerType_t)event->data)->type->name);
330 static void print_pajeDefineVariableType(paje_event_t event)
332 fprintf(tracing_file, "%d %s %s %s \"%s\"\n",
334 ((defineVariableType_t)event->data)->type->id,
335 ((defineVariableType_t)event->data)->type->father->id,
336 ((defineVariableType_t)event->data)->type->name,
337 ((defineVariableType_t)event->data)->type->color);
340 static void print_pajeDefineStateType(paje_event_t event)
342 fprintf(tracing_file, "%d %s %s %s\n",
344 ((defineStateType_t)event->data)->type->id,
345 ((defineStateType_t)event->data)->type->father->id,
346 ((defineStateType_t)event->data)->type->name);
349 static void print_pajeDefineEventType(paje_event_t event)
351 fprintf(tracing_file, "%d %s %s %s \"%s\"\n",
353 ((defineEventType_t)event->data)->type->id,
354 ((defineEventType_t)event->data)->type->father->id,
355 ((defineEventType_t)event->data)->type->name,
356 ((defineEventType_t)event->data)->type->color);
359 static void print_pajeDefineLinkType(paje_event_t event)
361 fprintf(tracing_file, "%d %s %s %s %s %s\n",
363 ((defineLinkType_t)event->data)->type->id,
364 ((defineLinkType_t)event->data)->type->father->id,
365 ((defineLinkType_t)event->data)->source->id,
366 ((defineLinkType_t)event->data)->dest->id,
367 ((defineLinkType_t)event->data)->type->name);
370 static void print_pajeCreateContainer(paje_event_t event)
372 if (event->timestamp == 0){
373 fprintf(tracing_file, "%d 0 %s %s %s %s\n",
375 ((createContainer_t)event->data)->container->id,
376 ((createContainer_t)event->data)->container->type->id,
377 ((createContainer_t)event->data)->container->father->id,
378 ((createContainer_t)event->data)->container->name);
380 fprintf(tracing_file, "%d %lf %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);
390 static void print_pajeDestroyContainer(paje_event_t event)
392 if (event->timestamp == 0){
393 fprintf(tracing_file, "%d 0 %s %s\n",
395 ((destroyContainer_t)event->data)->container->type->id,
396 ((destroyContainer_t)event->data)->container->id);
398 fprintf(tracing_file, "%d %lf %s %s\n",
401 ((destroyContainer_t)event->data)->container->type->id,
402 ((destroyContainer_t)event->data)->container->id);
406 static void print_pajeSetVariable(paje_event_t event)
408 if (event->timestamp == 0){
409 fprintf(tracing_file, "%d 0 %s %s %f\n",
411 ((setVariable_t)event->data)->type->id,
412 ((setVariable_t)event->data)->container->id,
413 ((setVariable_t)event->data)->value);
415 fprintf(tracing_file, "%d %lf %s %s %f\n",
418 ((setVariable_t)event->data)->type->id,
419 ((setVariable_t)event->data)->container->id,
420 ((setVariable_t)event->data)->value);
424 static void print_pajeAddVariable(paje_event_t event)
426 if (event->timestamp == 0){
427 fprintf(tracing_file, "%d 0 %s %s %f\n",
429 ((addVariable_t)event->data)->type->id,
430 ((addVariable_t)event->data)->container->id,
431 ((addVariable_t)event->data)->value);
433 fprintf(tracing_file, "%d %lf %s %s %f\n",
436 ((addVariable_t)event->data)->type->id,
437 ((addVariable_t)event->data)->container->id,
438 ((addVariable_t)event->data)->value);
442 static void print_pajeSubVariable(paje_event_t event)
444 if (event->timestamp == 0){
445 fprintf(tracing_file, "%d 0 %s %s %f\n",
447 ((subVariable_t)event->data)->type->id,
448 ((subVariable_t)event->data)->container->id,
449 ((subVariable_t)event->data)->value);
451 fprintf(tracing_file, "%d %lf %s %s %f\n",
454 ((subVariable_t)event->data)->type->id,
455 ((subVariable_t)event->data)->container->id,
456 ((subVariable_t)event->data)->value);
460 static void print_pajeSetState(paje_event_t event)
462 if (event->timestamp == 0){
463 fprintf(tracing_file, "%d 0 %s %s %s\n",
465 ((setState_t)event->data)->type->id,
466 ((setState_t)event->data)->container->id,
467 ((setState_t)event->data)->value);
469 fprintf(tracing_file, "%d %lf %s %s %s\n",
472 ((setState_t)event->data)->type->id,
473 ((setState_t)event->data)->container->id,
474 ((setState_t)event->data)->value);
478 static void print_pajePushState(paje_event_t event)
480 if (event->timestamp == 0){
481 fprintf(tracing_file, "%d 0 %s %s %s\n",
483 ((pushState_t)event->data)->type->id,
484 ((pushState_t)event->data)->container->id,
485 ((pushState_t)event->data)->value);
487 fprintf(tracing_file, "%d %lf %s %s %s\n",
490 ((pushState_t)event->data)->type->id,
491 ((pushState_t)event->data)->container->id,
492 ((pushState_t)event->data)->value);
496 static void print_pajePopState(paje_event_t event)
498 if (event->timestamp == 0){
499 fprintf(tracing_file, "%d 0 %s %s\n",
501 ((popState_t)event->data)->type->id,
502 ((popState_t)event->data)->container->id);
504 fprintf(tracing_file, "%d %lf %s %s\n",
507 ((popState_t)event->data)->type->id,
508 ((popState_t)event->data)->container->id);
512 static void print_pajeStartLink(paje_event_t event)
514 if (event->timestamp == 0){
515 fprintf(tracing_file, "%d 0 %s %s %s %s %s\n",
517 ((startLink_t)event->data)->type->id,
518 ((startLink_t)event->data)->container->id,
519 ((startLink_t)event->data)->value,
520 ((startLink_t)event->data)->sourceContainer->id,
521 ((startLink_t)event->data)->key);
523 fprintf(tracing_file, "%d %lf %s %s %s %s %s\n",
526 ((startLink_t)event->data)->type->id,
527 ((startLink_t)event->data)->container->id,
528 ((startLink_t)event->data)->value,
529 ((startLink_t)event->data)->sourceContainer->id,
530 ((startLink_t)event->data)->key);
534 static void print_pajeEndLink(paje_event_t event)
536 if (event->timestamp == 0){
537 fprintf(tracing_file, "%d 0 %s %s %s %s %s\n",
539 ((endLink_t)event->data)->type->id,
540 ((endLink_t)event->data)->container->id,
541 ((endLink_t)event->data)->value,
542 ((endLink_t)event->data)->destContainer->id,
543 ((endLink_t)event->data)->key);
545 fprintf(tracing_file, "%d %lf %s %s %s %s %s\n",
548 ((endLink_t)event->data)->type->id,
549 ((endLink_t)event->data)->container->id,
550 ((endLink_t)event->data)->value,
551 ((endLink_t)event->data)->destContainer->id,
552 ((endLink_t)event->data)->key);
556 static void print_pajeNewEvent (paje_event_t event)
558 if (event->timestamp == 0){
559 fprintf(tracing_file, "%d 0 %s %s %s\n",
561 ((newEvent_t)event->data)->type->id,
562 ((newEvent_t)event->data)->container->id,
563 ((newEvent_t)event->data)->value);
565 fprintf(tracing_file, "%d %lf %s %s %s\n",
568 ((newEvent_t)event->data)->type->id,
569 ((newEvent_t)event->data)->container->id,
570 ((newEvent_t)event->data)->value);
574 void new_pajeDefineContainerType(type_t type)
576 paje_event_t event = xbt_new0(s_paje_event_t, 1);
577 event->event_type = PAJE_DefineContainerType;
578 event->timestamp = 0;
579 event->print = print_pajeDefineContainerType;
580 event->data = xbt_new0(s_defineContainerType_t, 1);
581 ((defineContainerType_t)(event->data))->type = type;
584 event->print (event);
587 xbt_free (event->data);
592 void new_pajeDefineVariableType(type_t type)
594 paje_event_t event = xbt_new0(s_paje_event_t, 1);
595 event->event_type = PAJE_DefineVariableType;
596 event->timestamp = 0;
597 event->print = print_pajeDefineVariableType;
598 event->data = xbt_new0(s_defineVariableType_t, 1);
599 ((defineVariableType_t)(event->data))->type = type;
602 event->print (event);
605 xbt_free (event->data);
610 void new_pajeDefineStateType(type_t type)
612 paje_event_t event = xbt_new0(s_paje_event_t, 1);
613 event->event_type = PAJE_DefineStateType;
614 event->timestamp = 0;
615 event->print = print_pajeDefineStateType;
616 event->data = xbt_new0(s_defineStateType_t, 1);
617 ((defineStateType_t)(event->data))->type = type;
620 event->print (event);
623 xbt_free (event->data);
628 void new_pajeDefineEventType(type_t type)
630 paje_event_t event = xbt_new0(s_paje_event_t, 1);
631 event->event_type = PAJE_DefineEventType;
632 event->timestamp = 0;
633 event->print = print_pajeDefineEventType;
634 event->data = xbt_new0(s_defineEventType_t, 1);
635 ((defineEventType_t)(event->data))->type = type;
638 event->print (event);
641 xbt_free (event->data);
646 void new_pajeDefineLinkType(type_t type, type_t source, type_t dest)
648 paje_event_t event = xbt_new0(s_paje_event_t, 1);
649 event->event_type = PAJE_DefineLinkType;
650 event->timestamp = 0;
651 event->print = print_pajeDefineLinkType;
652 event->data = xbt_new0(s_defineLinkType_t, 1);
653 ((defineLinkType_t)(event->data))->type = type;
654 ((defineLinkType_t)(event->data))->source = source;
655 ((defineLinkType_t)(event->data))->dest = dest;
658 event->print (event);
661 xbt_free (event->data);
666 void new_pajeCreateContainer (container_t container)
668 paje_event_t event = xbt_new0(s_paje_event_t, 1);
669 event->event_type = PAJE_CreateContainer;
670 event->timestamp = SIMIX_get_clock();
671 event->print = print_pajeCreateContainer;
672 event->data = xbt_new0(s_createContainer_t, 1);
673 ((createContainer_t)(event->data))->container = container;
676 event->print (event);
679 xbt_free (event->data);
684 void new_pajeDestroyContainer (container_t container)
686 paje_event_t event = xbt_new0(s_paje_event_t, 1);
687 event->event_type = PAJE_DestroyContainer;
688 event->timestamp = SIMIX_get_clock();
689 event->print = print_pajeDestroyContainer;
690 event->data = xbt_new0(s_destroyContainer_t, 1);
691 ((destroyContainer_t)(event->data))->container = container;
694 event->print (event);
697 xbt_free (event->data);
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->data = xbt_new0(s_setVariable_t, 1);
709 ((setVariable_t)(event->data))->type = type;
710 ((setVariable_t)(event->data))->container = container;
711 ((setVariable_t)(event->data))->value = value;
713 insert_into_buffer (event);
717 event->print (event);
720 xbt_free (event->data);
726 void new_pajeAddVariable (double timestamp, container_t container, type_t type, double value)
728 paje_event_t event = xbt_new0(s_paje_event_t, 1);
729 event->event_type = PAJE_AddVariable;
730 event->timestamp = timestamp;
731 event->print = print_pajeAddVariable;
732 event->data = xbt_new0(s_addVariable_t, 1);
733 ((addVariable_t)(event->data))->type = type;
734 ((addVariable_t)(event->data))->container = container;
735 ((addVariable_t)(event->data))->value = value;
737 insert_into_buffer (event);
741 event->print (event);
744 xbt_free (event->data);
749 void new_pajeSubVariable (double timestamp, container_t container, type_t type, double value)
751 paje_event_t event = xbt_new0(s_paje_event_t, 1);
752 event->event_type = PAJE_SubVariable;
753 event->timestamp = timestamp;
754 event->print = print_pajeSubVariable;
755 event->data = xbt_new0(s_subVariable_t, 1);
756 ((subVariable_t)(event->data))->type = type;
757 ((subVariable_t)(event->data))->container = container;
758 ((subVariable_t)(event->data))->value = value;
760 insert_into_buffer (event);
764 event->print (event);
767 xbt_free (event->data);
772 void new_pajeSetState (double timestamp, container_t container, type_t type, const char *value)
774 paje_event_t event = xbt_new0(s_paje_event_t, 1);
775 event->event_type = PAJE_SetState;
776 event->timestamp = timestamp;
777 event->print = print_pajeSetState;
778 event->data = xbt_new0(s_setState_t, 1);
779 ((setState_t)(event->data))->type = type;
780 ((setState_t)(event->data))->container = container;
781 ((setState_t)(event->data))->value = xbt_strdup(value);
783 insert_into_buffer (event);
787 event->print (event);
790 xbt_free (((setState_t)(event->data))->value);
791 xbt_free (event->data);
797 void new_pajePushState (double timestamp, container_t container, type_t type, const char *value)
799 paje_event_t event = xbt_new0(s_paje_event_t, 1);
800 event->event_type = PAJE_PushState;
801 event->timestamp = timestamp;
802 event->print = print_pajePushState;
803 event->data = xbt_new0(s_pushState_t, 1);
804 ((pushState_t)(event->data))->type = type;
805 ((pushState_t)(event->data))->container = container;
806 ((pushState_t)(event->data))->value = xbt_strdup(value);
808 insert_into_buffer (event);
812 event->print (event);
815 xbt_free (((pushState_t)(event->data))->value);
816 xbt_free (event->data);
822 void new_pajePopState (double timestamp, container_t container, type_t type)
824 paje_event_t event = xbt_new0(s_paje_event_t, 1);
825 event->event_type = PAJE_PopState;
826 event->timestamp = timestamp;
827 event->print = print_pajePopState;
828 event->data = xbt_new0(s_popState_t, 1);
829 ((popState_t)(event->data))->type = type;
830 ((popState_t)(event->data))->container = container;
832 insert_into_buffer (event);
836 event->print (event);
839 xbt_free (event->data);
844 void new_pajeStartLink (double timestamp, container_t container, type_t type, container_t sourceContainer, const char *value, const char *key)
846 paje_event_t event = xbt_new0(s_paje_event_t, 1);
847 event->event_type = PAJE_StartLink;
848 event->timestamp = timestamp;
849 event->print = print_pajeStartLink;
850 event->data = xbt_new0(s_startLink_t, 1);
851 ((startLink_t)(event->data))->type = type;
852 ((startLink_t)(event->data))->container = container;
853 ((startLink_t)(event->data))->sourceContainer = sourceContainer;
854 ((startLink_t)(event->data))->value = xbt_strdup(value);
855 ((startLink_t)(event->data))->key = xbt_strdup(key);
857 insert_into_buffer (event);
861 event->print (event);
864 xbt_free (((startLink_t)(event->data))->value);
865 xbt_free (((startLink_t)(event->data))->key);
866 xbt_free (event->data);
871 void new_pajeEndLink (double timestamp, container_t container, type_t type, container_t destContainer, const char *value, const char *key)
873 paje_event_t event = xbt_new0(s_paje_event_t, 1);
874 event->event_type = PAJE_EndLink;
875 event->timestamp = timestamp;
876 event->print = print_pajeEndLink;
877 event->data = xbt_new0(s_endLink_t, 1);
878 ((endLink_t)(event->data))->type = type;
879 ((endLink_t)(event->data))->container = container;
880 ((endLink_t)(event->data))->destContainer = destContainer;
881 ((endLink_t)(event->data))->value = xbt_strdup(value);
882 ((endLink_t)(event->data))->key = xbt_strdup(key);
884 insert_into_buffer (event);
888 event->print (event);
891 xbt_free (((endLink_t)(event->data))->value);
892 xbt_free (((endLink_t)(event->data))->key);
893 xbt_free (event->data);
898 void new_pajeNewEvent (double timestamp, container_t container, type_t type, const char *value)
900 paje_event_t event = xbt_new0(s_paje_event_t, 1);
901 event->event_type = PAJE_NewEvent;
902 event->timestamp = timestamp;
903 event->print = print_pajeNewEvent;
904 event->data = xbt_new0(s_newEvent_t, 1);
905 ((newEvent_t)(event->data))->type = type;
906 ((newEvent_t)(event->data))->container = container;
907 ((newEvent_t)(event->data))->value = xbt_strdup(value);
909 insert_into_buffer (event);
913 event->print (event);
916 xbt_free (((newEvent_t)(event->data))->value);
917 xbt_free (event->data);
922 //void pajeNewEvent(double time, const char *entityType,
923 // const char *container, const char *value)
925 // INSTR_PAJE_ASSERT(entityType);
926 // INSTR_PAJE_ASSERT(container);
927 // INSTR_PAJE_ASSERT(value);
930 // fprintf(tracing_file, "%d 0 %s %s %s\n", pajeNewEventId,
931 // entityType, container, value);
933 // fprintf(tracing_file, "%d %lf %s %s %s\n", pajeNewEventId, time,
934 // entityType, container, value);
938 #endif /* HAVE_TRACING */