Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[trace] new function: PJ_value_get_or_new().
[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 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(instr_paje_trace, instr, "Paje tracing event system");
12
13 typedef enum {
14   PAJE_DefineContainerType,
15   PAJE_DefineVariableType,
16   PAJE_DefineStateType,
17   PAJE_DefineEventType,
18   PAJE_DefineLinkType,
19   PAJE_DefineEntityValue,
20   PAJE_CreateContainer,
21   PAJE_DestroyContainer,
22   PAJE_SetVariable,
23   PAJE_AddVariable,
24   PAJE_SubVariable,
25   PAJE_SetState,
26   PAJE_PushState,
27   PAJE_PopState,
28   PAJE_ResetState,
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 (*free) (paje_event_t event);
40   void *data;
41 } s_paje_event_t;
42
43 typedef struct s_defineContainerType *defineContainerType_t;
44 typedef struct s_defineContainerType {
45   type_t type;
46 }s_defineContainerType_t;
47
48 typedef struct s_defineVariableType *defineVariableType_t;
49 typedef struct s_defineVariableType {
50   type_t type;
51 }s_defineVariableType_t;
52
53 typedef struct s_defineStateType *defineStateType_t;
54 typedef struct s_defineStateType {
55   type_t type;
56 }s_defineStateType_t;
57
58 typedef struct s_defineEventType *defineEventType_t;
59 typedef struct s_defineEventType {
60   type_t type;
61 }s_defineEventType_t;
62
63 typedef struct s_defineLinkType *defineLinkType_t;
64 typedef struct s_defineLinkType {
65   type_t type;
66   type_t source;
67   type_t dest;
68 }s_defineLinkType_t;
69
70 typedef struct s_defineEntityValue *defineEntityValue_t;
71 typedef struct s_defineEntityValue {
72   val_t value;
73 }s_defineEntityValue_t;
74
75 typedef struct s_createContainer *createContainer_t;
76 typedef struct s_createContainer {
77   container_t container;
78 }s_createContainer_t;
79
80 typedef struct s_destroyContainer *destroyContainer_t;
81 typedef struct s_destroyContainer {
82   container_t container;
83 }s_destroyContainer_t;
84
85 typedef struct s_setVariable *setVariable_t;
86 typedef struct s_setVariable {
87   container_t container;
88   type_t type;
89   double value;
90 }s_setVariable_t;
91
92 typedef struct s_addVariable *addVariable_t;
93 typedef struct s_addVariable {
94   container_t container;
95   type_t type;
96   double value;
97 }s_addVariable_t;
98
99 typedef struct s_subVariable *subVariable_t;
100 typedef struct s_subVariable {
101   container_t container;
102   type_t type;
103   double value;
104 }s_subVariable_t;
105
106 typedef struct s_setState *setState_t;
107 typedef struct s_setState {
108   container_t container;
109   type_t type;
110   val_t value;
111 }s_setState_t;
112
113 typedef struct s_pushState *pushState_t;
114 typedef struct s_pushState {
115   container_t container;
116   type_t type;
117   val_t value;
118 }s_pushState_t;
119
120 typedef struct s_popState *popState_t;
121 typedef struct s_popState {
122   container_t container;
123   type_t type;
124 }s_popState_t;
125
126 typedef struct s_resetState *resetState_t;
127 typedef struct s_resetState {
128   container_t container;
129   type_t type;
130 }s_resetState_t;
131
132 typedef struct s_startLink *startLink_t;
133 typedef struct s_startLink {
134   container_t container;
135   type_t type;
136   container_t sourceContainer;
137   char *value;
138   char *key;
139 }s_startLink_t;
140
141 typedef struct s_endLink *endLink_t;
142 typedef struct s_endLink {
143   container_t container;
144   type_t type;
145   container_t destContainer;
146   char *value;
147   char *key;
148 }s_endLink_t;
149
150 typedef struct s_newEvent *newEvent_t;
151 typedef struct s_newEvent {
152   container_t container;
153   type_t type;
154   val_t value;
155 }s_newEvent_t;
156
157 static FILE *tracing_file = NULL;
158
159 static xbt_dynar_t buffer = NULL;
160
161 void TRACE_paje_start(void)
162 {
163   char *filename = TRACE_get_filename();
164   tracing_file = fopen(filename, "w");
165   if (tracing_file == NULL){
166     THROWF (system_error, 1, "Tracefile %s could not be opened for writing.", filename);
167   }
168
169   XBT_DEBUG("Filename %s is open for writing", filename);
170
171   /* output header */
172   TRACE_paje_create_header();
173
174   buffer = xbt_dynar_new (sizeof(paje_event_t), NULL);
175 }
176
177 void TRACE_paje_end(void)
178 {
179   fclose(tracing_file);
180   char *filename = TRACE_get_filename();
181   xbt_dynar_free (&buffer);
182   XBT_DEBUG("Filename %s is closed", filename);
183 }
184
185 double TRACE_last_timestamp_to_dump = 0;
186 //dumps the trace file until the timestamp TRACE_last_timestamp_to_dump
187 void TRACE_paje_dump_buffer (int force)
188 {
189   if (!TRACE_is_enabled()) return;
190   XBT_DEBUG("%s: dump until %f. starts", __FUNCTION__, TRACE_last_timestamp_to_dump);
191   if (force){
192     paje_event_t event;
193     unsigned int i;
194     xbt_dynar_foreach(buffer, i, event){
195       event->print (event);
196       event->free (event);
197     }
198     xbt_dynar_free (&buffer);
199     buffer = xbt_dynar_new (sizeof(paje_event_t), NULL);
200   }else{
201     paje_event_t event;
202     while (!xbt_dynar_is_empty(buffer)){
203       double head_timestamp = (*(paje_event_t*)xbt_dynar_get_ptr(buffer, 0))->timestamp;
204       if (head_timestamp > TRACE_last_timestamp_to_dump){
205         break;
206       }
207       xbt_dynar_remove_at (buffer, 0, &event);
208       event->print (event);
209       event->free (event);
210     }
211   }
212   XBT_DEBUG("%s: ends", __FUNCTION__);
213 }
214
215 void TRACE_paje_create_header(void)
216 {
217   XBT_DEBUG ("Define paje header");
218   fprintf(tracing_file, "\
219 %%EventDef PajeDefineContainerType %d \n\
220 %%       Alias string \n\
221 %%       Type string \n\
222 %%       Name string \n\
223 %%EndEventDef \n\
224 %%EventDef PajeDefineVariableType %d \n\
225 %%       Alias string \n\
226 %%       Type string \n\
227 %%       Name string \n\
228 %%       Color color \n\
229 %%EndEventDef \n\
230 %%EventDef PajeDefineStateType %d \n\
231 %%       Alias string \n\
232 %%       Type string \n\
233 %%       Name string \n\
234 %%EndEventDef \n\
235 %%EventDef PajeDefineEventType %d \n\
236 %%       Alias string \n\
237 %%       Type string \n\
238 %%       Name string \n\
239 %%       Color color \n\
240 %%EndEventDef \n\
241 %%EventDef PajeDefineLinkType %d \n\
242 %%       Alias string \n\
243 %%       Type string \n\
244 %%       StartContainerType string \n\
245 %%       EndContainerType string \n\
246 %%       Name string \n\
247 %%EndEventDef \n\
248 %%EventDef PajeDefineEntityValue %d \n\
249 %%       Alias string \n\
250 %%       Type string \n\
251 %%       Name string \n\
252 %%       Color color \n\
253 %%EndEventDef \n\
254 %%EventDef PajeCreateContainer %d \n\
255 %%       Time date \n\
256 %%       Alias string \n\
257 %%       Type string \n\
258 %%       Container string \n\
259 %%       Name string \n\
260 %%EndEventDef \n\
261 %%EventDef PajeDestroyContainer %d \n\
262 %%       Time date \n\
263 %%       Type string \n\
264 %%       Name string \n\
265 %%EndEventDef \n\
266 %%EventDef PajeSetVariable %d \n\
267 %%       Time date \n\
268 %%       Type string \n\
269 %%       Container string \n\
270 %%       Value double \n\
271 %%EndEventDef\n\
272 %%EventDef PajeAddVariable %d \n\
273 %%       Time date \n\
274 %%       Type string \n\
275 %%       Container string \n\
276 %%       Value double \n\
277 %%EndEventDef\n\
278 %%EventDef PajeSubVariable %d \n\
279 %%       Time date \n\
280 %%       Type string \n\
281 %%       Container string \n\
282 %%       Value double \n\
283 %%EndEventDef\n\
284 %%EventDef PajeSetState %d \n\
285 %%       Time date \n\
286 %%       Type string \n\
287 %%       Container string \n\
288 %%       Value string \n\
289 %%EndEventDef\n\
290 %%EventDef PajePushState %d \n\
291 %%       Time date \n\
292 %%       Type string \n\
293 %%       Container string \n\
294 %%       Value string \n\
295 %%EndEventDef\n\
296 %%EventDef PajePopState %d \n\
297 %%       Time date \n\
298 %%       Type string \n\
299 %%       Container string \n\
300 %%EndEventDef\n\
301 %%EventDef PajeResetState %d \n\
302 %%       Time date \n\
303 %%       Type string \n\
304 %%       Container string \n\
305 %%EndEventDef\n\
306 %%EventDef PajeStartLink %d \n\
307 %%       Time date \n\
308 %%       Type string \n\
309 %%       Container string \n\
310 %%       Value string \n\
311 %%       StartContainer string \n\
312 %%       Key string \n\
313 %%EndEventDef\n\
314 %%EventDef PajeEndLink %d \n\
315 %%       Time date \n\
316 %%       Type string \n\
317 %%       Container string \n\
318 %%       Value string \n\
319 %%       EndContainer string \n\
320 %%       Key string \n\
321 %%EndEventDef\n\
322 %%EventDef PajeNewEvent %d \n\
323 %%       Time date \n\
324 %%       Type string \n\
325 %%       Container string \n\
326 %%       Value string \n\
327 %%EndEventDef\n",
328   PAJE_DefineContainerType,
329   PAJE_DefineVariableType,
330   PAJE_DefineStateType,
331   PAJE_DefineEventType,
332   PAJE_DefineLinkType,
333   PAJE_DefineEntityValue,
334   PAJE_CreateContainer,
335   PAJE_DestroyContainer,
336   PAJE_SetVariable,
337   PAJE_AddVariable,
338   PAJE_SubVariable,
339   PAJE_SetState,
340   PAJE_PushState,
341   PAJE_PopState,
342   PAJE_ResetState,
343   PAJE_StartLink,
344   PAJE_EndLink,
345   PAJE_NewEvent);
346 }
347
348 /* internal do the instrumentation module */
349 static void insert_into_buffer (paje_event_t tbi)
350 {
351   if (TRACE_buffer() == 0){
352     tbi->print (tbi);
353     tbi->free (tbi);
354     return;
355   }
356   XBT_DEBUG("%s: insert event_type=%d, timestamp=%f, buffersize=%lu)",
357             __FUNCTION__, (int)tbi->event_type, tbi->timestamp, xbt_dynar_length(buffer));
358
359   unsigned int i;
360   for (i = xbt_dynar_length(buffer); i > 0; i--) {
361     paje_event_t e1 = *(paje_event_t*)xbt_dynar_get_ptr(buffer, i - 1);
362     if (e1->timestamp <= tbi->timestamp)
363       break;
364   }
365   xbt_dynar_insert_at(buffer, i, &tbi);
366   if (i == 0)
367     XBT_DEBUG("%s: inserted at beginning", __FUNCTION__);
368   else
369     XBT_DEBUG("%s: inserted at%s %u", __FUNCTION__,
370               (i == xbt_dynar_length(buffer) - 1 ? " end, pos =" : ""), i);
371 }
372
373 static void print_pajeDefineContainerType(paje_event_t event)
374 {
375   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
376   fprintf(tracing_file, "%d %s %s %s\n",
377       (int)event->event_type,
378       ((defineContainerType_t)event->data)->type->id,
379       ((defineContainerType_t)event->data)->type->father->id,
380       ((defineContainerType_t)event->data)->type->name);
381 }
382
383 static void print_pajeDefineVariableType(paje_event_t event)
384 {
385   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
386   fprintf(tracing_file, "%d %s %s %s \"%s\"\n",
387       (int)event->event_type,
388       ((defineVariableType_t)event->data)->type->id,
389       ((defineVariableType_t)event->data)->type->father->id,
390       ((defineVariableType_t)event->data)->type->name,
391       ((defineVariableType_t)event->data)->type->color);
392 }
393
394 static void print_pajeDefineStateType(paje_event_t event)
395 {
396   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
397   fprintf(tracing_file, "%d %s %s %s\n",
398       (int)event->event_type,
399       ((defineStateType_t)event->data)->type->id,
400       ((defineStateType_t)event->data)->type->father->id,
401       ((defineStateType_t)event->data)->type->name);
402 }
403
404 static void print_pajeDefineEventType(paje_event_t event)
405 {
406   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
407   fprintf(tracing_file, "%d %s %s %s \"%s\"\n",
408       (int)event->event_type,
409       ((defineEventType_t)event->data)->type->id,
410       ((defineEventType_t)event->data)->type->father->id,
411       ((defineEventType_t)event->data)->type->name,
412       ((defineEventType_t)event->data)->type->color);
413 }
414
415 static void print_pajeDefineLinkType(paje_event_t event)
416 {
417   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
418   fprintf(tracing_file, "%d %s %s %s %s %s\n",
419       (int)event->event_type,
420       ((defineLinkType_t)event->data)->type->id,
421       ((defineLinkType_t)event->data)->type->father->id,
422       ((defineLinkType_t)event->data)->source->id,
423       ((defineLinkType_t)event->data)->dest->id,
424       ((defineLinkType_t)event->data)->type->name);
425 }
426
427 static void print_pajeDefineEntityValue (paje_event_t event)
428 {
429   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
430   fprintf(tracing_file, "%d %s %s %s \"%s\"\n",
431       (int)event->event_type,
432       ((defineEntityValue_t)event->data)->value->id,
433       ((defineEntityValue_t)event->data)->value->father->id,
434       ((defineEntityValue_t)event->data)->value->name,
435       ((defineEntityValue_t)event->data)->value->color);
436 }
437
438 static void print_pajeCreateContainer(paje_event_t event)
439 {
440   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
441   if (event->timestamp == 0){
442     fprintf(tracing_file, "%d 0 %s %s %s \"%s\"\n",
443         (int)event->event_type,
444         ((createContainer_t)event->data)->container->id,
445         ((createContainer_t)event->data)->container->type->id,
446         ((createContainer_t)event->data)->container->father->id,
447         ((createContainer_t)event->data)->container->name);
448   }else{
449     fprintf(tracing_file, "%d %lf %s %s %s \"%s\"\n",
450         (int)event->event_type,
451         event->timestamp,
452         ((createContainer_t)event->data)->container->id,
453         ((createContainer_t)event->data)->container->type->id,
454         ((createContainer_t)event->data)->container->father->id,
455         ((createContainer_t)event->data)->container->name);
456   }
457 }
458
459 static void print_pajeDestroyContainer(paje_event_t event)
460 {
461   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
462   if (event->timestamp == 0){
463     fprintf(tracing_file, "%d 0 %s %s\n",
464         (int)event->event_type,
465         ((destroyContainer_t)event->data)->container->type->id,
466         ((destroyContainer_t)event->data)->container->id);
467   }else{
468     fprintf(tracing_file, "%d %lf %s %s\n",
469         (int)event->event_type,
470         event->timestamp,
471         ((destroyContainer_t)event->data)->container->type->id,
472         ((destroyContainer_t)event->data)->container->id);
473   }
474 }
475
476 static void print_pajeSetVariable(paje_event_t event)
477 {
478   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
479   if (event->timestamp == 0){
480     fprintf(tracing_file, "%d 0 %s %s %f\n",
481         (int)event->event_type,
482         ((setVariable_t)event->data)->type->id,
483         ((setVariable_t)event->data)->container->id,
484         ((setVariable_t)event->data)->value);
485   }else{
486     fprintf(tracing_file, "%d %lf %s %s %f\n",
487         (int)event->event_type,
488         event->timestamp,
489         ((setVariable_t)event->data)->type->id,
490         ((setVariable_t)event->data)->container->id,
491         ((setVariable_t)event->data)->value);
492   }
493 }
494
495 static void print_pajeAddVariable(paje_event_t event)
496 {
497   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
498   if (event->timestamp == 0){
499     fprintf(tracing_file, "%d 0 %s %s %f\n",
500         (int)event->event_type,
501         ((addVariable_t)event->data)->type->id,
502         ((addVariable_t)event->data)->container->id,
503         ((addVariable_t)event->data)->value);
504   }else{
505     fprintf(tracing_file, "%d %lf %s %s %f\n",
506         (int)event->event_type,
507         event->timestamp,
508         ((addVariable_t)event->data)->type->id,
509         ((addVariable_t)event->data)->container->id,
510         ((addVariable_t)event->data)->value);
511   }
512 }
513
514 static void print_pajeSubVariable(paje_event_t event)
515 {
516   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
517   if (event->timestamp == 0){
518     fprintf(tracing_file, "%d 0 %s %s %f\n",
519         (int)event->event_type,
520         ((subVariable_t)event->data)->type->id,
521         ((subVariable_t)event->data)->container->id,
522         ((subVariable_t)event->data)->value);
523   }else{
524     fprintf(tracing_file, "%d %lf %s %s %f\n",
525         (int)event->event_type,
526         event->timestamp,
527         ((subVariable_t)event->data)->type->id,
528         ((subVariable_t)event->data)->container->id,
529         ((subVariable_t)event->data)->value);
530   }
531 }
532
533 static void print_pajeSetState(paje_event_t event)
534 {
535   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
536   if (event->timestamp == 0){
537     fprintf(tracing_file, "%d 0 %s %s %s\n",
538         (int)event->event_type,
539         ((setState_t)event->data)->type->id,
540         ((setState_t)event->data)->container->id,
541         ((setState_t)event->data)->value->id);
542   }else{
543     fprintf(tracing_file, "%d %lf %s %s %s\n",
544         (int)event->event_type,
545         event->timestamp,
546         ((setState_t)event->data)->type->id,
547         ((setState_t)event->data)->container->id,
548         ((setState_t)event->data)->value->id);
549   }
550 }
551
552 static void print_pajePushState(paje_event_t event)
553 {
554   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
555   if (event->timestamp == 0){
556     fprintf(tracing_file, "%d 0 %s %s %s\n",
557         (int)event->event_type,
558         ((pushState_t)event->data)->type->id,
559         ((pushState_t)event->data)->container->id,
560         ((pushState_t)event->data)->value->id);
561   }else{
562     fprintf(tracing_file, "%d %lf %s %s %s\n",
563         (int)event->event_type,
564         event->timestamp,
565         ((pushState_t)event->data)->type->id,
566         ((pushState_t)event->data)->container->id,
567         ((pushState_t)event->data)->value->id);
568   }
569 }
570
571 static void print_pajePopState(paje_event_t event)
572 {
573   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
574   if (event->timestamp == 0){
575     fprintf(tracing_file, "%d 0 %s %s\n",
576         (int)event->event_type,
577         ((popState_t)event->data)->type->id,
578         ((popState_t)event->data)->container->id);
579   }else{
580     fprintf(tracing_file, "%d %lf %s %s\n",
581         (int)event->event_type,
582         event->timestamp,
583         ((popState_t)event->data)->type->id,
584         ((popState_t)event->data)->container->id);
585   }
586 }
587
588 static void print_pajeResetState(paje_event_t event)
589 {
590   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
591   if (event->timestamp == 0){
592     fprintf(tracing_file, "%d 0 %s %s\n",
593         (int)event->event_type,
594         ((resetState_t)event->data)->type->id,
595         ((resetState_t)event->data)->container->id);
596   }else{
597     fprintf(tracing_file, "%d %lf %s %s\n",
598         (int)event->event_type,
599         event->timestamp,
600         ((resetState_t)event->data)->type->id,
601         ((resetState_t)event->data)->container->id);
602   }
603 }
604
605 static void print_pajeStartLink(paje_event_t event)
606 {
607   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
608   if (event->timestamp == 0){
609     fprintf(tracing_file, "%d 0 %s %s %s %s %s\n",
610         (int)event->event_type,
611         ((startLink_t)event->data)->type->id,
612         ((startLink_t)event->data)->container->id,
613         ((startLink_t)event->data)->value,
614         ((startLink_t)event->data)->sourceContainer->id,
615         ((startLink_t)event->data)->key);
616   }else {
617     fprintf(tracing_file, "%d %lf %s %s %s %s %s\n",
618         (int)event->event_type,
619         event->timestamp,
620         ((startLink_t)event->data)->type->id,
621         ((startLink_t)event->data)->container->id,
622         ((startLink_t)event->data)->value,
623         ((startLink_t)event->data)->sourceContainer->id,
624         ((startLink_t)event->data)->key);
625   }
626 }
627
628 static void print_pajeEndLink(paje_event_t event)
629 {
630   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
631   if (event->timestamp == 0){
632     fprintf(tracing_file, "%d 0 %s %s %s %s %s\n",
633         (int)event->event_type,
634         ((endLink_t)event->data)->type->id,
635         ((endLink_t)event->data)->container->id,
636         ((endLink_t)event->data)->value,
637         ((endLink_t)event->data)->destContainer->id,
638         ((endLink_t)event->data)->key);
639   }else {
640     fprintf(tracing_file, "%d %lf %s %s %s %s %s\n",
641         (int)event->event_type,
642         event->timestamp,
643         ((endLink_t)event->data)->type->id,
644         ((endLink_t)event->data)->container->id,
645         ((endLink_t)event->data)->value,
646         ((endLink_t)event->data)->destContainer->id,
647         ((endLink_t)event->data)->key);
648   }
649 }
650
651 static void print_pajeNewEvent (paje_event_t event)
652 {
653   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
654   if (event->timestamp == 0){
655     fprintf(tracing_file, "%d 0 %s %s %s\n",
656         (int)event->event_type,
657         ((newEvent_t)event->data)->type->id,
658         ((newEvent_t)event->data)->container->id,
659         ((newEvent_t)event->data)->value->id);
660   }else{
661     fprintf(tracing_file, "%d %lf %s %s %s\n",
662         (int)event->event_type,
663         event->timestamp,
664         ((newEvent_t)event->data)->type->id,
665         ((newEvent_t)event->data)->container->id,
666         ((newEvent_t)event->data)->value->id);
667   }
668 }
669
670 static void free_paje_event (paje_event_t event)
671 {
672   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
673   switch (event->event_type){
674   case PAJE_StartLink:
675     xbt_free (((startLink_t)(event->data))->value);
676     xbt_free (((startLink_t)(event->data))->key);
677     break;
678   case PAJE_EndLink:
679     xbt_free (((endLink_t)(event->data))->value);
680     xbt_free (((endLink_t)(event->data))->key);
681     break;
682   default:
683     break;
684   }
685   xbt_free (event->data);
686   xbt_free (event);
687 }
688
689 void new_pajeDefineContainerType(type_t type)
690 {
691   paje_event_t event = xbt_new0(s_paje_event_t, 1);
692   event->event_type = PAJE_DefineContainerType;
693   event->timestamp = 0;
694   event->print = print_pajeDefineContainerType;
695   event->free = free_paje_event;
696   event->data = xbt_new0(s_defineContainerType_t, 1);
697   ((defineContainerType_t)(event->data))->type = type;
698
699   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
700
701   //print it
702   event->print (event);
703   event->free (event);
704 }
705
706 void new_pajeDefineVariableType(type_t type)
707 {
708   paje_event_t event = xbt_new0(s_paje_event_t, 1);
709   event->event_type = PAJE_DefineVariableType;
710   event->timestamp = 0;
711   event->print = print_pajeDefineVariableType;
712   event->free = free_paje_event;
713   event->data = xbt_new0(s_defineVariableType_t, 1);
714   ((defineVariableType_t)(event->data))->type = type;
715
716   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
717
718   //print it
719   event->print (event);
720   event->free (event);
721 }
722
723 void new_pajeDefineStateType(type_t type)
724 {
725   paje_event_t event = xbt_new0(s_paje_event_t, 1);
726   event->event_type = PAJE_DefineStateType;
727   event->timestamp = 0;
728   event->print = print_pajeDefineStateType;
729   event->free = free_paje_event;
730   event->data = xbt_new0(s_defineStateType_t, 1);
731   ((defineStateType_t)(event->data))->type = type;
732
733   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
734
735   //print it
736   event->print (event);
737   event->free (event);
738 }
739
740 void new_pajeDefineEventType(type_t type)
741 {
742   paje_event_t event = xbt_new0(s_paje_event_t, 1);
743   event->event_type = PAJE_DefineEventType;
744   event->timestamp = 0;
745   event->print = print_pajeDefineEventType;
746   event->free = free_paje_event;
747   event->data = xbt_new0(s_defineEventType_t, 1);
748   ((defineEventType_t)(event->data))->type = type;
749
750   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
751
752   //print it
753   event->print (event);
754   event->free (event);
755 }
756
757 void new_pajeDefineLinkType(type_t type, type_t source, type_t dest)
758 {
759   paje_event_t event = xbt_new0(s_paje_event_t, 1);
760   event->event_type = PAJE_DefineLinkType;
761   event->timestamp = 0;
762   event->print = print_pajeDefineLinkType;
763   event->free = free_paje_event;
764   event->data = xbt_new0(s_defineLinkType_t, 1);
765   ((defineLinkType_t)(event->data))->type = type;
766   ((defineLinkType_t)(event->data))->source = source;
767   ((defineLinkType_t)(event->data))->dest = dest;
768
769   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
770
771   //print it
772   event->print (event);
773   event->free (event);
774 }
775
776 void new_pajeDefineEntityValue (val_t value)
777 {
778   paje_event_t event = xbt_new0(s_paje_event_t, 1);
779   event->event_type = PAJE_DefineEntityValue;
780   event->timestamp = 0;
781   event->print = print_pajeDefineEntityValue;
782   event->free = free_paje_event;
783   event->data = xbt_new0(s_defineEntityValue_t, 1);
784   ((defineEntityValue_t)(event->data))->value = value;
785
786   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
787
788   //print it
789   event->print (event);
790   event->free (event);
791 }
792
793 void new_pajeCreateContainer (container_t container)
794 {
795   paje_event_t event = xbt_new0(s_paje_event_t, 1);
796   event->event_type = PAJE_CreateContainer;
797   event->timestamp = SIMIX_get_clock();
798   event->print = print_pajeCreateContainer;
799   event->free = free_paje_event;
800   event->data = xbt_new0(s_createContainer_t, 1);
801   ((createContainer_t)(event->data))->container = container;
802
803   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
804
805   //print it
806   event->print (event);
807   event->free (event);
808 }
809
810 void new_pajeDestroyContainer (container_t container)
811 {
812   paje_event_t event = xbt_new0(s_paje_event_t, 1);
813   event->event_type = PAJE_DestroyContainer;
814   event->timestamp = SIMIX_get_clock();
815   event->print = print_pajeDestroyContainer;
816   event->free = free_paje_event;
817   event->data = xbt_new0(s_destroyContainer_t, 1);
818   ((destroyContainer_t)(event->data))->container = container;
819
820   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
821
822   //print it
823   event->print (event);
824   event->free (event);
825 }
826
827 void new_pajeSetVariable (double timestamp, container_t container, type_t type, double value)
828 {
829   paje_event_t event = xbt_new0(s_paje_event_t, 1);
830   event->event_type = PAJE_SetVariable;
831   event->timestamp = timestamp;
832   event->print = print_pajeSetVariable;
833   event->free = free_paje_event;
834   event->data = xbt_new0(s_setVariable_t, 1);
835   ((setVariable_t)(event->data))->type = type;
836   ((setVariable_t)(event->data))->container = container;
837   ((setVariable_t)(event->data))->value = value;
838
839   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
840
841   insert_into_buffer (event);
842 }
843
844
845 void new_pajeAddVariable (double timestamp, container_t container, type_t type, double value)
846 {
847   paje_event_t event = xbt_new0(s_paje_event_t, 1);
848   event->event_type = PAJE_AddVariable;
849   event->timestamp = timestamp;
850   event->print = print_pajeAddVariable;
851   event->free = free_paje_event;
852   event->data = xbt_new0(s_addVariable_t, 1);
853   ((addVariable_t)(event->data))->type = type;
854   ((addVariable_t)(event->data))->container = container;
855   ((addVariable_t)(event->data))->value = value;
856
857   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
858
859   insert_into_buffer (event);
860 }
861
862 void new_pajeSubVariable (double timestamp, container_t container, type_t type, double value)
863 {
864   paje_event_t event = xbt_new0(s_paje_event_t, 1);
865   event->event_type = PAJE_SubVariable;
866   event->timestamp = timestamp;
867   event->print = print_pajeSubVariable;
868   event->free = free_paje_event;
869   event->data = xbt_new0(s_subVariable_t, 1);
870   ((subVariable_t)(event->data))->type = type;
871   ((subVariable_t)(event->data))->container = container;
872   ((subVariable_t)(event->data))->value = value;
873
874   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
875
876   insert_into_buffer (event);
877 }
878
879 void new_pajeSetState (double timestamp, container_t container, type_t type, val_t value)
880 {
881   paje_event_t event = xbt_new0(s_paje_event_t, 1);
882   event->event_type = PAJE_SetState;
883   event->timestamp = timestamp;
884   event->print = print_pajeSetState;
885   event->free = free_paje_event;
886   event->data = xbt_new0(s_setState_t, 1);
887   ((setState_t)(event->data))->type = type;
888   ((setState_t)(event->data))->container = container;
889   ((setState_t)(event->data))->value = value;
890
891   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
892
893   insert_into_buffer (event);
894 }
895
896
897 void new_pajePushState (double timestamp, container_t container, type_t type, val_t value)
898 {
899   paje_event_t event = xbt_new0(s_paje_event_t, 1);
900   event->event_type = PAJE_PushState;
901   event->timestamp = timestamp;
902   event->print = print_pajePushState;
903   event->free = free_paje_event;
904   event->data = xbt_new0(s_pushState_t, 1);
905   ((pushState_t)(event->data))->type = type;
906   ((pushState_t)(event->data))->container = container;
907   ((pushState_t)(event->data))->value = value;
908
909   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
910
911   insert_into_buffer (event);
912 }
913
914
915 void new_pajePopState (double timestamp, container_t container, type_t type)
916 {
917   paje_event_t event = xbt_new0(s_paje_event_t, 1);
918   event->event_type = PAJE_PopState;
919   event->timestamp = timestamp;
920   event->print = print_pajePopState;
921   event->free = free_paje_event;
922   event->data = xbt_new0(s_popState_t, 1);
923   ((popState_t)(event->data))->type = type;
924   ((popState_t)(event->data))->container = container;
925
926   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
927
928   insert_into_buffer (event);
929 }
930
931
932 void new_pajeResetState (double timestamp, container_t container, type_t type)
933 {
934   paje_event_t event = xbt_new0(s_paje_event_t, 1);
935   event->event_type = PAJE_ResetState;
936   event->timestamp = timestamp;
937   event->print = print_pajeResetState;
938   event->free = free_paje_event;
939   event->data = xbt_new0(s_resetState_t, 1);
940   ((resetState_t)(event->data))->type = type;
941   ((resetState_t)(event->data))->container = container;
942
943   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
944
945   insert_into_buffer (event);
946 }
947
948 void new_pajeStartLink (double timestamp, container_t container, type_t type, container_t sourceContainer, const char *value, const char *key)
949 {
950   paje_event_t event = xbt_new0(s_paje_event_t, 1);
951   event->event_type = PAJE_StartLink;
952   event->timestamp = timestamp;
953   event->print = print_pajeStartLink;
954   event->free = free_paje_event;
955   event->data = xbt_new0(s_startLink_t, 1);
956   ((startLink_t)(event->data))->type = type;
957   ((startLink_t)(event->data))->container = container;
958   ((startLink_t)(event->data))->sourceContainer = sourceContainer;
959   ((startLink_t)(event->data))->value = xbt_strdup(value);
960   ((startLink_t)(event->data))->key = xbt_strdup(key);
961
962   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
963
964   insert_into_buffer (event);
965 }
966
967 void new_pajeEndLink (double timestamp, container_t container, type_t type, container_t destContainer, const char *value, const char *key)
968 {
969   paje_event_t event = xbt_new0(s_paje_event_t, 1);
970   event->event_type = PAJE_EndLink;
971   event->timestamp = timestamp;
972   event->print = print_pajeEndLink;
973   event->free = free_paje_event;
974   event->data = xbt_new0(s_endLink_t, 1);
975   ((endLink_t)(event->data))->type = type;
976   ((endLink_t)(event->data))->container = container;
977   ((endLink_t)(event->data))->destContainer = destContainer;
978   ((endLink_t)(event->data))->value = xbt_strdup(value);
979   ((endLink_t)(event->data))->key = xbt_strdup(key);
980
981   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
982
983   insert_into_buffer (event);
984 }
985
986 void new_pajeNewEvent (double timestamp, container_t container, type_t type, val_t value)
987 {
988   paje_event_t event = xbt_new0(s_paje_event_t, 1);
989   event->event_type = PAJE_NewEvent;
990   event->timestamp = timestamp;
991   event->print = print_pajeNewEvent;
992   event->free = free_paje_event;
993   event->data = xbt_new0(s_newEvent_t, 1);
994   ((newEvent_t)(event->data))->type = type;
995   ((newEvent_t)(event->data))->container = container;
996   ((newEvent_t)(event->data))->value = value;
997
998   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
999
1000   insert_into_buffer (event);
1001 }
1002
1003 #endif /* HAVE_TRACING */