Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
0e0af37434fd09372bc4b12428f2917c075d6350
[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 %%EndEventDef \n\
240 %%EventDef PajeDefineLinkType %d \n\
241 %%       Alias string \n\
242 %%       Type string \n\
243 %%       StartContainerType string \n\
244 %%       EndContainerType string \n\
245 %%       Name string \n\
246 %%EndEventDef \n\
247 %%EventDef PajeDefineEntityValue %d \n\
248 %%       Alias string \n\
249 %%       Type string \n\
250 %%       Name string \n\
251 %%       Color color \n\
252 %%EndEventDef \n\
253 %%EventDef PajeCreateContainer %d \n\
254 %%       Time date \n\
255 %%       Alias string \n\
256 %%       Type string \n\
257 %%       Container string \n\
258 %%       Name string \n\
259 %%EndEventDef \n\
260 %%EventDef PajeDestroyContainer %d \n\
261 %%       Time date \n\
262 %%       Type string \n\
263 %%       Name string \n\
264 %%EndEventDef \n\
265 %%EventDef PajeSetVariable %d \n\
266 %%       Time date \n\
267 %%       Type string \n\
268 %%       Container string \n\
269 %%       Value double \n\
270 %%EndEventDef\n\
271 %%EventDef PajeAddVariable %d \n\
272 %%       Time date \n\
273 %%       Type string \n\
274 %%       Container string \n\
275 %%       Value double \n\
276 %%EndEventDef\n\
277 %%EventDef PajeSubVariable %d \n\
278 %%       Time date \n\
279 %%       Type string \n\
280 %%       Container string \n\
281 %%       Value double \n\
282 %%EndEventDef\n\
283 %%EventDef PajeSetState %d \n\
284 %%       Time date \n\
285 %%       Type string \n\
286 %%       Container string \n\
287 %%       Value string \n\
288 %%EndEventDef\n\
289 %%EventDef PajePushState %d \n\
290 %%       Time date \n\
291 %%       Type string \n\
292 %%       Container string \n\
293 %%       Value string \n\
294 %%EndEventDef\n\
295 %%EventDef PajePopState %d \n\
296 %%       Time date \n\
297 %%       Type string \n\
298 %%       Container string \n\
299 %%EndEventDef\n\
300 %%EventDef PajeResetState %d \n\
301 %%       Time date \n\
302 %%       Type string \n\
303 %%       Container string \n\
304 %%EndEventDef\n\
305 %%EventDef PajeStartLink %d \n\
306 %%       Time date \n\
307 %%       Type string \n\
308 %%       Container string \n\
309 %%       Value string \n\
310 %%       StartContainer string \n\
311 %%       Key string \n\
312 %%EndEventDef\n\
313 %%EventDef PajeEndLink %d \n\
314 %%       Time date \n\
315 %%       Type string \n\
316 %%       Container string \n\
317 %%       Value string \n\
318 %%       EndContainer string \n\
319 %%       Key string \n\
320 %%EndEventDef\n\
321 %%EventDef PajeNewEvent %d \n\
322 %%       Time date \n\
323 %%       Type string \n\
324 %%       Container string \n\
325 %%       Value string \n\
326 %%EndEventDef\n",
327   PAJE_DefineContainerType,
328   PAJE_DefineVariableType,
329   PAJE_DefineStateType,
330   PAJE_DefineEventType,
331   PAJE_DefineLinkType,
332   PAJE_DefineEntityValue,
333   PAJE_CreateContainer,
334   PAJE_DestroyContainer,
335   PAJE_SetVariable,
336   PAJE_AddVariable,
337   PAJE_SubVariable,
338   PAJE_SetState,
339   PAJE_PushState,
340   PAJE_PopState,
341   PAJE_ResetState,
342   PAJE_StartLink,
343   PAJE_EndLink,
344   PAJE_NewEvent);
345 }
346
347 /* internal do the instrumentation module */
348 static void insert_into_buffer (paje_event_t tbi)
349 {
350   if (TRACE_buffer() == 0){
351     tbi->print (tbi);
352     tbi->free (tbi);
353     return;
354   }
355   XBT_DEBUG("%s: insert event_type=%d, timestamp=%f, buffersize=%lu)",
356       __FUNCTION__, (int)tbi->event_type, tbi->timestamp, xbt_dynar_length(buffer));
357
358   unsigned int i;
359   for (i = xbt_dynar_length(buffer); i > 0; i--) {
360     paje_event_t e1 = *(paje_event_t*)xbt_dynar_get_ptr(buffer, i - 1);
361     if (e1->timestamp <= tbi->timestamp)
362       break;
363   }
364   xbt_dynar_insert_at(buffer, i, &tbi);
365   if (i == 0)
366     XBT_DEBUG("%s: inserted at beginning", __FUNCTION__);
367   else
368     XBT_DEBUG("%s: inserted at%s %u", __FUNCTION__,
369               (i == xbt_dynar_length(buffer) - 1 ? " end, pos =" : ""), i);
370 }
371
372 static void print_pajeDefineContainerType(paje_event_t event)
373 {
374   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
375   fprintf(tracing_file, "%d %s %s %s\n",
376       (int)event->event_type,
377       ((defineContainerType_t)event->data)->type->id,
378       ((defineContainerType_t)event->data)->type->father->id,
379       ((defineContainerType_t)event->data)->type->name);
380 }
381
382 static void print_pajeDefineVariableType(paje_event_t event)
383 {
384   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
385   fprintf(tracing_file, "%d %s %s %s \"%s\"\n",
386       (int)event->event_type,
387       ((defineVariableType_t)event->data)->type->id,
388       ((defineVariableType_t)event->data)->type->father->id,
389       ((defineVariableType_t)event->data)->type->name,
390       ((defineVariableType_t)event->data)->type->color);
391 }
392
393 static void print_pajeDefineStateType(paje_event_t event)
394 {
395   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
396   fprintf(tracing_file, "%d %s %s %s\n",
397       (int)event->event_type,
398       ((defineStateType_t)event->data)->type->id,
399       ((defineStateType_t)event->data)->type->father->id,
400       ((defineStateType_t)event->data)->type->name);
401 }
402
403 static void print_pajeDefineEventType(paje_event_t event)
404 {
405   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
406   fprintf(tracing_file, "%d %s %s %s\n",
407       (int)event->event_type,
408       ((defineEventType_t)event->data)->type->id,
409       ((defineEventType_t)event->data)->type->father->id,
410       ((defineEventType_t)event->data)->type->name);
411 }
412
413 static void print_pajeDefineLinkType(paje_event_t event)
414 {
415   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
416   fprintf(tracing_file, "%d %s %s %s %s %s\n",
417       (int)event->event_type,
418       ((defineLinkType_t)event->data)->type->id,
419       ((defineLinkType_t)event->data)->type->father->id,
420       ((defineLinkType_t)event->data)->source->id,
421       ((defineLinkType_t)event->data)->dest->id,
422       ((defineLinkType_t)event->data)->type->name);
423 }
424
425 static void print_pajeDefineEntityValue (paje_event_t event)
426 {
427   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
428   fprintf(tracing_file, "%d %s %s %s \"%s\"\n",
429       (int)event->event_type,
430       ((defineEntityValue_t)event->data)->value->id,
431       ((defineEntityValue_t)event->data)->value->father->id,
432       ((defineEntityValue_t)event->data)->value->name,
433       ((defineEntityValue_t)event->data)->value->color);
434 }
435
436 static void print_pajeCreateContainer(paje_event_t event)
437 {
438   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
439   if (event->timestamp == 0){
440     fprintf(tracing_file, "%d 0 %s %s %s \"%s\"\n",
441         (int)event->event_type,
442         ((createContainer_t)event->data)->container->id,
443         ((createContainer_t)event->data)->container->type->id,
444         ((createContainer_t)event->data)->container->father->id,
445         ((createContainer_t)event->data)->container->name);
446   }else{
447     fprintf(tracing_file, "%d %lf %s %s %s \"%s\"\n",
448         (int)event->event_type,
449         event->timestamp,
450         ((createContainer_t)event->data)->container->id,
451         ((createContainer_t)event->data)->container->type->id,
452         ((createContainer_t)event->data)->container->father->id,
453         ((createContainer_t)event->data)->container->name);
454   }
455 }
456
457 static void print_pajeDestroyContainer(paje_event_t event)
458 {
459   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
460   if (event->timestamp == 0){
461     fprintf(tracing_file, "%d 0 %s %s\n",
462         (int)event->event_type,
463         ((destroyContainer_t)event->data)->container->type->id,
464         ((destroyContainer_t)event->data)->container->id);
465   }else{
466     fprintf(tracing_file, "%d %lf %s %s\n",
467         (int)event->event_type,
468         event->timestamp,
469         ((destroyContainer_t)event->data)->container->type->id,
470         ((destroyContainer_t)event->data)->container->id);
471   }
472 }
473
474 static void print_pajeSetVariable(paje_event_t event)
475 {
476   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
477   if (event->timestamp == 0){
478     fprintf(tracing_file, "%d 0 %s %s %f\n",
479         (int)event->event_type,
480         ((setVariable_t)event->data)->type->id,
481         ((setVariable_t)event->data)->container->id,
482         ((setVariable_t)event->data)->value);
483   }else{
484     fprintf(tracing_file, "%d %lf %s %s %f\n",
485         (int)event->event_type,
486         event->timestamp,
487         ((setVariable_t)event->data)->type->id,
488         ((setVariable_t)event->data)->container->id,
489         ((setVariable_t)event->data)->value);
490   }
491 }
492
493 static void print_pajeAddVariable(paje_event_t event)
494 {
495   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
496   if (event->timestamp == 0){
497     fprintf(tracing_file, "%d 0 %s %s %f\n",
498         (int)event->event_type,
499         ((addVariable_t)event->data)->type->id,
500         ((addVariable_t)event->data)->container->id,
501         ((addVariable_t)event->data)->value);
502   }else{
503     fprintf(tracing_file, "%d %lf %s %s %f\n",
504         (int)event->event_type,
505         event->timestamp,
506         ((addVariable_t)event->data)->type->id,
507         ((addVariable_t)event->data)->container->id,
508         ((addVariable_t)event->data)->value);
509   }
510 }
511
512 static void print_pajeSubVariable(paje_event_t event)
513 {
514   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
515   if (event->timestamp == 0){
516     fprintf(tracing_file, "%d 0 %s %s %f\n",
517         (int)event->event_type,
518         ((subVariable_t)event->data)->type->id,
519         ((subVariable_t)event->data)->container->id,
520         ((subVariable_t)event->data)->value);
521   }else{
522     fprintf(tracing_file, "%d %lf %s %s %f\n",
523         (int)event->event_type,
524         event->timestamp,
525         ((subVariable_t)event->data)->type->id,
526         ((subVariable_t)event->data)->container->id,
527         ((subVariable_t)event->data)->value);
528   }
529 }
530
531 static void print_pajeSetState(paje_event_t event)
532 {
533   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
534   if (event->timestamp == 0){
535     fprintf(tracing_file, "%d 0 %s %s %s\n",
536         (int)event->event_type,
537         ((setState_t)event->data)->type->id,
538         ((setState_t)event->data)->container->id,
539         ((setState_t)event->data)->value->id);
540   }else{
541     fprintf(tracing_file, "%d %lf %s %s %s\n",
542         (int)event->event_type,
543         event->timestamp,
544         ((setState_t)event->data)->type->id,
545         ((setState_t)event->data)->container->id,
546         ((setState_t)event->data)->value->id);
547   }
548 }
549
550 static void print_pajePushState(paje_event_t event)
551 {
552   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
553   if (event->timestamp == 0){
554     fprintf(tracing_file, "%d 0 %s %s %s\n",
555         (int)event->event_type,
556         ((pushState_t)event->data)->type->id,
557         ((pushState_t)event->data)->container->id,
558         ((pushState_t)event->data)->value->id);
559   }else{
560     fprintf(tracing_file, "%d %lf %s %s %s\n",
561         (int)event->event_type,
562         event->timestamp,
563         ((pushState_t)event->data)->type->id,
564         ((pushState_t)event->data)->container->id,
565         ((pushState_t)event->data)->value->id);
566   }
567 }
568
569 static void print_pajePopState(paje_event_t event)
570 {
571   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
572   if (event->timestamp == 0){
573     fprintf(tracing_file, "%d 0 %s %s\n",
574         (int)event->event_type,
575         ((popState_t)event->data)->type->id,
576         ((popState_t)event->data)->container->id);
577   }else{
578     fprintf(tracing_file, "%d %lf %s %s\n",
579         (int)event->event_type,
580         event->timestamp,
581         ((popState_t)event->data)->type->id,
582         ((popState_t)event->data)->container->id);
583   }
584 }
585
586 static void print_pajeResetState(paje_event_t event)
587 {
588   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
589   if (event->timestamp == 0){
590     fprintf(tracing_file, "%d 0 %s %s\n",
591         (int)event->event_type,
592         ((resetState_t)event->data)->type->id,
593         ((resetState_t)event->data)->container->id);
594   }else{
595     fprintf(tracing_file, "%d %lf %s %s\n",
596         (int)event->event_type,
597         event->timestamp,
598         ((resetState_t)event->data)->type->id,
599         ((resetState_t)event->data)->container->id);
600   }
601 }
602
603 static void print_pajeStartLink(paje_event_t event)
604 {
605   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
606   if (event->timestamp == 0){
607     fprintf(tracing_file, "%d 0 %s %s %s %s %s\n",
608         (int)event->event_type,
609         ((startLink_t)event->data)->type->id,
610         ((startLink_t)event->data)->container->id,
611         ((startLink_t)event->data)->value,
612         ((startLink_t)event->data)->sourceContainer->id,
613         ((startLink_t)event->data)->key);
614   }else {
615     fprintf(tracing_file, "%d %lf %s %s %s %s %s\n",
616         (int)event->event_type,
617         event->timestamp,
618         ((startLink_t)event->data)->type->id,
619         ((startLink_t)event->data)->container->id,
620         ((startLink_t)event->data)->value,
621         ((startLink_t)event->data)->sourceContainer->id,
622         ((startLink_t)event->data)->key);
623   }
624 }
625
626 static void print_pajeEndLink(paje_event_t event)
627 {
628   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
629   if (event->timestamp == 0){
630     fprintf(tracing_file, "%d 0 %s %s %s %s %s\n",
631         (int)event->event_type,
632         ((endLink_t)event->data)->type->id,
633         ((endLink_t)event->data)->container->id,
634         ((endLink_t)event->data)->value,
635         ((endLink_t)event->data)->destContainer->id,
636         ((endLink_t)event->data)->key);
637   }else {
638     fprintf(tracing_file, "%d %lf %s %s %s %s %s\n",
639         (int)event->event_type,
640         event->timestamp,
641         ((endLink_t)event->data)->type->id,
642         ((endLink_t)event->data)->container->id,
643         ((endLink_t)event->data)->value,
644         ((endLink_t)event->data)->destContainer->id,
645         ((endLink_t)event->data)->key);
646   }
647 }
648
649 static void print_pajeNewEvent (paje_event_t event)
650 {
651   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
652   if (event->timestamp == 0){
653     fprintf(tracing_file, "%d 0 %s %s %s\n",
654         (int)event->event_type,
655         ((newEvent_t)event->data)->type->id,
656         ((newEvent_t)event->data)->container->id,
657         ((newEvent_t)event->data)->value->id);
658   }else{
659     fprintf(tracing_file, "%d %lf %s %s %s\n",
660         (int)event->event_type,
661         event->timestamp,
662         ((newEvent_t)event->data)->type->id,
663         ((newEvent_t)event->data)->container->id,
664         ((newEvent_t)event->data)->value->id);
665   }
666 }
667
668 static void free_paje_event (paje_event_t event)
669 {
670   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
671   switch (event->event_type){
672   case PAJE_StartLink:
673     xbt_free (((startLink_t)(event->data))->value);
674     xbt_free (((startLink_t)(event->data))->key);
675     break;
676   case PAJE_EndLink:
677     xbt_free (((endLink_t)(event->data))->value);
678     xbt_free (((endLink_t)(event->data))->key);
679     break;
680   default:
681     break;
682   }
683   xbt_free (event->data);
684   xbt_free (event);
685 }
686
687 void new_pajeDefineContainerType(type_t type)
688 {
689   paje_event_t event = xbt_new0(s_paje_event_t, 1);
690   event->event_type = PAJE_DefineContainerType;
691   event->timestamp = 0;
692   event->print = print_pajeDefineContainerType;
693   event->free = free_paje_event;
694   event->data = xbt_new0(s_defineContainerType_t, 1);
695   ((defineContainerType_t)(event->data))->type = type;
696
697   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
698
699   //print it
700   event->print (event);
701   event->free (event);
702 }
703
704 void new_pajeDefineVariableType(type_t type)
705 {
706   paje_event_t event = xbt_new0(s_paje_event_t, 1);
707   event->event_type = PAJE_DefineVariableType;
708   event->timestamp = 0;
709   event->print = print_pajeDefineVariableType;
710   event->free = free_paje_event;
711   event->data = xbt_new0(s_defineVariableType_t, 1);
712   ((defineVariableType_t)(event->data))->type = type;
713
714   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
715
716   //print it
717   event->print (event);
718   event->free (event);
719 }
720
721 void new_pajeDefineStateType(type_t type)
722 {
723   paje_event_t event = xbt_new0(s_paje_event_t, 1);
724   event->event_type = PAJE_DefineStateType;
725   event->timestamp = 0;
726   event->print = print_pajeDefineStateType;
727   event->free = free_paje_event;
728   event->data = xbt_new0(s_defineStateType_t, 1);
729   ((defineStateType_t)(event->data))->type = type;
730
731   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
732
733   //print it
734   event->print (event);
735   event->free (event);
736 }
737
738 void new_pajeDefineEventType(type_t type)
739 {
740   paje_event_t event = xbt_new0(s_paje_event_t, 1);
741   event->event_type = PAJE_DefineEventType;
742   event->timestamp = 0;
743   event->print = print_pajeDefineEventType;
744   event->free = free_paje_event;
745   event->data = xbt_new0(s_defineEventType_t, 1);
746   ((defineEventType_t)(event->data))->type = type;
747
748   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
749
750   //print it
751   event->print (event);
752   event->free (event);
753 }
754
755 void new_pajeDefineLinkType(type_t type, type_t source, type_t dest)
756 {
757   paje_event_t event = xbt_new0(s_paje_event_t, 1);
758   event->event_type = PAJE_DefineLinkType;
759   event->timestamp = 0;
760   event->print = print_pajeDefineLinkType;
761   event->free = free_paje_event;
762   event->data = xbt_new0(s_defineLinkType_t, 1);
763   ((defineLinkType_t)(event->data))->type = type;
764   ((defineLinkType_t)(event->data))->source = source;
765   ((defineLinkType_t)(event->data))->dest = dest;
766
767   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
768
769   //print it
770   event->print (event);
771   event->free (event);
772 }
773
774 void new_pajeDefineEntityValue (val_t value)
775 {
776   paje_event_t event = xbt_new0(s_paje_event_t, 1);
777   event->event_type = PAJE_DefineEntityValue;
778   event->timestamp = 0;
779   event->print = print_pajeDefineEntityValue;
780   event->free = free_paje_event;
781   event->data = xbt_new0(s_defineEntityValue_t, 1);
782   ((defineEntityValue_t)(event->data))->value = value;
783
784   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
785
786   //print it
787   event->print (event);
788   event->free (event);
789 }
790
791 void new_pajeCreateContainer (container_t container)
792 {
793   paje_event_t event = xbt_new0(s_paje_event_t, 1);
794   event->event_type = PAJE_CreateContainer;
795   event->timestamp = SIMIX_get_clock();
796   event->print = print_pajeCreateContainer;
797   event->free = free_paje_event;
798   event->data = xbt_new0(s_createContainer_t, 1);
799   ((createContainer_t)(event->data))->container = container;
800
801   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
802
803   //print it
804   event->print (event);
805   event->free (event);
806 }
807
808 void new_pajeDestroyContainer (container_t container)
809 {
810   paje_event_t event = xbt_new0(s_paje_event_t, 1);
811   event->event_type = PAJE_DestroyContainer;
812   event->timestamp = SIMIX_get_clock();
813   event->print = print_pajeDestroyContainer;
814   event->free = free_paje_event;
815   event->data = xbt_new0(s_destroyContainer_t, 1);
816   ((destroyContainer_t)(event->data))->container = container;
817
818   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
819
820   //print it
821   event->print (event);
822   event->free (event);
823 }
824
825 void new_pajeSetVariable (double timestamp, container_t container, type_t type, double value)
826 {
827   paje_event_t event = xbt_new0(s_paje_event_t, 1);
828   event->event_type = PAJE_SetVariable;
829   event->timestamp = timestamp;
830   event->print = print_pajeSetVariable;
831   event->free = free_paje_event;
832   event->data = xbt_new0(s_setVariable_t, 1);
833   ((setVariable_t)(event->data))->type = type;
834   ((setVariable_t)(event->data))->container = container;
835   ((setVariable_t)(event->data))->value = value;
836
837   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
838
839   insert_into_buffer (event);
840 }
841
842
843 void new_pajeAddVariable (double timestamp, container_t container, type_t type, double value)
844 {
845   paje_event_t event = xbt_new0(s_paje_event_t, 1);
846   event->event_type = PAJE_AddVariable;
847   event->timestamp = timestamp;
848   event->print = print_pajeAddVariable;
849   event->free = free_paje_event;
850   event->data = xbt_new0(s_addVariable_t, 1);
851   ((addVariable_t)(event->data))->type = type;
852   ((addVariable_t)(event->data))->container = container;
853   ((addVariable_t)(event->data))->value = value;
854
855   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
856
857   insert_into_buffer (event);
858 }
859
860 void new_pajeSubVariable (double timestamp, container_t container, type_t type, double value)
861 {
862   paje_event_t event = xbt_new0(s_paje_event_t, 1);
863   event->event_type = PAJE_SubVariable;
864   event->timestamp = timestamp;
865   event->print = print_pajeSubVariable;
866   event->free = free_paje_event;
867   event->data = xbt_new0(s_subVariable_t, 1);
868   ((subVariable_t)(event->data))->type = type;
869   ((subVariable_t)(event->data))->container = container;
870   ((subVariable_t)(event->data))->value = value;
871
872   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
873
874   insert_into_buffer (event);
875 }
876
877 void new_pajeSetState (double timestamp, container_t container, type_t type, val_t value)
878 {
879   paje_event_t event = xbt_new0(s_paje_event_t, 1);
880   event->event_type = PAJE_SetState;
881   event->timestamp = timestamp;
882   event->print = print_pajeSetState;
883   event->free = free_paje_event;
884   event->data = xbt_new0(s_setState_t, 1);
885   ((setState_t)(event->data))->type = type;
886   ((setState_t)(event->data))->container = container;
887   ((setState_t)(event->data))->value = value;
888
889   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
890
891   insert_into_buffer (event);
892 }
893
894
895 void new_pajePushState (double timestamp, container_t container, type_t type, val_t value)
896 {
897   paje_event_t event = xbt_new0(s_paje_event_t, 1);
898   event->event_type = PAJE_PushState;
899   event->timestamp = timestamp;
900   event->print = print_pajePushState;
901   event->free = free_paje_event;
902   event->data = xbt_new0(s_pushState_t, 1);
903   ((pushState_t)(event->data))->type = type;
904   ((pushState_t)(event->data))->container = container;
905   ((pushState_t)(event->data))->value = value;
906
907   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
908
909   insert_into_buffer (event);
910 }
911
912
913 void new_pajePopState (double timestamp, container_t container, type_t type)
914 {
915   paje_event_t event = xbt_new0(s_paje_event_t, 1);
916   event->event_type = PAJE_PopState;
917   event->timestamp = timestamp;
918   event->print = print_pajePopState;
919   event->free = free_paje_event;
920   event->data = xbt_new0(s_popState_t, 1);
921   ((popState_t)(event->data))->type = type;
922   ((popState_t)(event->data))->container = container;
923
924   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
925
926   insert_into_buffer (event);
927 }
928
929
930 void new_pajeResetState (double timestamp, container_t container, type_t type)
931 {
932   paje_event_t event = xbt_new0(s_paje_event_t, 1);
933   event->event_type = PAJE_ResetState;
934   event->timestamp = timestamp;
935   event->print = print_pajeResetState;
936   event->free = free_paje_event;
937   event->data = xbt_new0(s_resetState_t, 1);
938   ((resetState_t)(event->data))->type = type;
939   ((resetState_t)(event->data))->container = container;
940
941   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
942
943   insert_into_buffer (event);
944 }
945
946 void new_pajeStartLink (double timestamp, container_t container, type_t type, container_t sourceContainer, const char *value, const char *key)
947 {
948   paje_event_t event = xbt_new0(s_paje_event_t, 1);
949   event->event_type = PAJE_StartLink;
950   event->timestamp = timestamp;
951   event->print = print_pajeStartLink;
952   event->free = free_paje_event;
953   event->data = xbt_new0(s_startLink_t, 1);
954   ((startLink_t)(event->data))->type = type;
955   ((startLink_t)(event->data))->container = container;
956   ((startLink_t)(event->data))->sourceContainer = sourceContainer;
957   ((startLink_t)(event->data))->value = xbt_strdup(value);
958   ((startLink_t)(event->data))->key = xbt_strdup(key);
959
960   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
961
962   insert_into_buffer (event);
963 }
964
965 void new_pajeEndLink (double timestamp, container_t container, type_t type, container_t destContainer, const char *value, const char *key)
966 {
967   paje_event_t event = xbt_new0(s_paje_event_t, 1);
968   event->event_type = PAJE_EndLink;
969   event->timestamp = timestamp;
970   event->print = print_pajeEndLink;
971   event->free = free_paje_event;
972   event->data = xbt_new0(s_endLink_t, 1);
973   ((endLink_t)(event->data))->type = type;
974   ((endLink_t)(event->data))->container = container;
975   ((endLink_t)(event->data))->destContainer = destContainer;
976   ((endLink_t)(event->data))->value = xbt_strdup(value);
977   ((endLink_t)(event->data))->key = xbt_strdup(key);
978
979   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
980
981   insert_into_buffer (event);
982 }
983
984 void new_pajeNewEvent (double timestamp, container_t container, type_t type, val_t value)
985 {
986   paje_event_t event = xbt_new0(s_paje_event_t, 1);
987   event->event_type = PAJE_NewEvent;
988   event->timestamp = timestamp;
989   event->print = print_pajeNewEvent;
990   event->free = free_paje_event;
991   event->data = xbt_new0(s_newEvent_t, 1);
992   ((newEvent_t)(event->data))->type = type;
993   ((newEvent_t)(event->data))->container = container;
994   ((newEvent_t)(event->data))->value = value;
995
996   XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, (int)event->event_type, event->timestamp);
997
998   insert_into_buffer (event);
999 }
1000
1001 #endif /* HAVE_TRACING */