Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
d325846f97dacdc88fa647402003f960428e8f5c
[simgrid.git] / src / instr / instr_paje_trace.c
1 /* Copyright (c) 2010. The SimGrid Team.
2  * All rights reserved.                                                     */
3
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. */
6
7 #include "instr/instr_private.h"
8
9 #ifdef HAVE_TRACING
10
11 #define INSTR_PAJE_ASSERT(str) {xbt_assert1(str!=NULL&&strlen(str)>0, "'%s' is NULL or length is zero", #str);}
12
13 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(instr_paje_trace, instr, "Paje tracing event system");
14
15 typedef enum {
16   PAJE_DefineContainerType,
17   PAJE_DefineVariableType,
18   PAJE_DefineStateType,
19   PAJE_DefineEventType,
20   PAJE_DefineLinkType,
21   PAJE_CreateContainer,
22   PAJE_DestroyContainer,
23   PAJE_SetVariable,
24   PAJE_AddVariable,
25   PAJE_SubVariable,
26   PAJE_SetState,
27   PAJE_PushState,
28   PAJE_PopState,
29   PAJE_StartLink,
30   PAJE_EndLink,
31   PAJE_NewEvent,
32 } e_event_type;
33
34 typedef struct paje_event *paje_event_t;
35 typedef struct paje_event {
36   double timestamp;
37   e_event_type event_type;
38   void (*print) (paje_event_t event);
39   void *data;
40 } s_paje_event_t;
41
42 typedef struct s_defineContainerType *defineContainerType_t;
43 typedef struct s_defineContainerType {
44   type_t type;
45 }s_defineContainerType_t;
46
47 typedef struct s_defineVariableType *defineVariableType_t;
48 typedef struct s_defineVariableType {
49   type_t type;
50 }s_defineVariableType_t;
51
52 typedef struct s_defineStateType *defineStateType_t;
53 typedef struct s_defineStateType {
54   type_t type;
55 }s_defineStateType_t;
56
57 typedef struct s_defineEventType *defineEventType_t;
58 typedef struct s_defineEventType {
59   type_t type;
60 }s_defineEventType_t;
61
62 typedef struct s_defineLinkType *defineLinkType_t;
63 typedef struct s_defineLinkType {
64   type_t type;
65   type_t source;
66   type_t dest;
67 }s_defineLinkType_t;
68
69 typedef struct s_createContainer *createContainer_t;
70 typedef struct s_createContainer {
71   container_t container;
72 }s_createContainer_t;
73
74 typedef struct s_destroyContainer *destroyContainer_t;
75 typedef struct s_destroyContainer {
76   container_t container;
77 }s_destroyContainer_t;
78
79 typedef struct s_setVariable *setVariable_t;
80 typedef struct s_setVariable {
81   container_t container;
82   type_t type;
83   double value;
84 }s_setVariable_t;
85
86 typedef struct s_addVariable *addVariable_t;
87 typedef struct s_addVariable {
88   container_t container;
89   type_t type;
90   double value;
91 }s_addVariable_t;
92
93 typedef struct s_subVariable *subVariable_t;
94 typedef struct s_subVariable {
95   container_t container;
96   type_t type;
97   double value;
98 }s_subVariable_t;
99
100 typedef struct s_setState *setState_t;
101 typedef struct s_setState {
102   container_t container;
103   type_t type;
104   char *value;
105 }s_setState_t;
106
107 typedef struct s_pushState *pushState_t;
108 typedef struct s_pushState {
109   container_t container;
110   type_t type;
111   char *value;
112 }s_pushState_t;
113
114 typedef struct s_popState *popState_t;
115 typedef struct s_popState {
116   container_t container;
117   type_t type;
118 }s_popState_t;
119
120 typedef struct s_startLink *startLink_t;
121 typedef struct s_startLink {
122   container_t container;
123   type_t type;
124   container_t sourceContainer;
125   char *value;
126   char *key;
127 }s_startLink_t;
128
129 typedef struct s_endLink *endLink_t;
130 typedef struct s_endLink {
131   container_t container;
132   type_t type;
133   container_t destContainer;
134   char *value;
135   char *key;
136 }s_endLink_t;
137
138 typedef struct s_newEvent *newEvent_t;
139 typedef struct s_newEvent {
140   container_t container;
141   type_t type;
142   char *value;
143 }s_newEvent_t;
144
145 static FILE *tracing_file = NULL;
146
147 static xbt_dynar_t buffer = NULL;
148
149 void TRACE_paje_start(void)
150 {
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);
154
155   DEBUG1("Filename %s is open for writing", filename);
156
157   /* output header */
158   TRACE_paje_create_header();
159
160   buffer = xbt_dynar_new (sizeof(paje_event_t), NULL);
161 }
162
163 void TRACE_paje_end(void)
164 {
165   fclose(tracing_file);
166   char *filename = TRACE_get_filename();
167   DEBUG1("Filename %s is closed", filename);
168 }
169
170 void TRACE_paje_dump_buffer (void)
171 {
172   paje_event_t event;
173   while (xbt_dynar_length (buffer) > 0){
174     xbt_dynar_remove_at (buffer, 0, &event);
175     event->print (event);
176   }
177 }
178
179 void TRACE_paje_create_header(void)
180 {
181   DEBUG0 ("Define paje header");
182   fprintf(tracing_file, "\
183 %%EventDef PajeDefineContainerType %d \n\
184 %%       Alias string \n\
185 %%       ContainerType string \n\
186 %%       Name string \n\
187 %%EndEventDef \n\
188 %%EventDef PajeDefineVariableType %d \n\
189 %%       Alias string \n\
190 %%       ContainerType string \n\
191 %%       Name string \n\
192 %%       Color color \n\
193 %%EndEventDef \n\
194 %%EventDef PajeDefineStateType %d \n\
195 %%       Alias string \n\
196 %%       ContainerType string \n\
197 %%       Name string \n\
198 %%EndEventDef \n\
199 %%EventDef PajeDefineEventType %d \n\
200 %%       Alias string \n\
201 %%       EntityType string \n\
202 %%       Name string \n\
203 %%       Color color \n\
204 %%EndEventDef \n\
205 %%EventDef PajeDefineLinkType %d \n\
206 %%       Alias string \n\
207 %%       ContainerType string \n\
208 %%       SourceContainerType string \n\
209 %%       DestContainerType string \n\
210 %%       Name string \n\
211 %%EndEventDef \n\
212 %%EventDef PajeCreateContainer %d \n\
213 %%       Time date \n\
214 %%       Alias string \n\
215 %%       Type string \n\
216 %%       Container string \n\
217 %%       Name string \n\
218 %%EndEventDef \n\
219 %%EventDef PajeDestroyContainer %d \n\
220 %%       Time date \n\
221 %%       Type string \n\
222 %%       Container string \n\
223 %%EndEventDef \n\
224 %%EventDef PajeSetVariable %d \n\
225 %%       Time date \n\
226 %%       EntityType string \n\
227 %%       Container string \n\
228 %%       Value string \n\
229 %%EndEventDef\n\
230 %%EventDef PajeAddVariable %d \n\
231 %%       Time date \n\
232 %%       EntityType string \n\
233 %%       Container string \n\
234 %%       Value string \n\
235 %%EndEventDef\n\
236 %%EventDef PajeSubVariable %d \n\
237 %%       Time date \n\
238 %%       EntityType string \n\
239 %%       Container string \n\
240 %%       Value string \n\
241 %%EndEventDef\n\
242 %%EventDef PajeSetState %d \n\
243 %%       Time date \n\
244 %%       EntityType string \n\
245 %%       Container string \n\
246 %%       Value string \n\
247 %%EndEventDef\n\
248 %%EventDef PajePushState %d \n\
249 %%       Time date \n\
250 %%       EntityType string \n\
251 %%       Container string \n\
252 %%       Value string \n\
253 %%EndEventDef\n\
254 %%EventDef PajePopState %d \n\
255 %%       Time date \n\
256 %%       EntityType string \n\
257 %%       Container string \n\
258 %%EndEventDef\n\
259 %%EventDef PajeStartLink %d \n\
260 %%       Time date \n\
261 %%       EntityType string \n\
262 %%       Container string \n\
263 %%       Value string \n\
264 %%       SourceContainer string \n\
265 %%       Key string \n\
266 %%EndEventDef\n\
267 %%EventDef PajeEndLink %d \n\
268 %%       Time date \n\
269 %%       EntityType string \n\
270 %%       Container string \n\
271 %%       Value string \n\
272 %%       DestContainer string \n\
273 %%       Key string \n\
274 %%EndEventDef\n\
275 %%EventDef PajeNewEvent %d \n\
276 %%       Time date \n\
277 %%       EntityType string \n\
278 %%       Container string \n\
279 %%       Value string \n\
280 %%EndEventDef\n",
281   PAJE_DefineContainerType,
282   PAJE_DefineVariableType,
283   PAJE_DefineStateType,
284   PAJE_DefineEventType,
285   PAJE_DefineLinkType,
286   PAJE_CreateContainer,
287   PAJE_DestroyContainer,
288   PAJE_SetVariable,
289   PAJE_AddVariable,
290   PAJE_SubVariable,
291   PAJE_SetState,
292   PAJE_PushState,
293   PAJE_PopState,
294   PAJE_StartLink,
295   PAJE_EndLink,
296   PAJE_NewEvent);
297 }
298
299 /* internal do the instrumentation module */
300 static void insert_into_buffer (paje_event_t tbi)
301 {
302   unsigned int i;
303   if (xbt_dynar_length(buffer) == 0){
304     xbt_dynar_push (buffer, &tbi);
305   }else{
306     int inserted = 0;
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);
311         inserted = 1;
312         break;
313       }
314     }
315     if (!inserted){
316       xbt_dynar_push (buffer, &tbi);
317     }
318   }
319 }
320
321 static void print_pajeDefineContainerType(paje_event_t event)
322 {
323   fprintf(tracing_file, "%d %s %s %s\n",
324       event->event_type,
325       ((defineContainerType_t)event->data)->type->id,
326       ((defineContainerType_t)event->data)->type->father->id,
327       ((defineContainerType_t)event->data)->type->name);
328 }
329
330 static void print_pajeDefineVariableType(paje_event_t event)
331 {
332   fprintf(tracing_file, "%d %s %s %s \"%s\"\n",
333       event->event_type,
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);
338 }
339
340 static void print_pajeDefineStateType(paje_event_t event)
341 {
342   fprintf(tracing_file, "%d %s %s %s\n",
343       event->event_type,
344       ((defineStateType_t)event->data)->type->id,
345       ((defineStateType_t)event->data)->type->father->id,
346       ((defineStateType_t)event->data)->type->name);
347 }
348
349 static void print_pajeDefineEventType(paje_event_t event)
350 {
351   fprintf(tracing_file, "%d %s %s %s \"%s\"\n",
352       event->event_type,
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);
357 }
358
359 static void print_pajeDefineLinkType(paje_event_t event)
360 {
361   fprintf(tracing_file, "%d %s %s %s %s %s\n",
362       event->event_type,
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);
368 }
369
370 static void print_pajeCreateContainer(paje_event_t event)
371 {
372   if (event->timestamp == 0){
373     fprintf(tracing_file, "%d 0 %s %s %s %s\n",
374         event->event_type,
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);
379   }else{
380     fprintf(tracing_file, "%d %lf %s %s %s %s\n",
381         event->event_type,
382         event->timestamp,
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);
387   }
388 }
389
390 static void print_pajeDestroyContainer(paje_event_t event)
391 {
392   if (event->timestamp == 0){
393     fprintf(tracing_file, "%d 0 %s %s\n",
394         event->event_type,
395         ((destroyContainer_t)event->data)->container->type->id,
396         ((destroyContainer_t)event->data)->container->id);
397   }else{
398     fprintf(tracing_file, "%d %lf %s %s\n",
399         event->event_type,
400         event->timestamp,
401         ((destroyContainer_t)event->data)->container->type->id,
402         ((destroyContainer_t)event->data)->container->id);
403   }
404 }
405
406 static void print_pajeSetVariable(paje_event_t event)
407 {
408   if (event->timestamp == 0){
409     fprintf(tracing_file, "%d 0 %s %s %f\n",
410         event->event_type,
411         ((setVariable_t)event->data)->type->id,
412         ((setVariable_t)event->data)->container->id,
413         ((setVariable_t)event->data)->value);
414   }else{
415     fprintf(tracing_file, "%d %lf %s %s %f\n",
416         event->event_type,
417         event->timestamp,
418         ((setVariable_t)event->data)->type->id,
419         ((setVariable_t)event->data)->container->id,
420         ((setVariable_t)event->data)->value);
421   }
422 }
423
424 static void print_pajeAddVariable(paje_event_t event)
425 {
426   if (event->timestamp == 0){
427     fprintf(tracing_file, "%d 0 %s %s %f\n",
428         event->event_type,
429         ((addVariable_t)event->data)->type->id,
430         ((addVariable_t)event->data)->container->id,
431         ((addVariable_t)event->data)->value);
432   }else{
433     fprintf(tracing_file, "%d %lf %s %s %f\n",
434         event->event_type,
435         event->timestamp,
436         ((addVariable_t)event->data)->type->id,
437         ((addVariable_t)event->data)->container->id,
438         ((addVariable_t)event->data)->value);
439   }
440 }
441
442 static void print_pajeSubVariable(paje_event_t event)
443 {
444   if (event->timestamp == 0){
445     fprintf(tracing_file, "%d 0 %s %s %f\n",
446         event->event_type,
447         ((subVariable_t)event->data)->type->id,
448         ((subVariable_t)event->data)->container->id,
449         ((subVariable_t)event->data)->value);
450   }else{
451     fprintf(tracing_file, "%d %lf %s %s %f\n",
452         event->event_type,
453         event->timestamp,
454         ((subVariable_t)event->data)->type->id,
455         ((subVariable_t)event->data)->container->id,
456         ((subVariable_t)event->data)->value);
457   }
458 }
459
460 static void print_pajeSetState(paje_event_t event)
461 {
462   if (event->timestamp == 0){
463     fprintf(tracing_file, "%d 0 %s %s %s\n",
464         event->event_type,
465         ((setState_t)event->data)->type->id,
466         ((setState_t)event->data)->container->id,
467         ((setState_t)event->data)->value);
468   }else{
469     fprintf(tracing_file, "%d %lf %s %s %s\n",
470         event->event_type,
471         event->timestamp,
472         ((setState_t)event->data)->type->id,
473         ((setState_t)event->data)->container->id,
474         ((setState_t)event->data)->value);
475   }
476 }
477
478 static void print_pajePushState(paje_event_t event)
479 {
480   if (event->timestamp == 0){
481     fprintf(tracing_file, "%d 0 %s %s %s\n",
482         event->event_type,
483         ((pushState_t)event->data)->type->id,
484         ((pushState_t)event->data)->container->id,
485         ((pushState_t)event->data)->value);
486   }else{
487     fprintf(tracing_file, "%d %lf %s %s %s\n",
488         event->event_type,
489         event->timestamp,
490         ((pushState_t)event->data)->type->id,
491         ((pushState_t)event->data)->container->id,
492         ((pushState_t)event->data)->value);
493   }
494 }
495
496 static void print_pajePopState(paje_event_t event)
497 {
498   if (event->timestamp == 0){
499     fprintf(tracing_file, "%d 0 %s %s\n",
500         event->event_type,
501         ((popState_t)event->data)->type->id,
502         ((popState_t)event->data)->container->id);
503   }else{
504     fprintf(tracing_file, "%d %lf %s %s\n",
505         event->event_type,
506         event->timestamp,
507         ((popState_t)event->data)->type->id,
508         ((popState_t)event->data)->container->id);
509   }
510 }
511
512 static void print_pajeStartLink(paje_event_t event)
513 {
514   if (event->timestamp == 0){
515     fprintf(tracing_file, "%d 0 %s %s %s %s %s\n",
516         event->event_type,
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);
522   }else {
523     fprintf(tracing_file, "%d %lf %s %s %s %s %s\n",
524         event->event_type,
525         event->timestamp,
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);
531   }
532 }
533
534 static void print_pajeEndLink(paje_event_t event)
535 {
536   if (event->timestamp == 0){
537     fprintf(tracing_file, "%d 0 %s %s %s %s %s\n",
538         event->event_type,
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);
544   }else {
545     fprintf(tracing_file, "%d %lf %s %s %s %s %s\n",
546         event->event_type,
547         event->timestamp,
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);
553   }
554 }
555
556 static void print_pajeNewEvent (paje_event_t event)
557 {
558   if (event->timestamp == 0){
559     fprintf(tracing_file, "%d 0 %s %s %s\n",
560         event->event_type,
561         ((newEvent_t)event->data)->type->id,
562         ((newEvent_t)event->data)->container->id,
563         ((newEvent_t)event->data)->value);
564   }else{
565     fprintf(tracing_file, "%d %lf %s %s %s\n",
566         event->event_type,
567         event->timestamp,
568         ((newEvent_t)event->data)->type->id,
569         ((newEvent_t)event->data)->container->id,
570         ((newEvent_t)event->data)->value);
571   }
572 }
573
574 void new_pajeDefineContainerType(type_t type)
575 {
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;
582
583   //print it
584   event->print (event);
585
586   //destroy it
587   xbt_free (event->data);
588   xbt_free (event);
589   event = NULL;
590 }
591
592 void new_pajeDefineVariableType(type_t type)
593 {
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;
600
601   //print it
602   event->print (event);
603
604   //destroy it
605   xbt_free (event->data);
606   xbt_free (event);
607   event = NULL;
608 }
609
610 void new_pajeDefineStateType(type_t type)
611 {
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;
618
619   //print it
620   event->print (event);
621
622   //destroy it
623   xbt_free (event->data);
624   xbt_free (event);
625   event = NULL;
626 }
627
628 void new_pajeDefineEventType(type_t type)
629 {
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;
636
637   //print it
638   event->print (event);
639
640   //destroy it
641   xbt_free (event->data);
642   xbt_free (event);
643   event = NULL;
644 }
645
646 void new_pajeDefineLinkType(type_t type, type_t source, type_t dest)
647 {
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;
656
657   //print it
658   event->print (event);
659
660   //destroy it
661   xbt_free (event->data);
662   xbt_free (event);
663   event = NULL;
664 }
665
666 void new_pajeCreateContainer (container_t container)
667 {
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;
674
675   //print it
676   event->print (event);
677
678   //destroy it
679   xbt_free (event->data);
680   xbt_free (event);
681   event = NULL;
682 }
683
684 void new_pajeDestroyContainer (container_t container)
685 {
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;
692
693   //print it
694   event->print (event);
695
696   //destroy it
697   xbt_free (event->data);
698   xbt_free (event);
699   event = NULL;
700 }
701
702 void new_pajeSetVariable (double timestamp, container_t container, type_t type, double value)
703 {
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;
712
713   insert_into_buffer (event);
714   return;
715
716   //print it
717   event->print (event);
718
719   //destroy it
720   xbt_free (event->data);
721   xbt_free (event);
722   event = NULL;
723 }
724
725
726 void new_pajeAddVariable (double timestamp, container_t container, type_t type, double value)
727 {
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;
736
737   insert_into_buffer (event);
738   return;
739
740   //print it
741   event->print (event);
742
743   //destroy it
744   xbt_free (event->data);
745   xbt_free (event);
746   event = NULL;
747 }
748
749 void new_pajeSubVariable (double timestamp, container_t container, type_t type, double value)
750 {
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;
759
760   insert_into_buffer (event);
761   return;
762
763   //print it
764   event->print (event);
765
766   //destroy it
767   xbt_free (event->data);
768   xbt_free (event);
769   event = NULL;
770 }
771
772 void new_pajeSetState (double timestamp, container_t container, type_t type, const char *value)
773 {
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);
782
783   insert_into_buffer (event);
784   return;
785
786   //print it
787   event->print (event);
788
789   //destroy it
790   xbt_free (((setState_t)(event->data))->value);
791   xbt_free (event->data);
792   xbt_free (event);
793   event = NULL;
794 }
795
796
797 void new_pajePushState (double timestamp, container_t container, type_t type, const char *value)
798 {
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);
807
808   insert_into_buffer (event);
809   return;
810
811   //print it
812   event->print (event);
813
814   //destroy it
815   xbt_free (((pushState_t)(event->data))->value);
816   xbt_free (event->data);
817   xbt_free (event);
818   event = NULL;
819 }
820
821
822 void new_pajePopState (double timestamp, container_t container, type_t type)
823 {
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;
831
832   insert_into_buffer (event);
833   return;
834
835   //print it
836   event->print (event);
837
838   //destroy it
839   xbt_free (event->data);
840   xbt_free (event);
841   event = NULL;
842 }
843
844 void new_pajeStartLink (double timestamp, container_t container, type_t type, container_t sourceContainer, const char *value, const char *key)
845 {
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);
856
857   insert_into_buffer (event);
858   return;
859
860   //print it
861   event->print (event);
862
863   //destroy it
864   xbt_free (((startLink_t)(event->data))->value);
865   xbt_free (((startLink_t)(event->data))->key);
866   xbt_free (event->data);
867   xbt_free (event);
868   event = NULL;
869 }
870
871 void new_pajeEndLink (double timestamp, container_t container, type_t type, container_t destContainer, const char *value, const char *key)
872 {
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);
883
884   insert_into_buffer (event);
885   return;
886
887   //print it
888   event->print (event);
889
890   //destroy it
891   xbt_free (((endLink_t)(event->data))->value);
892   xbt_free (((endLink_t)(event->data))->key);
893   xbt_free (event->data);
894   xbt_free (event);
895   event = NULL;
896 }
897
898 void new_pajeNewEvent (double timestamp, container_t container, type_t type, const char *value)
899 {
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);
908
909   insert_into_buffer (event);
910   return;
911
912   //print it
913   event->print (event);
914
915   //destroy it
916   xbt_free (((newEvent_t)(event->data))->value);
917   xbt_free (event->data);
918   xbt_free (event);
919   event = NULL;
920 }
921 //
922 //void pajeNewEvent(double time, const char *entityType,
923 //                  const char *container, const char *value)
924 //{
925 //  INSTR_PAJE_ASSERT(entityType);
926 //  INSTR_PAJE_ASSERT(container);
927 //  INSTR_PAJE_ASSERT(value);
928 //
929 //  if (time == 0){
930 //    fprintf(tracing_file, "%d 0 %s %s %s\n", pajeNewEventId,
931 //          entityType, container, value);
932 //  }else{
933 //    fprintf(tracing_file, "%d %lf %s %s %s\n", pajeNewEventId, time,
934 //          entityType, container, value);
935 //  }
936 //}
937
938 #endif /* HAVE_TRACING */