#include "network_private.h"
#include "xbt/log.h"
+#include "xbt/str.h"
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_network, surf,
"Logging specific to the SURF network module");
{
src_id = network_card_new(A_surfxml_route_src);
dst_id = network_card_new(A_surfxml_route_dst);
-
+ route_action = A_surfxml_route_action;
route_link_list = xbt_dynar_new(sizeof(char *), &free_string);
}
{
char *name;
if (src_id != -1 && dst_id != -1) {
- name = bprintf("%d##%d",src_id, dst_id);
- xbt_dict_set(route_table, name, route_link_list, NULL);
+ name = bprintf("%x#%x",src_id, dst_id);
+ manage_route(route_table, name, route_action, 0);
free(name);
}
}
-static void add_loopback()
+static void add_loopback(void)
{
int i;
/* Adding loopback if needed */
}
}
-static void add_route()
+static void add_route(void)
{
xbt_ex_t e;
int nb_link = 0;
- int cpt = 0;
+ unsigned int cpt = 0;
int link_list_capacity = 0;
link_CM02_t *link_list = NULL;
+ xbt_dict_cursor_t cursor = NULL;
+ char *key,*data, *end;
+ const char *sep = "#";
+ xbt_dynar_t links, keys;
if (routing_table == NULL) create_routing_table();
- link_list_capacity = xbt_dynar_length(links);
- link_list = xbt_new(link_CM02_t, link_list_capacity);
+ xbt_dict_foreach(route_table, cursor, key, data) {
+ char* link = NULL;
+ nb_link = 0;
+ links = (xbt_dynar_t)data;
+ keys = xbt_str_split_str(key, sep);
+
+ link_list_capacity = xbt_dynar_length(links);
+ link_list = xbt_new(link_CM02_t, link_list_capacity);
- src_id = atoi(xbt_dynar_get_as(keys, 0, char*));
- dst_id = atoi(xbt_dynar_get_as(keys, 1, char*));
+ src_id = strtol(xbt_dynar_get_as(keys, 0, char*), &end, 16);
+ dst_id = strtol(xbt_dynar_get_as(keys, 1, char*), &end, 16);
- char* link = NULL;
- xbt_dynar_foreach (links, cpt, link) {
+ xbt_dynar_foreach (links, cpt, link) {
TRY {
link_list[nb_link++] = xbt_dict_get(link_set, link);
}
CATCH(e) {
RETHROW1("Link %s not found (dict raised this exception: %s)", link);
}
- }
- route_new(src_id, dst_id, link_list, nb_link);
+ }
+ route_new(src_id, dst_id, link_list, nb_link);
+ }
+
+ xbt_dict_free(&route_table);
}
host_number++;
}
+
+static void add_traces(void) {
+ xbt_dict_cursor_t cursor=NULL;
+ char *trace_name,*elm;
+
+ static int called = 0;
+ if (called) return;
+ called = 1;
+
+ /* connect all traces relative to network */
+ xbt_dict_foreach(trace_connect_list_link_avail, cursor, trace_name, elm) {
+ tmgr_trace_t trace = xbt_dict_get_or_null(traces_set_list, trace_name);
+ link_CM02_t link = xbt_dict_get_or_null(link_set, elm);
+
+ xbt_assert1(link, "Link %s undefined", elm);
+ xbt_assert1(trace, "Trace %s undefined", trace_name);
+
+ link->state_event = tmgr_history_add_trace(history, trace, 0.0, 0, link);
+ }
+
+ xbt_dict_foreach(trace_connect_list_bandwidth, cursor, trace_name, elm) {
+ tmgr_trace_t trace = xbt_dict_get_or_null(traces_set_list, trace_name);
+ link_CM02_t link = xbt_dict_get_or_null(link_set, elm);
+
+ xbt_assert1(link, "Link %s undefined", elm);
+ xbt_assert1(trace, "Trace %s undefined", trace_name);
+
+ link->bw_event = tmgr_history_add_trace(history, trace, 0.0, 0, link);
+ }
+
+ xbt_dict_foreach(trace_connect_list_latency, cursor, trace_name, elm) {
+ tmgr_trace_t trace = xbt_dict_get_or_null(traces_set_list, trace_name);
+ link_CM02_t link = xbt_dict_get_or_null(link_set, elm);
+
+ xbt_assert1(link, "Link %s undefined", elm);
+ xbt_assert1(trace, "Trace %s undefined", trace_name);
+
+ link->lat_event = tmgr_history_add_trace(history, trace, 0.0, 0, link);
+ }
+
+ xbt_dict_free(&trace_connect_list_host_avail);
+ xbt_dict_free(&trace_connect_list_power);
+ xbt_dict_free(&trace_connect_list_link_avail);
+ xbt_dict_free(&trace_connect_list_bandwidth);
+ xbt_dict_free(&trace_connect_list_latency);
+
+ xbt_dict_free(&traces_set_list);
+}
+
static void define_callbacks(const char *file)
{
/* Figuring out the network links */
surfxml_add_callback(STag_surfxml_route_cb_list, &parse_route_set_endpoints);
surfxml_add_callback(ETag_surfxml_link_c_ctn_cb_list, &parse_route_elem);
surfxml_add_callback(ETag_surfxml_route_cb_list, &parse_route_set_route);
- surfxml_add_callback(STag_surfxml_platform_cb_list, &init_route_table);
+ surfxml_add_callback(STag_surfxml_platform_cb_list, &init_data);
+ surfxml_add_callback(ETag_surfxml_platform_cb_list, &add_traces);
surfxml_add_callback(ETag_surfxml_platform_cb_list, &add_route);
surfxml_add_callback(ETag_surfxml_platform_cb_list, &add_loopback);
+ surfxml_add_callback(STag_surfxml_set_cb_list, &parse_sets);
+ surfxml_add_callback(STag_surfxml_route_c_multi_cb_list, &parse_route_multi_set_endpoints);
+ surfxml_add_callback(ETag_surfxml_route_c_multi_cb_list, &parse_route_multi_set_route);
+ surfxml_add_callback(STag_surfxml_foreach_cb_list, &parse_foreach);
+ surfxml_add_callback(STag_surfxml_cluster_cb_list, &parse_cluster);
+ surfxml_add_callback(STag_surfxml_trace_cb_list, &parse_trace_init);
+ surfxml_add_callback(ETag_surfxml_trace_cb_list, &parse_trace_finalize);
+ surfxml_add_callback(STag_surfxml_trace_c_connect_cb_list, &parse_trace_c_connect);
}
static void *name_service(const char *name)
if (action->generic_action.max_duration != NO_MAX_DURATION)
double_update(&(action->generic_action.max_duration), delta);
- /* if(action->generic_action.remains<.00001) action->generic_action.remains=0; */
-
if ((action->generic_action.remains <= 0) &&
(lmm_get_variable_weight(action->variable) > 0)) {
action->generic_action.finish = surf_get_clock();
static void update_resource_state(void *id,
tmgr_trace_event_t event_type,
- double value)
+ double value, double date)
{
link_CM02_t nw_link = id;
/* printf("[" "%lg" "] Asking to update network card \"%s\" with value " */
} else if (event_type == nw_link->lat_event) {
double delta = value - nw_link->lat_current;
lmm_variable_t var = NULL;
+ lmm_element_t elem = NULL;
surf_action_network_CM02_t action = NULL;
nw_link->lat_current = value;
- while (lmm_get_var_from_cnst
- (network_maxmin_system, nw_link->constraint, &var)) {
+ while ((var= lmm_get_var_from_cnst
+ (network_maxmin_system, nw_link->constraint, &elem))) {
action = lmm_variable_id(var);
action->lat_current += delta;
if (action->rate < 0)
double rate)
{
surf_action_network_CM02_t action = NULL;
+ /* LARGE PLATFORMS HACK:
+ Add a link_CM02_t *link and a int link_nb to network_card_CM02_t. It will represent local links for this node
+ Use the cluster_id for ->id */
network_card_CM02_t card_src = src;
network_card_CM02_t card_dst = dst;
int route_size = ROUTE_SIZE(card_src->id, card_dst->id);
link_CM02_t *route = ROUTE(card_src->id, card_dst->id);
+ /* LARGE PLATFORMS HACK:
+ total_route_size = route_size + src->link_nb + dst->nb */
int i;
XBT_IN4("(%s,%s,%g,%g)", card_src->name, card_dst->name, size, rate);
+ /* LARGE PLATFORMS HACK:
+ assert on total_route_size */
xbt_assert2(route_size,
"You're trying to send data from %s to %s but there is no connexion between these two cards.",
card_src->name, card_dst->name);
action->latency = 0.0;
for (i = 0; i < route_size; i++)
action->latency += route[i]->lat_current;
+ /* LARGE PLATFORMS HACK:
+ Add src->link and dst->link latencies */
action->lat_current = action->latency;
+ /* LARGE PLATFORMS HACK:
+ lmm_variable_new(..., total_route_size)*/
if (action->latency > 0)
action->variable =
lmm_variable_new(network_maxmin_system, action, 0.0, -1.0,
for (i = 0; i < route_size; i++)
lmm_expand(network_maxmin_system, route[i]->constraint,
action->variable, 1.0);
+ /* LARGE PLATFORMS HACK:
+ expand also with src->link and dst->link */
+
XBT_OUT;
return (surf_action_t) action;