1 /* Copyright (c) 2010-2013. 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 "instr/instr_private.h"
8 #include "simgrid/sg_config.h"
13 XBT_LOG_NEW_CATEGORY(instr, "Logging the behavior of the tracing system (used for Visualization/Analysis of simulations)");
14 XBT_LOG_NEW_DEFAULT_SUBCATEGORY (instr_config, instr, "Configuration");
16 #define OPT_TRACING "tracing"
17 #define OPT_TRACING_PLATFORM "tracing/platform"
18 #define OPT_TRACING_TOPOLOGY "tracing/platform/topology"
19 #define OPT_TRACING_SMPI "tracing/smpi"
20 #define OPT_TRACING_SMPI_GROUP "tracing/smpi/group"
21 #define OPT_TRACING_SMPI_COMPUTING "tracing/smpi/computing"
22 #define OPT_TRACING_SMPI_INTERNALS "tracing/smpi/internals"
23 #define OPT_TRACING_DISPLAY_SIZES "tracing/smpi/display_sizes"
24 #define OPT_TRACING_CATEGORIZED "tracing/categorized"
25 #define OPT_TRACING_UNCATEGORIZED "tracing/uncategorized"
26 #define OPT_TRACING_MSG_PROCESS "tracing/msg/process"
27 #define OPT_TRACING_MSG_VM "tracing/msg/vm"
28 #define OPT_TRACING_FILENAME "tracing/filename"
29 #define OPT_TRACING_BUFFER "tracing/buffer"
30 #define OPT_TRACING_ONELINK_ONLY "tracing/onelink_only"
31 #define OPT_TRACING_DISABLE_DESTROY "tracing/disable_destroy"
32 #define OPT_TRACING_BASIC "tracing/basic"
33 #define OPT_TRACING_COMMENT "tracing/comment"
34 #define OPT_TRACING_COMMENT_FILE "tracing/comment_file"
35 #define OPT_VIVA_UNCAT_CONF "viva/uncategorized"
36 #define OPT_VIVA_CAT_CONF "viva/categorized"
37 #define OPT_TRACING_DISABLE_LINK "tracing/disable_link"
38 #define OPT_TRACING_DISABLE_POWER "tracing/disable_power"
40 static int trace_enabled;
41 static int trace_platform;
42 static int trace_platform_topology;
43 static int trace_smpi_enabled;
44 static int trace_smpi_grouped;
45 static int trace_smpi_computing;
46 static int trace_view_internals;
47 static int trace_categorized;
48 static int trace_uncategorized;
49 static int trace_msg_process_enabled;
50 static int trace_msg_vm_enabled;
51 static int trace_buffer;
52 static int trace_onelink_only;
53 static int trace_disable_destroy;
54 static int trace_basic;
55 static int trace_display_sizes = 0;
56 static int trace_disable_link;
57 static int trace_disable_power;
59 static int trace_configured = 0;
60 static int trace_active = 0;
64 static void TRACE_getopts(void)
66 trace_enabled = xbt_cfg_get_int(_sg_cfg_set, OPT_TRACING);
67 trace_platform = xbt_cfg_get_int(_sg_cfg_set, OPT_TRACING_PLATFORM);
68 trace_platform_topology = xbt_cfg_get_int(_sg_cfg_set, OPT_TRACING_TOPOLOGY);
69 trace_smpi_enabled = xbt_cfg_get_int(_sg_cfg_set, OPT_TRACING_SMPI);
70 trace_smpi_grouped = xbt_cfg_get_int(_sg_cfg_set, OPT_TRACING_SMPI_GROUP);
71 trace_smpi_computing = xbt_cfg_get_int(_sg_cfg_set, OPT_TRACING_SMPI_COMPUTING);
72 trace_view_internals = xbt_cfg_get_int(_sg_cfg_set, OPT_TRACING_SMPI_INTERNALS);
73 trace_categorized = xbt_cfg_get_int(_sg_cfg_set, OPT_TRACING_CATEGORIZED);
74 trace_uncategorized = xbt_cfg_get_int(_sg_cfg_set, OPT_TRACING_UNCATEGORIZED);
75 trace_msg_process_enabled = xbt_cfg_get_int(_sg_cfg_set, OPT_TRACING_MSG_PROCESS);
76 trace_msg_vm_enabled = xbt_cfg_get_int(_sg_cfg_set, OPT_TRACING_MSG_VM);
77 trace_buffer = xbt_cfg_get_int(_sg_cfg_set, OPT_TRACING_BUFFER);
78 trace_onelink_only = xbt_cfg_get_int(_sg_cfg_set, OPT_TRACING_ONELINK_ONLY);
79 trace_disable_destroy = xbt_cfg_get_int(_sg_cfg_set, OPT_TRACING_DISABLE_DESTROY);
80 trace_basic = xbt_cfg_get_int(_sg_cfg_set, OPT_TRACING_BASIC);
81 trace_display_sizes = xbt_cfg_get_int(_sg_cfg_set, OPT_TRACING_DISPLAY_SIZES);
82 trace_disable_link = xbt_cfg_get_int(_sg_cfg_set, OPT_TRACING_DISABLE_LINK);
83 trace_disable_power = xbt_cfg_get_int(_sg_cfg_set, OPT_TRACING_DISABLE_POWER);
86 static xbt_dynar_t TRACE_start_functions = NULL;
87 void TRACE_add_start_function(void (*func) ())
89 if (TRACE_start_functions == NULL)
90 TRACE_start_functions = xbt_dynar_new(sizeof(void (*)()), NULL);
91 xbt_dynar_push(TRACE_start_functions, &func);
98 // tracing system must be:
99 // - enabled (with --cfg=tracing:1)
100 // - already configured (TRACE_global_init already called)
101 if (TRACE_is_enabled() && TRACE_is_configured()) {
102 XBT_DEBUG("Tracing starts");
104 /* open the trace file */
108 if (trace_active == 1) {
109 THROWF(tracing_error, 0, "Tracing is already active");
112 XBT_DEBUG("Tracing is on");
114 /* other trace initialization */
115 created_categories = xbt_dict_new_homogeneous(xbt_free);
116 declared_marks = xbt_dict_new_homogeneous(xbt_free);
117 user_host_variables = xbt_dict_new_homogeneous(xbt_free);
118 user_vm_variables = xbt_dict_new_homogeneous (xbt_free);
119 user_link_variables = xbt_dict_new_homogeneous(xbt_free);
121 if (TRACE_start_functions != NULL) {
123 unsigned int iter = xbt_dynar_length(TRACE_start_functions);
124 xbt_dynar_foreach(TRACE_start_functions, iter, func) {
129 xbt_dynar_free(&TRACE_start_functions);
133 static xbt_dynar_t TRACE_end_functions = NULL;
134 void TRACE_add_end_function(void (*func) (void))
136 if (TRACE_end_functions == NULL)
137 TRACE_end_functions = xbt_dynar_new(sizeof(void (*)(void)), NULL);
138 xbt_dynar_push(TRACE_end_functions, &func);
149 TRACE_generate_viva_uncat_conf();
150 TRACE_generate_viva_cat_conf();
152 /* dump trace buffer */
153 TRACE_last_timestamp_to_dump = surf_get_clock();
154 TRACE_paje_dump_buffer(1);
156 /* destroy all data structures of tracing (and free) */
157 PJ_container_free_all();
159 PJ_container_release();
162 if (TRACE_end_functions != NULL) {
165 xbt_dynar_foreach(TRACE_end_functions, iter, func) {
170 xbt_dict_free(&user_link_variables);
171 xbt_dict_free(&user_host_variables);
172 xbt_dict_free(&user_vm_variables);
173 xbt_dict_free(&declared_marks);
174 xbt_dict_free(&created_categories);
176 /* close the trace file */
179 /* de-activate trace */
181 XBT_DEBUG("Tracing is off");
182 XBT_DEBUG("Tracing system is shutdown");
184 xbt_dynar_free(&TRACE_end_functions);
188 int TRACE_needs_platform (void)
190 return TRACE_msg_process_is_enabled() ||
191 TRACE_msg_vm_is_enabled() ||
192 TRACE_categorized() ||
193 TRACE_uncategorized() ||
195 (TRACE_smpi_is_enabled() && TRACE_smpi_is_grouped());
198 int TRACE_is_enabled(void)
200 return trace_enabled;
203 int TRACE_platform(void)
205 return trace_platform;
208 int TRACE_platform_topology(void)
210 return trace_platform_topology;
213 int TRACE_is_configured(void)
215 return trace_configured;
218 int TRACE_smpi_is_enabled(void)
220 return (trace_smpi_enabled || TRACE_smpi_is_grouped())
221 && TRACE_is_enabled();
224 int TRACE_smpi_is_grouped(void)
226 return trace_smpi_grouped;
229 int TRACE_smpi_is_computing(void)
231 return trace_smpi_computing;
234 int TRACE_smpi_view_internals(void)
236 return trace_view_internals;
239 int TRACE_categorized (void)
241 return trace_categorized;
244 int TRACE_uncategorized (void)
246 return trace_uncategorized;
249 int TRACE_msg_process_is_enabled(void)
251 return trace_msg_process_enabled && TRACE_is_enabled();
254 int TRACE_msg_vm_is_enabled(void)
256 return trace_msg_vm_enabled && TRACE_is_enabled();
259 int TRACE_disable_link(void)
261 return trace_disable_link && TRACE_is_enabled();
264 int TRACE_disable_power(void)
266 return trace_disable_power && TRACE_is_enabled();
269 int TRACE_buffer (void)
271 return trace_buffer && TRACE_is_enabled();
274 int TRACE_onelink_only (void)
276 return trace_onelink_only && TRACE_is_enabled();
279 int TRACE_disable_destroy (void)
281 return trace_disable_destroy && TRACE_is_enabled();
284 int TRACE_basic (void)
286 return trace_basic && TRACE_is_enabled();
289 int TRACE_display_sizes (void)
291 return trace_display_sizes && trace_smpi_enabled && TRACE_is_enabled();
294 char *TRACE_get_comment (void)
296 return xbt_cfg_get_string(_sg_cfg_set, OPT_TRACING_COMMENT);
299 char *TRACE_get_comment_file (void)
301 return xbt_cfg_get_string(_sg_cfg_set, OPT_TRACING_COMMENT_FILE);
304 char *TRACE_get_filename(void)
306 return xbt_cfg_get_string(_sg_cfg_set, OPT_TRACING_FILENAME);
309 char *TRACE_get_viva_uncat_conf (void)
311 return xbt_cfg_get_string(_sg_cfg_set, OPT_VIVA_UNCAT_CONF);
314 char *TRACE_get_viva_cat_conf (void)
316 return xbt_cfg_get_string(_sg_cfg_set, OPT_VIVA_CAT_CONF);
319 void TRACE_global_init(int *argc, char **argv)
321 /* name of the tracefile */
322 xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_FILENAME,
323 "Trace file created by the instrumented SimGrid.",
324 xbt_cfgelm_string, 1, 1, NULL, NULL);
325 xbt_cfg_setdefault_string(_sg_cfg_set, OPT_TRACING_FILENAME, "simgrid.trace");
328 xbt_cfg_register(&_sg_cfg_set, OPT_TRACING,
330 xbt_cfgelm_int, 0, 1, NULL, NULL);
331 xbt_cfg_setdefault_int(_sg_cfg_set, OPT_TRACING, 0);
333 /* register platform in the trace */
334 xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_PLATFORM,
335 "Register the platform in the trace as a hierarchy.",
336 xbt_cfgelm_int, 0, 1, NULL, NULL);
337 xbt_cfg_setdefault_int(_sg_cfg_set, OPT_TRACING_PLATFORM, 0);
339 /* register platform in the trace */
340 xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_TOPOLOGY,
341 "Register the platform topology in the trace as a graph.",
342 xbt_cfgelm_int, 0, 1, NULL, NULL);
343 xbt_cfg_setdefault_int(_sg_cfg_set, OPT_TRACING_TOPOLOGY, 1);
346 xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_SMPI,
347 "Tracing of the SMPI interface.",
348 xbt_cfgelm_int, 0, 1, NULL, NULL);
349 xbt_cfg_setdefault_int(_sg_cfg_set, OPT_TRACING_SMPI, 0);
352 xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_SMPI_GROUP,
353 "Group MPI processes by host.",
354 xbt_cfgelm_int, 0, 1, NULL, NULL);
355 xbt_cfg_setdefault_int(_sg_cfg_set, OPT_TRACING_SMPI_GROUP, 0);
358 xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_SMPI_COMPUTING,
359 "Generate states for timing out of SMPI parts of the application",
360 xbt_cfgelm_int, 0, 1, NULL, NULL);
361 xbt_cfg_setdefault_int(_sg_cfg_set, OPT_TRACING_SMPI_COMPUTING, 0);
364 xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_SMPI_INTERNALS,
365 "View internal messages sent by Collective communications in SMPI",
366 xbt_cfgelm_int, 0, 1, NULL, NULL);
367 xbt_cfg_setdefault_int(_sg_cfg_set, OPT_TRACING_SMPI_INTERNALS, 0);
369 /* tracing categorized resource utilization traces */
370 xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_CATEGORIZED,
371 "Tracing categorized resource utilization of hosts and links.",
372 xbt_cfgelm_int, 0, 1, NULL, NULL);
373 xbt_cfg_setdefault_int(_sg_cfg_set, OPT_TRACING_CATEGORIZED, 0);
375 /* tracing uncategorized resource utilization */
376 xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_UNCATEGORIZED,
377 "Tracing uncategorized resource utilization of hosts and links.",
378 xbt_cfgelm_int, 0, 1, NULL, NULL);
379 xbt_cfg_setdefault_int(_sg_cfg_set, OPT_TRACING_UNCATEGORIZED, 0);
382 xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_MSG_PROCESS,
383 "Tracing of MSG process behavior.",
384 xbt_cfgelm_int, 0, 1, NULL, NULL);
385 xbt_cfg_setdefault_int(_sg_cfg_set, OPT_TRACING_MSG_PROCESS, 0);
388 xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_MSG_VM,
389 "Tracing of MSG process behavior.",
390 xbt_cfgelm_int, 0, 1, NULL, NULL);
391 xbt_cfg_setdefault_int(_sg_cfg_set, OPT_TRACING_MSG_VM, 0);
393 /* disable tracing link */
394 xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_DISABLE_LINK,
395 "Do not trace link bandwidth and latency.",
396 xbt_cfgelm_int, 0, 1, NULL, NULL);
397 xbt_cfg_setdefault_int(_sg_cfg_set, OPT_TRACING_DISABLE_LINK, 0);
399 /* disable tracing link */
400 xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_DISABLE_POWER,
401 "Do not trace host power.",
402 xbt_cfgelm_int, 0, 1, NULL, NULL);
403 xbt_cfg_setdefault_int(_sg_cfg_set, OPT_TRACING_DISABLE_POWER, 0);
407 xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_BUFFER,
408 "Buffer trace events to put them in temporal order.",
409 xbt_cfgelm_int, 0, 1, NULL, NULL);
410 xbt_cfg_setdefault_int(_sg_cfg_set, OPT_TRACING_BUFFER, 1);
412 /* tracing one link only */
413 xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_ONELINK_ONLY,
414 "Use only routes with one link to trace platform.",
415 xbt_cfgelm_int, 0, 1, NULL, NULL);
416 xbt_cfg_setdefault_int(_sg_cfg_set, OPT_TRACING_ONELINK_ONLY, 0);
418 /* disable destroy */
419 xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_DISABLE_DESTROY,
420 "Disable platform containers destruction.",
421 xbt_cfgelm_int, 0, 1, NULL, NULL);
422 xbt_cfg_setdefault_int(_sg_cfg_set, OPT_TRACING_DISABLE_DESTROY, 0);
424 /* basic -- Avoid extended events (impoverished trace file) */
425 xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_BASIC,
426 "Avoid extended events (impoverished trace file).",
427 xbt_cfgelm_int, 0, 1, NULL, NULL);
428 xbt_cfg_setdefault_int(_sg_cfg_set, OPT_TRACING_BASIC, 0);
430 /* display_sizes -- Extended events with message size information */
431 xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_DISPLAY_SIZES,
432 "(smpi only for now) Extended events with message size information",
433 xbt_cfgelm_int, 0, 1, NULL, NULL);
434 xbt_cfg_setdefault_int(_sg_cfg_set, OPT_TRACING_DISPLAY_SIZES, 0);
437 xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_COMMENT,
438 "Comment to be added on the top of the trace file.",
439 xbt_cfgelm_string, 1, 1, NULL, NULL);
440 xbt_cfg_setdefault_string(_sg_cfg_set, OPT_TRACING_COMMENT, "");
443 xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_COMMENT_FILE,
444 "The contents of the file are added to the top of the trace file as comment.",
445 xbt_cfgelm_string, 1, 1, NULL, NULL);
446 xbt_cfg_setdefault_string(_sg_cfg_set, OPT_TRACING_COMMENT_FILE, "");
448 /* Viva graph configuration for uncategorized tracing */
449 xbt_cfg_register(&_sg_cfg_set, OPT_VIVA_UNCAT_CONF,
450 "Viva Graph configuration file for uncategorized resource utilization traces.",
451 xbt_cfgelm_string, 1, 1, NULL, NULL);
452 xbt_cfg_setdefault_string(_sg_cfg_set, OPT_VIVA_UNCAT_CONF, "");
454 /* Viva graph configuration for uncategorized tracing */
455 xbt_cfg_register(&_sg_cfg_set, OPT_VIVA_CAT_CONF,
456 "Viva Graph configuration file for categorized resource utilization traces.",
457 xbt_cfgelm_string, 1, 1, NULL, NULL);
458 xbt_cfg_setdefault_string(_sg_cfg_set, OPT_VIVA_CAT_CONF, "");
460 /* instrumentation can be considered configured now */
461 trace_configured = 1;
464 static void print_line (const char *option, const char *desc, const char *longdesc, int detailed)
466 char str[INSTR_DEFAULT_STR_SIZE];
467 snprintf (str, INSTR_DEFAULT_STR_SIZE, "--cfg=%s ", option);
469 int len = strlen (str);
470 printf ("%s%*.*s %s\n", str, 30-len, 30-len, "", desc);
471 if (!!longdesc && detailed){
472 printf ("%s\n\n", longdesc);
476 void TRACE_help (int detailed)
479 "Description of the tracing options accepted by this simulator:\n\n");
480 print_line (OPT_TRACING, "Enable the tracing system",
481 " It activates the tracing system and register the simulation platform\n"
482 " in the trace file. You have to enable this option to others take effect.",
484 print_line (OPT_TRACING_CATEGORIZED, "Trace categorized resource utilization",
485 " It activates the categorized resource utilization tracing. It should\n"
486 " be enabled if tracing categories are used by this simulator.",
488 print_line (OPT_TRACING_UNCATEGORIZED, "Trace uncategorized resource utilization",
489 " It activates the uncategorized resource utilization tracing. Use it if\n"
490 " this simulator do not use tracing categories and resource use have to be\n"
493 print_line (OPT_TRACING_FILENAME, "Filename to register traces",
494 " A file with this name will be created to register the simulation. The file\n"
495 " is in the Paje format and can be analyzed using Viva, Paje, and PajeNG visualization\n"
496 " tools. More information can be found in these webpages:\n"
497 " http://github.com/schnorr/viva/\n"
498 " http://github.com/schnorr/pajeng/\n"
499 " http://paje.sourceforge.net/",
501 print_line (OPT_TRACING_SMPI, "Trace the MPI Interface (SMPI)",
502 " This option only has effect if this simulator is SMPI-based. Traces the MPI\n"
503 " interface and generates a trace that can be analyzed using Gantt-like\n"
504 " visualizations. Every MPI function (implemented by SMPI) is transformed in a\n"
505 " state, and point-to-point communications can be analyzed with arrows.",
507 print_line (OPT_TRACING_SMPI_GROUP, "Group MPI processes by host (SMPI)",
508 " This option only has effect if this simulator is SMPI-based. The processes\n"
509 " are grouped by the hosts where they were executed.",
511 print_line (OPT_TRACING_SMPI_COMPUTING, "Generates a \" Computing \" State",
512 " This option aims at tracing computations in the application, outside SMPI\n"
513 " to allow further study of simulated or real computation time",
515 print_line (OPT_TRACING_SMPI_INTERNALS, "Generates tracing events corresponding",
516 " to point-to-point messages sent by collective communications",
518 print_line (OPT_TRACING_MSG_PROCESS, "Trace processes behavior (MSG)",
519 " This option only has effect if this simulator is MSG-based. It traces the\n"
520 " behavior of all categorized MSG processes, grouping them by hosts. This option\n"
521 " can be used to track process location if this simulator has process migration.",
523 print_line (OPT_TRACING_BUFFER, "Buffer events to put them in temporal order",
524 " This option put some events in a time-ordered buffer using the insertion\n"
525 " sort algorithm. The process of acquiring and releasing locks to access this\n"
526 " buffer and the cost of the sorting algorithm make this process slow. The\n"
527 " simulator performance can be severely impacted if this option is activated,\n"
528 " but you are sure to get a trace file with events sorted.",
530 print_line (OPT_TRACING_ONELINK_ONLY, "Consider only one link routes to trace platform",
531 " This option changes the way SimGrid register its platform on the trace file.\n"
532 " Normally, the tracing considers all routes (no matter their size) on the\n"
533 " platform file to re-create the resource topology. If this option is activated,\n"
534 " only the routes with one link are used to register the topology within an AS.\n"
535 " Routes among AS continue to be traced as usual.",
537 print_line (OPT_TRACING_DISABLE_DESTROY, "Disable platform containers destruction",
538 " Disable the destruction of containers at the end of simulation. This can be\n"
539 " used with simulators that have a different notion of time (different from\n"
540 " the simulated time).",
542 print_line (OPT_TRACING_BASIC, "Avoid extended events (impoverished trace file).",
543 " Some visualization tools are not able to parse correctly the Paje file format.\n"
544 " Use this option if you are using one of these tools to visualize the simulation\n"
545 " trace. Keep in mind that the trace might be incomplete, without all the\n"
546 " information that would be registered otherwise.",
548 print_line (OPT_TRACING_DISPLAY_SIZES, "Only works for SMPI now. Add message size information",
549 "Message size (in bytes) is added to links, and to states. For collectives, the displayed value \n"
550 "is the more relevant to the collective (total sent by the process, usually)",
552 print_line (OPT_TRACING_COMMENT, "Comment to be added on the top of the trace file.",
553 " Use this to add a comment line to the top of the trace file.",
555 print_line (OPT_TRACING_COMMENT_FILE, "File contents added to trace file as comment.",
556 " Use this to add the contents of a file to the top of the trace file as comment.",
558 print_line (OPT_VIVA_UNCAT_CONF, "Generate a graph configuration for Viva",
559 " This option can be used in all types of simulators build with SimGrid\n"
560 " to generate a uncategorized resource utilization graph to be used as\n"
561 " configuration for the Viva visualization tool. This option\n"
562 " can be used with tracing/categorized:1 and tracing:1 options to\n"
563 " analyze an unmodified simulator before changing it to contain\n"
566 print_line (OPT_VIVA_CAT_CONF, "Generate an uncategorized graph configuration for Viva",
567 " This option can be used if this simulator uses tracing categories\n"
568 " in its code. The file specified by this option holds a graph configuration\n"
569 " file for the Viva visualization tool that can be used to analyze a categorized\n"
570 " resource utilization.",
572 print_line (OPT_TRACING_TOPOLOGY, "Register the platform topology as a graph",
573 " This option (enabled by default) can be used to disable the tracing of\n"
574 " the platform topology in the trace file. Sometimes, such task is really\n"
575 " time consuming, since it must get the route from each host ot other hosts\n"
576 " within the same Autonomous System (AS).",
580 static void output_types (const char *name, xbt_dynar_t types, FILE *file)
583 fprintf (file, " %s = (", name);
584 for (i = xbt_dynar_length(types); i > 0; i--) {
585 char *type = *(char**)xbt_dynar_get_ptr(types, i - 1);
586 fprintf (file, "\"%s\"", type);
590 fprintf (file, ");\n");
593 xbt_dynar_free (&types);
596 static void output_categories (const char *name, xbt_dynar_t cats, FILE *file)
599 fprintf (file, " values = (");
600 for (i = xbt_dynar_length(cats); i > 0; i--) {
601 char *cat = *(char**)xbt_dynar_get_ptr(cats, i - 1);
602 fprintf (file, "\"%s%s\"", name, cat);
606 fprintf (file, ");\n");
609 xbt_dynar_free (&cats);
612 static void uncat_configuration (FILE *file)
614 //register NODE and EDGE types
615 output_types ("node", TRACE_get_node_types(), file);
616 output_types ("edge", TRACE_get_edge_types(), file);
617 fprintf (file, "\n");
619 //configuration for all nodes
622 " type = \"square\";\n"
623 " size = \"power\";\n"
624 " values = (\"power_used\");\n"
627 " type = \"rhombus\";\n"
628 " size = \"bandwidth\";\n"
629 " values = (\"bandwidth_used\");\n"
634 static void cat_configuration (FILE *file)
636 //register NODE and EDGE types
637 output_types ("node", TRACE_get_node_types(), file);
638 output_types ("edge", TRACE_get_edge_types(), file);
639 fprintf (file, "\n");
641 //configuration for all nodes
644 " type = \"square\";\n"
645 " size = \"power\";\n");
646 output_categories ("p", TRACE_get_categories(), file);
650 " type = \"rhombus\";\n"
651 " size = \"bandwidth\";\n");
652 output_categories ("b", TRACE_get_categories(), file);
653 fprintf (file, " };\n");
657 static void generate_uncat_configuration (const char *output, const char *name, int brackets)
659 if (output && strlen(output) > 0){
660 FILE *file = fopen (output, "w");
662 THROWF (system_error, 1, "Unable to open file (%s) for writing %s graph "
663 "configuration (uncategorized).", output, name);
666 if (brackets) fprintf (file, "{\n");
667 uncat_configuration (file);
668 if (brackets) fprintf (file, "}\n");
673 static void generate_cat_configuration (const char *output, const char *name, int brackets)
675 if (output && strlen(output) > 0){
676 //check if we do have categories declared
677 if (xbt_dict_is_empty(created_categories)){
678 XBT_INFO("No categories declared, ignoring generation of %s graph configuration", name);
682 FILE *file = fopen (output, "w");
684 THROWF (system_error, 1, "Unable to open file (%s) for writing %s graph "
685 "configuration (categorized).", output, name);
688 if (brackets) fprintf (file, "{\n");
689 cat_configuration (file);
690 if (brackets) fprintf (file, "}\n");
695 void TRACE_generate_viva_uncat_conf (void)
697 generate_uncat_configuration (TRACE_get_viva_uncat_conf (), "viva", 0);
700 void TRACE_generate_viva_cat_conf (void)
702 generate_cat_configuration (TRACE_get_viva_cat_conf(), "viva", 0);
705 static int previous_trace_state = -1;
707 void instr_pause_tracing (void)
709 previous_trace_state = trace_enabled;
710 if (!TRACE_is_enabled()){
711 XBT_DEBUG ("Tracing is already paused, therefore do nothing.");
713 XBT_DEBUG ("Tracing is being paused.");
716 XBT_DEBUG ("Tracing is paused.");
719 void instr_resume_tracing (void)
721 if (TRACE_is_enabled()){
722 XBT_DEBUG ("Tracing is already running while trying to resume, therefore do nothing.");
724 XBT_DEBUG ("Tracing is being resumed.");
727 if (previous_trace_state != -1){
728 trace_enabled = previous_trace_state;
732 XBT_DEBUG ("Tracing is resumed.");
733 previous_trace_state = -1;
737 #undef OPT_TRACING_PLATFORM
738 #undef OPT_TRACING_TOPOLOGY
739 #undef OPT_TRACING_SMPI
740 #undef OPT_TRACING_SMPI_GROUP
741 #undef OPT_TRACING_CATEGORIZED
742 #undef OPT_TRACING_UNCATEGORIZED
743 #undef OPT_TRACING_MSG_PROCESS
744 #undef OPT_TRACING_FILENAME
745 #undef OPT_TRACING_BUFFER
746 #undef OPT_TRACING_ONELINK_ONLY
747 #undef OPT_TRACING_DISABLE_DESTROY
748 #undef OPT_TRACING_BASIC
749 #undef OPT_TRACING_COMMENT
750 #undef OPT_TRACING_COMMENT_FILE
751 #undef OPT_VIVA_UNCAT_CONF
752 #undef OPT_VIVA_CAT_CONF
754 #endif /* HAVE_TRACING */