surf_action_t(*communicate) (const char *src_name,
const char *dst_name,
double size, double rate);
- xbt_dynar_t(*get_route) (const char *src_name, const char *dst_name);
+ xbt_dynar_t(*get_route) (const char *src_name, const char *dst_name); //FIXME: kill field? That is done by the routing nowadays
double (*get_link_bandwidth) (const void *link);
double (*get_link_latency) (const void *link);
int (*link_shared) (const void *link);
surf_action_t(*communicate) (void *workstation_src, /**< Execute a communication amount between two workstations */
void *workstation_dst, double size,
double max_rate);
+ // FIXME: kill next field, which duplicates the routing
xbt_dynar_t(*get_route) (void *workstation_src, void *workstation_dst); /**< Get the list of links between two ws */
surf_action_t(*execute_parallel_task) (int workstation_nb, /**< Execute a parallel task on several workstations */
double value,
InstrUserVariable what)
{
- xbt_dynar_t route;
- routing_get_route_and_latency (src, dst, &route,NULL,1);
+ xbt_dynar_t route=NULL;
+ routing_get_route_and_latency (src, dst, &route,NULL);
unsigned int i;
void *link;
xbt_dynar_foreach (route, i, link) {
xbt_ex_t e;
TRY {
- routing_get_route_and_latency(child1_name, child2_name, &route, NULL, 1);
+ routing_get_route_and_latency(child1_name, child2_name, &route, NULL);
} CATCH(e) {
xbt_ex_free(e);
}
(child2->kind == INSTR_HOST || child2->kind == INSTR_ROUTER) &&
strcmp (child1_name, child2_name) != 0){
- // FIXME factorize route creation once possible
- xbt_dynar_t route;
- routing_get_route_and_latency (child1_name, child2_name,&route,NULL,1);
+ // FIXME factorize route creation with else branch below (once possible)
+ xbt_dynar_t route=NULL;
+ routing_get_route_and_latency (child1_name, child2_name,&route,NULL);
if (TRACE_onelink_only()){
if (xbt_dynar_length (route) > 1) continue;
}
}
#ifdef HAVE_TRACING
if (TRACE_is_enabled()) {
- xbt_dynar_t route;
- routing_get_route_and_latency(action->src_name, action->dst_name,&route,NULL,1);
+ xbt_dynar_t route=NULL;
+ routing_get_route_and_latency(action->src_name, action->dst_name,&route,NULL);
link_CM02_t link;
unsigned int i;
xbt_dynar_foreach(route, i, link) {
xbt_dynar_t back_route = NULL;
int constraints_per_variable = 0;
- xbt_dynar_t route;
- // I need to have the forward and backward routes at the same time, so I don't ask the routing to cleanup the route right away for me
- routing_get_route_and_latency(src_name, dst_name, &route, &latency, 0);
+ xbt_dynar_t route = xbt_dynar_new(sizeof(void*),NULL);
+ // I need to have the forward and backward routes at the same time, so allocate "route". That way, the routing wont clean it up
+ routing_get_route_and_latency(src_name, dst_name, &route, &latency);
if (sg_network_fullduplex == 1) {
- routing_get_route_and_latency(dst_name, src_name, &back_route,NULL,1);
+ // FIXME: fill route directly
+ routing_get_route_and_latency(dst_name, src_name, &back_route,NULL);
}
/* LARGE PLATFORMS HACK:
static xbt_dynar_t net_get_route(const char *src, const char *dst)
{
- xbt_dynar_t route;
- routing_get_route_and_latency(src, dst,&route, NULL,1);
+ xbt_dynar_t route=NULL;
+ routing_get_route_and_latency(src, dst,&route, NULL);
return route;
}
xbt_dynar_t back_route = NULL;
int constraints_per_variable = 0;
- // I will need this route for some time so let's call get_route with 0 as last argument to preserve it
- xbt_dynar_t route;
- routing_get_route_and_latency(src_name, dst_name,&route,NULL,0);
+ // I need to have the forward and backward routes at the same time, so allocate "route". That way, the routing wont clean it up
+ xbt_dynar_t route=xbt_dynar_new(global_routing->size_of_link,NULL);
+ routing_get_route_and_latency(src_name, dst_name,&route,NULL);
if (sg_network_fullduplex == 1) {
- routing_get_route_and_latency(dst_name, src_name, &back_route, NULL,1);
+ routing_get_route_and_latency(dst_name, src_name, &back_route, NULL);
}
/* LARGE PLATFORMS HACK:
static xbt_dynar_t im_net_get_route(const char *src, const char *dst)
{
- xbt_dynar_t route;
- routing_get_route_and_latency(src, dst,&route,NULL,1);
+ xbt_dynar_t route=NULL;
+ routing_get_route_and_latency(src, dst,&route,NULL);
return route;
}
XBT_PUBLIC(void) routing_exit(void);
XBT_PUBLIC(void) routing_register_callbacks(void);
XBT_PUBLIC(void) generic_free_route(route_t route); // FIXME rename to routing_route_free
+ // FIXME: make previous function private to routing again?
-XBT_PUBLIC(void) routing_get_route_and_latency(const char *src, const char *dst, //FIXME too much functions avail?
- xbt_dynar_t * route, double *latency, int cleanup);
+XBT_PUBLIC(void) routing_get_route_and_latency(const char *src, const char *dst,
+ xbt_dynar_t * route, double *latency);
/**
* Resource protected methods
*
* \param src the source host name
* \param dst the destination host name
- * \param *e_route the route where the links are stored
+ * \param *route the route where the links are stored.
* \param *latency the latency, if needed
*
* This function is called by "get_route" and "get_latency". It allows to walk
*
* \param src the source host name
* \param dst the destination host name
- * \param route where to store the list of links (or NULL if you are not interested in it)
+ * \param route where to store the list of links. If route=NULL, we don't care about the route.
+ * If *route=NULL, create a short lived dynar. Else, fill the provided dynar
* \param latency where to store the latency experienced on the path (or NULL if not interested)
- * \param cleanup boolean whether the dynar should be automatically destroyed or not
*
* walk through the routing components tree and find a route between hosts
* by calling the differents "get_route" functions in each routing component.
*/
void routing_get_route_and_latency(const char *src, const char *dst,
- xbt_dynar_t * route, double *latency, int cleanup)
+ xbt_dynar_t * route, double *latency)
{
static xbt_dynar_t last_route = NULL;
+ int need_cleanup = route && !(*route);
+
+ if (need_cleanup) {
+ xbt_dynar_free(&last_route);
+ last_route = *route = xbt_dynar_new(global_routing->size_of_link,NULL);
+ }
_get_route_and_latency(src, dst, route, latency);
+
xbt_assert(!route || *route, "no route between \"%s\" and \"%s\"", src, dst);
xbt_assert(!latency || *latency >= 0.0,
- "latency error on route between \"%s\" and \"%s\"", src, dst);
- if (route) {
- xbt_dynar_free(&last_route);
- last_route = cleanup ? *route : NULL;
- }
+ "negative latency on route between \"%s\" and \"%s\"", src, dst);
}
static xbt_dynar_t recursive_get_onelink_routes(AS_t rc)
if (asg->hierarchy == SURF_ROUTING_RECURSIVE && v != dst_node_id
&& strcmp(gw_dst, prev_gw_src)) {
- xbt_dynar_t e_route_as_to_as;
- routing_get_route_and_latency(gw_dst, prev_gw_src,&e_route_as_to_as,NULL,1);
+ xbt_dynar_t e_route_as_to_as=NULL;
+ routing_get_route_and_latency(gw_dst, prev_gw_src,&e_route_as_to_as,NULL);
xbt_assert(e_route_as_to_as, "no route between \"%s\" and \"%s\"",
gw_dst, prev_gw_src);
links = e_route_as_to_as;
if (asg->hierarchy == SURF_ROUTING_RECURSIVE && !first
&& strcmp(gw_dst, prev_gw_src)) {
- xbt_dynar_t e_route_as_to_as;
- routing_get_route_and_latency(gw_dst, prev_gw_src,&e_route_as_to_as,NULL,1);
+ xbt_dynar_t e_route_as_to_as=NULL;
+ routing_get_route_and_latency(gw_dst, prev_gw_src,&e_route_as_to_as,NULL);
xbt_assert(e_route_as_to_as, "no route between \"%s\" and \"%s\"",
gw_dst, prev_gw_src);
links = e_route_as_to_as;
for (i = 0; i < workstation_nb; i++) {
for (j = 0; j < workstation_nb; j++) {
- xbt_dynar_t route;
+ xbt_dynar_t route=NULL;
routing_get_route_and_latency(surf_resource_name
(action->workstation_list[i]),
surf_resource_name(action->workstation_list[j]),
- &route, NULL,1);
+ &route, NULL);
// FIXME do we really need to recompute the latency here?
double lat = 0.0;
for (i = 0; i < workstation_nb; i++) {
for (j = 0; j < workstation_nb; j++) {
link_L07_t link;
- xbt_dynar_t route;
+ xbt_dynar_t route=NULL;
routing_get_route_and_latency(
surf_resource_name(workstation_list[i]),
surf_resource_name(workstation_list[j]),
- &route,NULL,1); // FIXME: do we want to recompute the latency?
+ &route,NULL); // FIXME: do we want to recompute the latency?
double lat = 0.0;
if (communication_amount[i * workstation_nb + j] > 0)
for (i = 0; i < workstation_nb; i++) {
for (j = 0; j < workstation_nb; j++) {
link_L07_t link;
- xbt_dynar_t route;
+ xbt_dynar_t route=NULL;
routing_get_route_and_latency(
surf_resource_name(workstation_list[i]),
surf_resource_name(workstation_list[j]),
- &route,NULL,1);
+ &route,NULL);
if (communication_amount[i * workstation_nb + j] == 0.0)
continue;
static xbt_dynar_t ptask_get_route(void *src, void *dst) // FIXME: kill that callback kind?
{
- xbt_dynar_t route;
+ xbt_dynar_t route=NULL;
routing_get_route_and_latency(
surf_resource_name(src), surf_resource_name(dst),
- &route,NULL,1);
+ &route,NULL);
return route;
}
printf(" <route src=\"%s\" dst=\"%s\">\n "
,src
,dst);
- xbt_dynar_t route;
- routing_get_route_and_latency(src,dst,&route,NULL,1);
+ xbt_dynar_t route=NULL;
+ routing_get_route_and_latency(src,dst,&route,NULL);
for(i=0;i<xbt_dynar_length(route) ;i++)
{
void *link = xbt_dynar_get_as(route,i,void *);
printf(" <route src=\"%s\" dst=\"%s\">\n "
,src
,dst);
- xbt_dynar_t route;
- routing_get_route_and_latency(src,dst,&route,NULL,1);
+ xbt_dynar_t route=NULL;
+ routing_get_route_and_latency(src,dst,&route,NULL);
for(i=0;i<xbt_dynar_length(route) ;i++)
{
void *link = xbt_dynar_get_as(route,i,void *);
printf(" <route src=\"%s\" dst=\"%s\">\n "
,src
,dst);
- xbt_dynar_t route;
- routing_get_route_and_latency(src,dst,&route,NULL,1);
+ xbt_dynar_t route=NULL;
+ routing_get_route_and_latency(src,dst,&route,NULL);
for(i=0;i<xbt_dynar_length(route) ;i++)
{
void *link = xbt_dynar_get_as(route,i,void *);
{
printf(" <route src=\"%s\" dst=\"%s\">\n "
,src, dst);
- xbt_dynar_t route;
- routing_get_route_and_latency(src,dst,&route, NULL,1);
+ xbt_dynar_t route=NULL;
+ routing_get_route_and_latency(src,dst,&route, NULL);
for(i=0;i<xbt_dynar_length(route) ;i++)
{
void *link = xbt_dynar_get_as(route,i,void *);