Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
a48ed9e27f3f8b1195f238b0ab16c3cb61d50a6d
[simgrid.git] / src / instr / instr_paje_trace.cpp
1 /* Copyright (c) 2010-2015. 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 "src/instr/instr_private.h"
8 #include "xbt/virtu.h" /* sg_cmdline */
9 #include <sstream>
10 #include <iomanip> /** std::setprecision **/
11
12 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(instr_paje_trace, instr_trace, "tracing event system");
13
14 extern FILE * tracing_file;
15 extern s_instr_trace_writer_t active_writer;
16
17 void TRACE_paje_init(void)
18 {
19   active_writer.print_DefineContainerType=print_pajeDefineContainerType;
20   active_writer.print_DefineVariableType=print_pajeDefineVariableType;
21   active_writer.print_DefineStateType=print_pajeDefineStateType;
22   active_writer.print_DefineEventType=print_pajeDefineEventType;
23   active_writer.print_DefineLinkType=print_pajeDefineLinkType;
24   active_writer.print_DefineEntityValue=print_pajeDefineEntityValue;
25   active_writer.print_CreateContainer=print_pajeCreateContainer;
26   active_writer.print_DestroyContainer=print_pajeDestroyContainer;
27   active_writer.print_SetVariable=print_pajeSetVariable;
28   active_writer.print_AddVariable=print_pajeAddVariable;
29   active_writer.print_SubVariable=print_pajeSubVariable;
30   active_writer.print_SetState=print_pajeSetState;
31   active_writer.print_PushState=print_pajePushState;
32   active_writer.print_PopState=print_pajePopState;
33   active_writer.print_ResetState=print_pajeResetState;
34   active_writer.print_StartLink=print_pajeStartLink;
35   active_writer.print_EndLink=print_pajeEndLink;
36   active_writer.print_NewEvent=print_pajeNewEvent;
37 }
38
39 void TRACE_paje_start(void)
40 {
41   char *filename = TRACE_get_filename();
42   tracing_file = fopen(filename, "w");
43   if (tracing_file == NULL){
44     THROWF (system_error, 1, "Tracefile %s could not be opened for writing.", filename);
45   }
46
47   XBT_DEBUG("Filename %s is open for writing", filename);
48
49   /* output generator version */
50   fprintf (tracing_file, "#This file was generated using SimGrid-%d.%d.%d\n",
51            SIMGRID_VERSION_MAJOR, SIMGRID_VERSION_MINOR, SIMGRID_VERSION_PATCH);
52   fprintf (tracing_file, "#[");
53   unsigned int cpt;
54   char *str;
55   xbt_dynar_foreach (xbt_cmdline, cpt, str){
56     fprintf(tracing_file, "%s ",str);
57   }
58   fprintf (tracing_file, "]\n");
59
60   /* output one line comment */
61   dump_comment (TRACE_get_comment());
62
63   /* output comment file */
64   dump_comment_file (TRACE_get_comment_file());
65
66   /* output header */
67   TRACE_header(TRACE_basic(),TRACE_display_sizes());
68 }
69
70 void TRACE_paje_end(void)
71 {
72   fclose(tracing_file);
73   char *filename = TRACE_get_filename();
74   XBT_DEBUG("Filename %s is closed", filename);
75 }
76
77 void print_pajeDefineContainerType(paje_event_t event)
78 {
79   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
80   fprintf(tracing_file, "%d %s %s %s\n", (int)event->event_type, ((defineContainerType_t)event->data)->type->id,
81       ((defineContainerType_t)event->data)->type->father->id, ((defineContainerType_t)event->data)->type->name);
82 }
83
84 void print_pajeDefineVariableType(paje_event_t event)
85 {
86   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
87   fprintf(tracing_file, "%d %s %s %s \"%s\"\n", (int)event->event_type,
88       ((defineVariableType_t)event->data)->type->id, ((defineVariableType_t)event->data)->type->father->id,
89       ((defineVariableType_t)event->data)->type->name, ((defineVariableType_t)event->data)->type->color);
90 }
91
92 void print_pajeDefineStateType(paje_event_t event)
93 {
94   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
95   fprintf(tracing_file, "%d %s %s %s\n", (int)event->event_type, ((defineStateType_t)event->data)->type->id,
96           ((defineStateType_t)event->data)->type->father->id, ((defineStateType_t)event->data)->type->name);
97 }
98
99 void print_pajeDefineEventType(paje_event_t event)
100 {
101   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
102   fprintf(tracing_file, "%d %s %s %s\n", (int)event->event_type, ((defineEventType_t)event->data)->type->id,
103       ((defineEventType_t)event->data)->type->father->id, ((defineEventType_t)event->data)->type->name);
104 }
105
106 void print_pajeDefineLinkType(paje_event_t event)
107 {
108   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
109   fprintf(tracing_file, "%d %s %s %s %s %s\n", (int)event->event_type, ((defineLinkType_t)event->data)->type->id,
110       ((defineLinkType_t)event->data)->type->father->id, ((defineLinkType_t)event->data)->source->id,
111       ((defineLinkType_t)event->data)->dest->id, ((defineLinkType_t)event->data)->type->name);
112 }
113
114 void print_pajeDefineEntityValue (paje_event_t event)
115 {
116   XBT_DEBUG("%s: event_type=%d", __FUNCTION__, (int)event->event_type);
117   fprintf(tracing_file, "%d %s %s %s \"%s\"\n", (int)event->event_type, ((defineEntityValue_t)event->data)->value->id,
118       ((defineEntityValue_t)event->data)->value->father->id, ((defineEntityValue_t)event->data)->value->name,
119       ((defineEntityValue_t)event->data)->value->color);
120 }
121
122 void print_pajeCreateContainer(paje_event_t event)
123 {
124   XBT_DEBUG("%s: event_type=%d, timestamp=%.*f", __FUNCTION__, (int)event->event_type, TRACE_precision(),
125             event->timestamp);
126   if (event->timestamp == 0){
127     fprintf(tracing_file, "%d 0 %s %s %s \"%s\"\n", (int)event->event_type,
128         ((createContainer_t)event->data)->container->id, ((createContainer_t)event->data)->container->type->id,
129         ((createContainer_t)event->data)->container->father->id, ((createContainer_t)event->data)->container->name);
130   }else{
131     fprintf(tracing_file, "%d %.*f %s %s %s \"%s\"\n", (int)event->event_type, TRACE_precision(), event->timestamp,
132         ((createContainer_t)event->data)->container->id, ((createContainer_t)event->data)->container->type->id,
133         ((createContainer_t)event->data)->container->father->id, ((createContainer_t)event->data)->container->name);
134   }
135 }
136
137 void print_pajeDestroyContainer(paje_event_t event)
138 {
139   XBT_DEBUG("%s: event_type=%d, timestamp=%.*f", __FUNCTION__, (int)event->event_type, TRACE_precision(),
140             event->timestamp);
141   if (event->timestamp == 0){
142     fprintf(tracing_file, "%d 0 %s %s\n", (int)event->event_type,
143         ((destroyContainer_t)event->data)->container->type->id, ((destroyContainer_t)event->data)->container->id);
144   }else{
145     fprintf(tracing_file, "%d %.*f %s %s\n", (int)event->event_type, TRACE_precision(), event->timestamp,
146         ((destroyContainer_t)event->data)->container->type->id, ((destroyContainer_t)event->data)->container->id);
147   }
148 }
149
150 void print_pajeSetVariable(paje_event_t event)
151 {
152   XBT_DEBUG("%s: event_type=%d, timestamp=%.*f", __FUNCTION__, (int)event->event_type, TRACE_precision(),
153             event->timestamp);
154   if (event->timestamp == 0){
155     fprintf(tracing_file, "%d 0 %s %s %f\n", (int)event->event_type, ((setVariable_t)event->data)->type->id,
156         ((setVariable_t)event->data)->container->id, ((setVariable_t)event->data)->value);
157   }else{
158     fprintf(tracing_file, "%d %.*f %s %s %f\n", (int)event->event_type, TRACE_precision(), event->timestamp,
159         ((setVariable_t)event->data)->type->id, ((setVariable_t)event->data)->container->id,
160         ((setVariable_t)event->data)->value);
161   }
162 }
163
164 void print_pajeAddVariable(paje_event_t event)
165 {
166   XBT_DEBUG("%s: event_type=%d, timestamp=%.*f", __FUNCTION__, (int)event->event_type, TRACE_precision(),
167             event->timestamp);
168   if (event->timestamp == 0){
169     fprintf(tracing_file, "%d 0 %s %s %f\n", (int)event->event_type, ((addVariable_t)event->data)->type->id,
170         ((addVariable_t)event->data)->container->id, ((addVariable_t)event->data)->value);
171   }else{
172     fprintf(tracing_file, "%d %.*f %s %s %f\n", (int)event->event_type, TRACE_precision(), event->timestamp,
173         ((addVariable_t)event->data)->type->id, ((addVariable_t)event->data)->container->id,
174         ((addVariable_t)event->data)->value);
175   }
176 }
177
178 void print_pajeSubVariable(paje_event_t event)
179 {
180   XBT_DEBUG("%s: event_type=%d, timestamp=%.*f", __FUNCTION__, (int)event->event_type, TRACE_precision(),
181             event->timestamp);
182   if (event->timestamp == 0){
183     fprintf(tracing_file, "%d 0 %s %s %f\n", (int)event->event_type, ((subVariable_t)event->data)->type->id,
184         ((subVariable_t)event->data)->container->id, ((subVariable_t)event->data)->value);
185   }else{
186     fprintf(tracing_file, "%d %.*f %s %s %f\n", (int)event->event_type, TRACE_precision(), event->timestamp,
187         ((subVariable_t)event->data)->type->id, ((subVariable_t)event->data)->container->id,
188         ((subVariable_t)event->data)->value);
189   }
190 }
191
192 void print_pajeSetState(paje_event_t event)
193 {
194   XBT_DEBUG("%s: event_type=%d, timestamp=%.*f", __FUNCTION__, (int)event->event_type, TRACE_precision(),
195             event->timestamp);
196   if (event->timestamp == 0){
197     fprintf(tracing_file, "%d 0 %s %s %s\n", (int)event->event_type, ((setState_t)event->data)->type->id,
198         ((setState_t)event->data)->container->id, ((setState_t)event->data)->value->id);
199   }else{
200     fprintf(tracing_file, "%d %.*f %s %s %s\n", (int)event->event_type, TRACE_precision(), event->timestamp,
201         ((setState_t)event->data)->type->id, ((setState_t)event->data)->container->id,
202         ((setState_t)event->data)->value->id);
203   }
204 }
205
206 void print_pajePushState(paje_event_t event)
207 {
208   XBT_DEBUG("%s: event_type=%d, timestamp=%.*f", __FUNCTION__, (int)event->event_type, TRACE_precision(),
209             event->timestamp);
210
211   std::stringstream stream;
212   stream << std::fixed << std::setprecision(TRACE_precision());
213
214   stream << (int) event->event_type
215          << " ";
216
217   /** prevent 0.0000 in the trace - this was the behavior before the transition to c++ **/
218   if (event->timestamp == 0) 
219     stream << 0;
220   else 
221     stream << event->timestamp;
222
223   stream << " " << ((pushState_t)event->data)->type->id
224          << " " << ((pushState_t)event->data)->container->id
225          << " " << ((pushState_t)event->data)->value->id;
226
227   if (TRACE_display_sizes()) {
228     stream << " ";
229     if (((pushState_t)event->data)->extra != NULL) {
230       stream << ((instr_extra_data)((pushState_t)event->data)->extra)->send_size;
231     }
232     else {
233       stream << 0;
234     }
235   }
236   stream << std::endl;
237
238   // TODO: This can be removed as soon as TRACE_paje_start() has been migrated
239   fprintf(tracing_file, "%s", stream.str().c_str());
240
241    if(((pushState_t)event->data)->extra!=NULL){
242      if(((instr_extra_data)((pushState_t)event->data)->extra)->sendcounts!=NULL)
243        xbt_free(((instr_extra_data)((pushState_t)event->data)->extra)->sendcounts);
244      if(((instr_extra_data)((pushState_t)event->data)->extra)->recvcounts!=NULL)
245        xbt_free(((instr_extra_data)((pushState_t)event->data)->extra)->recvcounts);
246      xbt_free(((pushState_t)event->data)->extra);
247    }
248 }
249
250 void print_pajePopState(paje_event_t event)
251 {
252   XBT_DEBUG("%s: event_type=%d, timestamp=%.*f", __FUNCTION__, (int)event->event_type, TRACE_precision(),
253             event->timestamp);
254   if (event->timestamp == 0){
255     fprintf(tracing_file, "%d 0 %s %s\n", (int)event->event_type, ((popState_t)event->data)->type->id,
256         ((popState_t)event->data)->container->id);
257   }else{
258     fprintf(tracing_file, "%d %.*f %s %s\n", (int)event->event_type, TRACE_precision(), event->timestamp,
259         ((popState_t)event->data)->type->id, ((popState_t)event->data)->container->id);
260   }
261 }
262
263 void print_pajeResetState(paje_event_t event)
264 {
265   XBT_DEBUG("%s: event_type=%d, timestamp=%.*f", __FUNCTION__, (int)event->event_type, TRACE_precision(),
266             event->timestamp);
267   if (event->timestamp == 0){
268     fprintf(tracing_file, "%d 0 %s %s\n", (int)event->event_type, ((resetState_t)event->data)->type->id,
269         ((resetState_t)event->data)->container->id);
270   }else{
271     fprintf(tracing_file, "%d %.*f %s %s\n", (int)event->event_type, TRACE_precision(), event->timestamp,
272         ((resetState_t)event->data)->type->id, ((resetState_t)event->data)->container->id);
273   }
274 }
275
276 void print_pajeStartLink(paje_event_t event)
277 {
278   if (!TRACE_display_sizes()){
279     if (event->timestamp == 0){
280       fprintf(tracing_file, "%d 0 %s %s %s %s %s\n", (int)event->event_type, ((startLink_t)event->data)->type->id,
281           ((startLink_t)event->data)->container->id, ((startLink_t)event->data)->value,
282           ((startLink_t)event->data)->sourceContainer->id, ((startLink_t)event->data)->key);
283     }else {
284       fprintf(tracing_file, "%d %.*f %s %s %s %s %s\n", (int)event->event_type, TRACE_precision(), event->timestamp,
285           ((startLink_t)event->data)->type->id, ((startLink_t)event->data)->container->id,
286           ((startLink_t)event->data)->value, ((startLink_t)event->data)->sourceContainer->id,
287           ((startLink_t)event->data)->key);
288     }
289   }else{
290   XBT_DEBUG("%s: event_type=%d, timestamp=%.*f", __FUNCTION__, (int)event->event_type, TRACE_precision(),
291             event->timestamp);
292     if (event->timestamp == 0){
293       fprintf(tracing_file, "%d 0 %s %s %s %s %s %d\n", (int)event->event_type, ((startLink_t)event->data)->type->id,
294           ((startLink_t)event->data)->container->id, ((startLink_t)event->data)->value,
295           ((startLink_t)event->data)->sourceContainer->id, ((startLink_t)event->data)->key,
296           ((startLink_t)event->data)->size);
297     }else {
298       fprintf(tracing_file, "%d %.*f %s %s %s %s %s %d\n", (int)event->event_type, TRACE_precision(), event->timestamp,
299           ((startLink_t)event->data)->type->id, ((startLink_t)event->data)->container->id,
300           ((startLink_t)event->data)->value, ((startLink_t)event->data)->sourceContainer->id,
301           ((startLink_t)event->data)->key, ((startLink_t)event->data)->size);
302     }
303   }
304 }
305
306 void print_pajeEndLink(paje_event_t event)
307 {
308   XBT_DEBUG("%s: event_type=%d, timestamp=%.*f", __FUNCTION__, (int)event->event_type, TRACE_precision(),
309             event->timestamp);
310   if (event->timestamp == 0){
311     fprintf(tracing_file, "%d 0 %s %s %s %s %s\n", (int)event->event_type, ((endLink_t)event->data)->type->id,
312         ((endLink_t)event->data)->container->id, ((endLink_t)event->data)->value,
313         ((endLink_t)event->data)->destContainer->id, ((endLink_t)event->data)->key);
314   }else {
315     fprintf(tracing_file, "%d %.*f %s %s %s %s %s\n", (int)event->event_type, TRACE_precision(), event->timestamp,
316         ((endLink_t)event->data)->type->id, ((endLink_t)event->data)->container->id, ((endLink_t)event->data)->value,
317         ((endLink_t)event->data)->destContainer->id, ((endLink_t)event->data)->key);
318   }
319 }
320
321 void print_pajeNewEvent (paje_event_t event)
322 {
323   XBT_DEBUG("%s: event_type=%d, timestamp=%.*f", __FUNCTION__, (int)event->event_type, TRACE_precision(),
324             event->timestamp);
325   if (event->timestamp == 0){
326     fprintf(tracing_file, "%d 0 %s %s %s\n", (int)event->event_type, ((newEvent_t)event->data)->type->id,
327         ((newEvent_t)event->data)->container->id, ((newEvent_t)event->data)->value->id);
328   }else{
329     fprintf(tracing_file, "%d %.*f %s %s %s\n", (int)event->event_type, TRACE_precision(), event->timestamp,
330         ((newEvent_t)event->data)->type->id, ((newEvent_t)event->data)->container->id,
331         ((newEvent_t)event->data)->value->id);
332   }
333 }