From: mehdi Date: Thu, 14 Apr 2011 07:28:02 +0000 (+0200) Subject: Merge branch 'master' of git+ssh://scm.gforge.inria.fr//gitroot//simgrid/simgrid X-Git-Tag: v3.6_beta2~43 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/d5a1db1d0b268cb9ed8f37246fd970fce7631943?hp=484009fc692a2e72d811d7beeeae6c7c75d2ac1e Merge branch 'master' of git+ssh://scm.gforge.inria.fr//gitroot//simgrid/simgrid --- diff --git a/include/xbt/graph.h b/include/xbt/graph.h index a35336e3d8..64e0648d8d 100644 --- a/include/xbt/graph.h +++ b/include/xbt/graph.h @@ -77,6 +77,11 @@ XBT_PUBLIC(void) xbt_graph_export_graphxml(xbt_graph_t g, *(edge_name) (xbt_edge_t), const char *(node_data_print) (void *), const char *(edge_data_print) (void *)); +XBT_PUBLIC(xbt_graph_t) xbt_graph_load (const char *filename); +XBT_PUBLIC(void) xbt_graph_save (xbt_graph_t span, + const char *filename, + const char *(nname) (xbt_node_t), + const char *(ename) (xbt_edge_t)); /* Not implemented yet ! */ /* void *xbt_graph_to_array(xbt_graph_t g); */ diff --git a/src/instr/instr_private.h b/src/instr/instr_private.h index 4a7a725d0b..39e25c10ae 100644 --- a/src/instr/instr_private.h +++ b/src/instr/instr_private.h @@ -135,9 +135,7 @@ void TRACE_surf_link_set_latency(double date, const char *resource, double laten void TRACE_surf_action(surf_action_t surf_action, const char *category); //for tracing gtnets -void TRACE_surf_gtnets_communicate(void *action, int src, int dst); -int TRACE_surf_gtnets_get_src(void *action); -int TRACE_surf_gtnets_get_dst(void *action); +void TRACE_surf_gtnets_communicate(void *action, const char *src, const char *dst); void TRACE_surf_gtnets_destroy(void *action); /* from smpi_instr.c */ diff --git a/src/instr/instr_surf.c b/src/instr/instr_surf.c index 4318df001c..de520c9112 100644 --- a/src/instr/instr_surf.c +++ b/src/instr/instr_surf.c @@ -6,6 +6,7 @@ #include "instr/instr_private.h" #include "surf/surf_private.h" +#include "surf/network_gtnets_private.h" #ifdef HAVE_TRACING @@ -53,22 +54,18 @@ void TRACE_surf_link_set_latency(double date, const char *resource, double laten } /* to trace gtnets */ -void TRACE_surf_gtnets_communicate(void *action, int src, int dst) +void TRACE_surf_gtnets_communicate(void *action, const char *src, const char *dst) { -} - -int TRACE_surf_gtnets_get_src(void *action) -{ - return -1; -} - -int TRACE_surf_gtnets_get_dst(void *action) -{ - return -1; + surf_action_network_GTNETS_t gtnets_action = (surf_action_network_GTNETS_t)action; + gtnets_action->src_name = xbt_strdup (src); + gtnets_action->dst_name = xbt_strdup (dst); } void TRACE_surf_gtnets_destroy(void *action) { + surf_action_network_GTNETS_t gtnets_action = (surf_action_network_GTNETS_t)action; + xbt_free (gtnets_action->src_name); + xbt_free (gtnets_action->dst_name); } void TRACE_surf_action(surf_action_t surf_action, const char *category) diff --git a/src/surf/network_gtnets.c b/src/surf/network_gtnets.c index efd9ad8230..798320bab7 100644 --- a/src/surf/network_gtnets.c +++ b/src/surf/network_gtnets.c @@ -271,18 +271,17 @@ static void update_actions_state(double now, double delta) trace_sent = action->generic_action.cost; } // tracing resource utilization -// COMMENTED BY DAVID -// int src = TRACE_surf_gtnets_get_src (action); -// int dst = TRACE_surf_gtnets_get_dst (action); -// if (src != -1 && dst != -1){ -// xbt_dynar_t route = used_routing->get_route(src, dst); -// network_link_GTNETS_t link; -// unsigned int i; -// xbt_dynar_foreach(route, i, link) { -// TRACE_surf_link_set_utilization (link->generic_resource.name, -// action->generic_action.data, trace_sent/delta, now-delta, delta); -// } -// } + xbt_dynar_t route = global_routing->get_route(action->src_name, action->dst_name); + network_link_GTNETS_t link; + unsigned int i; + xbt_dynar_foreach(route, i, link) { + TRACE_surf_link_set_utilization (link->generic_resource.name, + action->generic_action.data, + (surf_action_t) action, + trace_sent/delta, + now-delta, + delta); + } #endif XBT_DEBUG("Sent value returned by GTNetS : %f", sent); @@ -356,7 +355,7 @@ static surf_action_t communicate(const char *src_name, xbt_die("Not route between host %s and host %s", src_name, dst_name); } #ifdef HAVE_TRACING - TRACE_surf_gtnets_communicate(action, src, dst); + TRACE_surf_gtnets_communicate(action, src_name, dst_name); #endif return (surf_action_t) action; @@ -380,6 +379,13 @@ static int action_is_suspended(surf_action_t action) return 0; } +#ifdef HAVE_TRACING +static void gtnets_action_set_category(surf_action_t action, const char *category) +{ + action->category = xbt_strdup (category); +} +#endif + static void finalize(void) { gtnets_finalize(); @@ -407,6 +413,9 @@ static void surf_network_model_init_internal(void) surf_network_model->suspend = action_suspend; surf_network_model->resume = action_resume; surf_network_model->is_suspended = action_is_suspended; +#ifdef HAVE_TRACING + surf_network_model->set_category = gtnets_action_set_category; +#endif surf_network_model->extension.network.communicate = communicate; diff --git a/src/surf/network_gtnets_private.h b/src/surf/network_gtnets_private.h index b6acca57e7..0b42195c24 100644 --- a/src/surf/network_gtnets_private.h +++ b/src/surf/network_gtnets_private.h @@ -26,6 +26,10 @@ typedef struct surf_action_network_GTNETS { lmm_variable_t variable; double rate; int suspended; +#ifdef HAVE_TRACING + char *src_name; + char *dst_name; +#endif //HAVE_TRACING } s_surf_action_network_GTNETS_t, *surf_action_network_GTNETS_t; xbt_dict_t network_card_ids; diff --git a/src/xbt/graph.c b/src/xbt/graph.c index 7dc01d15c9..e3ce876fd2 100644 --- a/src/xbt/graph.c +++ b/src/xbt/graph.c @@ -14,6 +14,7 @@ #include "xbt/graphxml_parse.h" #include "xbt/dict.h" #include "xbt/heap.h" +#include "xbt/str.h" @@ -725,3 +726,101 @@ void xbt_graph_export_graphxml(xbt_graph_t g, const char *filename, fprintf(file, "\n"); fclose(file); } + +/** @brief Load a graph from a file (in the SimGrid Graph format) */ +xbt_graph_t xbt_graph_load (const char *filename) +{ + FILE *file = NULL; + file = fopen (filename, "r"); + xbt_assert(file, "Failed to open %s \n", filename); + + xbt_dict_t nodes_dict = xbt_dict_new (); + xbt_graph_t ret = xbt_graph_new_graph (0, NULL); + + //read the number of nodes + size_t size; + char *nnodes_str = NULL; + getline (&nnodes_str, &size, file); + int i, nnodes = atoi (nnodes_str); + free (nnodes_str); + + //read all nodes + for (i = 0; i < nnodes; i++){ + char *node_str = NULL; + getline (&node_str, &size, file); + xbt_node_t n; + char *name = xbt_strdup (node_str); + xbt_str_subst (name, '\n', '\0', 0); + n = xbt_graph_new_node (ret, name); + xbt_dict_set (nodes_dict, name, n, NULL); + free (node_str); + } + + //read the number of edges + char *nedges_str = NULL; + getline (&nedges_str, &size, file); + int nedges = atoi (nedges_str); + free (nedges_str); + + //read all edges + for (i = 0; i < nedges; i++){ + char *edge_str = NULL, edge_id[200], node_source[200], node_target[200]; + getline (&edge_str, &size, file); + sscanf (edge_str, "%s %s %s", edge_id, node_source, node_target); + free (edge_str); + xbt_str_subst (edge_id, '\n', '\0', 0); + xbt_str_subst (node_source, '\n', '\0', 0); + xbt_str_subst (node_target, '\n', '\0', 0); + + xbt_node_t source = xbt_dict_get (nodes_dict, node_source); + xbt_node_t target = xbt_dict_get (nodes_dict, node_target); + xbt_edge_t e; + e = xbt_graph_new_edge (ret, source, target, xbt_strdup(edge_id)); + } + xbt_dict_free (&nodes_dict); + return ret; +} + +/** @brief Save a graph from a file (in the SimGrid Graph format) */ +void xbt_graph_save (xbt_graph_t span, + const char *filename, + const char *(nname) (xbt_node_t), + const char *(ename) (xbt_edge_t)) +{ + FILE *file = NULL; + file = fopen(filename, "w"); + xbt_assert(file, "Failed to open %s \n", filename); + + xbt_dynar_t nodes = xbt_graph_get_nodes (span); + xbt_dynar_t edges = xbt_graph_get_edges (span); + unsigned int cpt; + xbt_node_t node; + fprintf (file, "%ld\n", xbt_dynar_length (nodes)); + xbt_dynar_foreach (nodes, cpt, node) { + if (nname){ + fprintf (file, "%s\n", nname(node)); + }else{ + fprintf (file, "%p\n", node); + } + } + fprintf (file, "%ld\n", xbt_dynar_length (edges)); + xbt_edge_t edge; + xbt_dynar_foreach (edges, cpt, edge) { + xbt_node_t source = xbt_graph_edge_get_source (edge); + xbt_node_t target = xbt_graph_edge_get_target (edge); + if (ename){ + if (nname){ + fprintf (file, "%s %s %s\n", ename(edge), nname(source), nname(target)); + }else{ + fprintf (file, "%s %p %p\n", ename(edge), source, target); + } + }else{ + if (nname){ + fprintf (file, "%p %s %s\n", edge, nname(source), nname(target)); + }else{ + fprintf (file, "%p %p %p\n", edge, source, target); + } + } + } + fclose (file); +}