Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[trace] Guard expensive computations with TRACE_is_active.
[simgrid.git] / src / instr / instr_routing.c
index 9ac2f97..6ee93c3 100644 (file)
@@ -9,6 +9,7 @@
 #ifdef HAVE_TRACING
 #include "surf/surf_private.h"
 #include "surf/network_private.h"
+#include "xbt/graph.h"
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY (instr_routing, instr, "Tracing platform hierarchy");
 
@@ -109,6 +110,9 @@ static void recursiveGraphExtraction (routing_component_t rc, container_t contai
           strcmp (child1_name, child2_name) != 0){
 
         xbt_dynar_t route = global_routing->get_route (child1_name, child2_name);
+        if (TRACE_onelink_only()){
+          if (xbt_dynar_length (route) > 1) continue;
+        }
         unsigned int cpt;
         void *link;
         container_t previous = child1;
@@ -302,7 +306,7 @@ void instr_routing_define_callbacks ()
 /*
  * user categories support
  */
-static void recursiveNewUserVariableType (const char *new_typename, const char *color, type_t root)
+static void recursiveNewVariableType (const char *new_typename, const char *color, type_t root)
 {
   if (!strcmp (root->name, "HOST")){
     char tnstr[INSTR_DEFAULT_STR_SIZE];
@@ -318,51 +322,34 @@ static void recursiveNewUserVariableType (const char *new_typename, const char *
   type_t child_type;
   char *name;
   xbt_dict_foreach(root->children, cursor, name, child_type) {
-    recursiveNewUserVariableType (new_typename, color, child_type);
+    recursiveNewVariableType (new_typename, color, child_type);
   }
 }
 
-void instr_new_user_variable_type (const char *new_typename, const char *color)
+void instr_new_variable_type (const char *new_typename, const char *color)
 {
-  recursiveNewUserVariableType (new_typename, color, getRootType());
+  recursiveNewVariableType (new_typename, color, getRootType());
 }
 
-static void recursiveNewUserLinkVariableType (const char *new_typename, const char *color, type_t root)
+static void recursiveNewUserVariableType (const char *father_type, const char *new_typename, const char *color, type_t root)
 {
-  if (!strcmp (root->name, "LINK")){
+  if (!strcmp (root->name, father_type)){
     getVariableType(new_typename, color, root);
   }
   xbt_dict_cursor_t cursor = NULL;
   type_t child_type;
   char *name;
   xbt_dict_foreach(root->children, cursor, name, child_type) {
-    recursiveNewUserLinkVariableType (new_typename, color, child_type);
+    recursiveNewUserVariableType (father_type, new_typename, color, child_type);
   }
 }
 
-void instr_new_user_link_variable_type  (const char *new_typename, const char *color)
+void instr_new_user_variable_type  (const char *father_type, const char *new_typename, const char *color)
 {
-  recursiveNewUserLinkVariableType (new_typename, color, getRootType());
+  recursiveNewUserVariableType (father_type, new_typename, color, getRootType());
 }
 
 
-static void recursiveNewUserHostVariableType (const char *new_typename, const char *color, type_t root)
-{
-  if (!strcmp (root->name, "HOST")){
-    getVariableType(new_typename, color, root);
-  }
-  xbt_dict_cursor_t cursor = NULL;
-  type_t child_type;
-  char *name;
-  xbt_dict_foreach(root->children, cursor, name, child_type) {
-    recursiveNewUserHostVariableType (new_typename, color, child_type);
-  }
-}
-
-void instr_new_user_host_variable_type  (const char *new_typename, const char *color)
-{
-  recursiveNewUserHostVariableType (new_typename, color, getRootType());
-}
 
 int instr_platform_traced ()
 {
@@ -431,6 +418,9 @@ static void recursiveXBTGraphExtraction (xbt_graph_t graph, xbt_dict_t nodes, xb
           strcmp (child1_name, child2_name) != 0){
 
         xbt_dynar_t route = global_routing->get_route (child1_name, child2_name);
+        if (TRACE_onelink_only()){
+          if (xbt_dynar_length (route) > 1) continue;
+        }
         unsigned int cpt;
         void *link;
         xbt_node_t current, previous = new_xbt_graph_node(graph, child1_name, nodes);
@@ -475,5 +465,42 @@ xbt_graph_t instr_routing_platform_graph (void)
   return ret;
 }
 
+void instr_routing_platform_graph_export_graphviz (xbt_graph_t g, const char *filename)
+{
+  unsigned int cursor = 0;
+  xbt_node_t node = NULL;
+  xbt_edge_t edge = NULL;
+  FILE *file = NULL;
+
+  file = fopen(filename, "w");
+  xbt_assert(file, "Failed to open %s \n", filename);
+
+  if (g->directed)
+    fprintf(file, "digraph test {\n");
+  else
+    fprintf(file, "graph test {\n");
+
+  fprintf(file, "  graph [overlap=scale]\n");
+
+  fprintf(file, "  node [shape=box, style=filled]\n");
+  fprintf(file,
+          "  node [width=.3, height=.3, style=filled, color=skyblue]\n\n");
+
+  xbt_dynar_foreach(g->nodes, cursor, node) {
+    fprintf(file, "  \"%s\";\n", TRACE_node_name(node));
+  }
+  xbt_dynar_foreach(g->edges, cursor, edge) {
+    const char *src_s = TRACE_node_name (edge->src);
+    const char *dst_s = TRACE_node_name (edge->dst);
+    if (g->directed)
+      fprintf(file, "  \"%s\" -> \"%s\";\n", src_s, dst_s);
+    else
+      fprintf(file, "  \"%s\" -- \"%s\";\n", src_s, dst_s);
+  }
+  fprintf(file, "}\n");
+  fclose(file);
+
+}
+
 #endif /* HAVE_TRACING */