1 /* Copyright (c) 2010-2015. The SimGrid Team.
2 * All rights reserved. */
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. */
7 #include "src/instr/instr_private.h"
8 #include "xbt/virtu.h" /* sg_cmdline */
10 #include <iomanip> /** std::setprecision **/
12 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(instr_paje_trace, instr_trace, "tracing event system");
14 extern FILE * tracing_file;
15 extern s_instr_trace_writer_t active_writer;
17 void TRACE_paje_init(void)
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;
39 void TRACE_paje_start(void)
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);
47 XBT_DEBUG("Filename %s is open for writing", filename);
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, "#[");
55 xbt_dynar_foreach (xbt_cmdline, cpt, str){
56 fprintf(tracing_file, "%s ",str);
58 fprintf (tracing_file, "]\n");
60 /* output one line comment */
61 dump_comment (TRACE_get_comment());
63 /* output comment file */
64 dump_comment_file (TRACE_get_comment_file());
67 TRACE_header(TRACE_basic(),TRACE_display_sizes());
70 void TRACE_paje_end(void)
73 char *filename = TRACE_get_filename();
74 XBT_DEBUG("Filename %s is closed", filename);
77 void print_pajeDefineContainerType(paje_event_t event)
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);
84 void print_pajeDefineVariableType(paje_event_t event)
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);
92 void print_pajeDefineStateType(paje_event_t event)
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);
99 void print_pajeDefineEventType(paje_event_t event)
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);
106 void print_pajeDefineLinkType(paje_event_t event)
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);
114 void print_pajeDefineEntityValue (paje_event_t event)
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);
122 void print_pajeCreateContainer(paje_event_t event)
124 XBT_DEBUG("%s: event_type=%d, timestamp=%.*f", __FUNCTION__, (int)event->event_type, TRACE_precision(),
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);
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);
137 void print_pajeDestroyContainer(paje_event_t event)
139 XBT_DEBUG("%s: event_type=%d, timestamp=%.*f", __FUNCTION__, (int)event->event_type, TRACE_precision(),
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);
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);
150 void print_pajeSetVariable(paje_event_t event)
152 XBT_DEBUG("%s: event_type=%d, timestamp=%.*f", __FUNCTION__, (int)event->event_type, TRACE_precision(),
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);
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);
164 void print_pajeAddVariable(paje_event_t event)
166 XBT_DEBUG("%s: event_type=%d, timestamp=%.*f", __FUNCTION__, (int)event->event_type, TRACE_precision(),
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);
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);
178 void print_pajeSubVariable(paje_event_t event)
180 XBT_DEBUG("%s: event_type=%d, timestamp=%.*f", __FUNCTION__, (int)event->event_type, TRACE_precision(),
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);
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);
192 void print_pajeSetState(paje_event_t event)
194 XBT_DEBUG("%s: event_type=%d, timestamp=%.*f", __FUNCTION__, (int)event->event_type, TRACE_precision(),
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);
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);
206 void print_pajePushState(paje_event_t event)
208 XBT_DEBUG("%s: event_type=%d, timestamp=%.*f", __FUNCTION__, (int)event->event_type, TRACE_precision(),
211 std::stringstream stream;
212 stream << std::fixed << std::setprecision(TRACE_precision());
214 stream << (int) event->event_type
217 /** prevent 0.0000 in the trace - this was the behavior before the transition to c++ **/
218 if (event->timestamp == 0)
221 stream << event->timestamp;
223 stream << " " << ((pushState_t)event->data)->type->id
224 << " " << ((pushState_t)event->data)->container->id
225 << " " << ((pushState_t)event->data)->value->id;
227 if (TRACE_display_sizes()) {
229 if (((pushState_t)event->data)->extra != NULL) {
230 stream << ((instr_extra_data)((pushState_t)event->data)->extra)->send_size;
238 // TODO: This can be removed as soon as TRACE_paje_start() has been migrated
239 fprintf(tracing_file, stream.str().c_str());
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);
250 void print_pajePopState(paje_event_t event)
252 XBT_DEBUG("%s: event_type=%d, timestamp=%.*f", __FUNCTION__, (int)event->event_type, TRACE_precision(),
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);
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);
263 void print_pajeResetState(paje_event_t event)
265 XBT_DEBUG("%s: event_type=%d, timestamp=%.*f", __FUNCTION__, (int)event->event_type, TRACE_precision(),
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);
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);
276 void print_pajeStartLink(paje_event_t event)
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);
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);
290 XBT_DEBUG("%s: event_type=%d, timestamp=%.*f", __FUNCTION__, (int)event->event_type, TRACE_precision(),
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);
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);
306 void print_pajeEndLink(paje_event_t event)
308 XBT_DEBUG("%s: event_type=%d, timestamp=%.*f", __FUNCTION__, (int)event->event_type, TRACE_precision(),
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);
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);
321 void print_pajeNewEvent (paje_event_t event)
323 XBT_DEBUG("%s: event_type=%d, timestamp=%.*f", __FUNCTION__, (int)event->event_type, TRACE_precision(),
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);
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);