Logo AND Algorithmique Numérique Distribuée

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