ActionPtr NetworkCm02Model::communicate(RoutingEdgePtr src, RoutingEdgePtr dst, double size, double rate) { unsigned int i; void *_link; NetworkCm02LinkPtr link; int failed = 0; NetworkCm02ActionPtr action = NULL; double bandwidth_bound; double latency = 0.0; xbt_dynar_t back_route = NULL; int constraints_per_variable = 0; xbt_dynar_t route = xbt_dynar_new(sizeof(RoutingEdgePtr), NULL); XBT_IN("(%s,%s,%g,%g)", src->getName(), dst->getName(), size, rate); routing_platf->getRouteAndLatency(src, dst, &route, &latency); xbt_assert(!xbt_dynar_is_empty(route) || latency, "You're trying to send data from %s to %s but there is no connection at all between these two hosts.", src->getName(), dst->getName()); xbt_dynar_foreach(route, i, _link) { link = static_cast<NetworkCm02LinkPtr>(_link); if (link->getState() == SURF_RESOURCE_OFF) { failed = 1; break; } }
ActionPtr NetworkConstantModel::communicate(RoutingEdgePtr src, RoutingEdgePtr dst, double size, double rate) { char *src_name = src->getName(); char *dst_name = dst->getName(); XBT_IN("(%s,%s,%g,%g)", src_name, dst_name, size, rate); NetworkConstantActionPtr action = new NetworkConstantAction(this, size, sg_latency_factor); XBT_OUT(); surf_callback_emit(networkCommunicateCallbacks, action, src, dst, size, rate); return action; }
void AsFloyd::getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst, sg_platf_route_cbarg_t res, double *lat) { /* set utils vars */ size_t table_size = xbt_dynar_length(p_indexNetworkElm); this->srcDstCheck(src, dst); /* create a result route */ xbt_dynar_t route_stack = xbt_dynar_new(sizeof(sg_platf_route_cbarg_t), NULL); int pred; int cur = dst->getId(); do { pred = TO_FLOYD_PRED(src->getId(), cur); if (pred == -1) THROWF(arg_error, 0, "No route from '%s' to '%s'", src->getName(), dst->getName()); xbt_dynar_push_as(route_stack, sg_platf_route_cbarg_t, TO_FLOYD_LINK(pred, cur)); cur = pred; } while (cur != src->getId()); if (p_hierarchy == SURF_ROUTING_RECURSIVE) { res->gw_src = xbt_dynar_getlast_as(route_stack, sg_platf_route_cbarg_t)->gw_src; res->gw_dst = xbt_dynar_getfirst_as(route_stack, sg_platf_route_cbarg_t)->gw_dst; } sg_routing_edge_t prev_dst_gw = NULL; while (!xbt_dynar_is_empty(route_stack)) { sg_platf_route_cbarg_t e_route = xbt_dynar_pop_as(route_stack, sg_platf_route_cbarg_t); xbt_dynar_t links; void *link; unsigned int cpt; if (p_hierarchy == SURF_ROUTING_RECURSIVE && prev_dst_gw != NULL && strcmp(prev_dst_gw->getName(), e_route->gw_src->getName())) { routing_get_route_and_latency(prev_dst_gw, e_route->gw_src, &res->link_list, lat); } links = e_route->link_list; xbt_dynar_foreach(links, cpt, link) { xbt_dynar_push_as(res->link_list, sg_routing_link_t, link); if (lat) *lat += static_cast<NetworkLinkPtr>(link)->getLatency(); } prev_dst_gw = e_route->gw_dst; }
static void IB_action_init_callback(NetworkActionPtr action,RoutingEdgePtr src, RoutingEdgePtr dst, double size, double rate){ if(((NetworkIBModel*)surf_network_model)->active_nodes==NULL) xbt_die("IB comm added, without any node connected !"); IBNode* act_src= (IBNode*) xbt_dict_get_or_null(((NetworkIBModel*)surf_network_model)->active_nodes, src->getName()); if(act_src==NULL) xbt_die("could not find src node active comms !"); //act_src->rate=rate; IBNode* act_dst= (IBNode*) xbt_dict_get_or_null(((NetworkIBModel*)surf_network_model)->active_nodes, dst->getName()); if(act_dst==NULL) xbt_die("could not find dst node active comms !"); // act_dst->rate=rate; ((NetworkIBModel*)surf_network_model)->active_comms[action]=make_pair<IBNode*,IBNode*>(act_src, act_dst); //post the action in the second dist, to retrieve in the other callback XBT_DEBUG("IB callback - action %p init", action); ((NetworkIBModel*)surf_network_model)->updateIBfactors(action, act_src, act_dst, 0); }