X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/84ccd6fb41f2ffc33e8dad38d2357ecbb2df9038..48eb2f1b9262fc74f527816c348ed2aa6efa9f65:/examples/msg/dht-pastry/dht-pastry.c?ds=sidebyside diff --git a/examples/msg/dht-pastry/dht-pastry.c b/examples/msg/dht-pastry/dht-pastry.c index b288b070be..1c029d2aca 100644 --- a/examples/msg/dht-pastry/dht-pastry.c +++ b/examples/msg/dht-pastry/dht-pastry.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2015. The SimGrid Team. +/* Copyright (c) 2013-2017. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -32,23 +32,25 @@ static int timeout = 50; static int max_simulation_time = 1000; typedef struct s_node { - int id; //128bits generated random(2^128 -1) - int known_id; + unsigned id; // 128bits generated random(2^128 -1) + unsigned known_id; char mailbox[MAILBOX_NAME_SIZE]; // my mailbox name (string representation of the id) - int namespace_set[NAMESPACE_SIZE]; - int neighborhood_set[NEIGHBORHOOD_SIZE]; - int routing_table[LEVELS_COUNT][LEVEL_SIZE]; + unsigned namespace_set[NAMESPACE_SIZE]; + unsigned neighborhood_set[NEIGHBORHOOD_SIZE]; + unsigned routing_table[LEVELS_COUNT][LEVEL_SIZE]; int ready; msg_comm_t comm_receive; // current communication to receive xbt_dynar_t pending_tasks; -} s_node_t, *node_t; +} s_node_t; +typedef s_node_t* node_t; typedef struct s_state { - int id; - int namespace_set[NAMESPACE_SIZE]; - int neighborhood_set[NEIGHBORHOOD_SIZE]; - int routing_table[LEVELS_COUNT][LEVEL_SIZE]; -} s_state_t, *state_t; + unsigned id; + unsigned namespace_set[NAMESPACE_SIZE]; + unsigned neighborhood_set[NEIGHBORHOOD_SIZE]; + unsigned routing_table[LEVELS_COUNT][LEVEL_SIZE]; +} s_state_t; +typedef s_state_t* state_t; /** Types of tasks exchanged between nodes. */ typedef enum { @@ -60,16 +62,16 @@ typedef enum { typedef struct s_task_data { e_task_type_t type; // type of task - int sender_id; // id parameter (used by some types of tasks) - //int request_finger; // finger parameter (used by some types of tasks) - int answer_id; // answer (used by some types of tasks) + unsigned sender_id; // id parameter (used by some types of tasks) + // int request_finger; // finger parameter (used by some types of tasks) + unsigned answer_id; // answer (used by some types of tasks) char answer_to[MAILBOX_NAME_SIZE]; // mailbox to send an answer to (if any) //const char* issuer_host_name; // used for logging int steps; state_t state; -} s_task_data_t, *task_data_t; +} s_task_data_t; +typedef s_task_data_t* task_data_t; -static void get_mailbox(int node_id, char* mailbox); static int domain(unsigned int a, unsigned int level); static int shl(int a, int b); static int closest_in_namespace_set(node_t node, int dest); @@ -188,7 +190,7 @@ static state_t node_get_state(node_t node) { } static void print_node_id(node_t node) { - XBT_INFO(" Id: %i '%08x' ", node->id, node->id); + XBT_INFO(" Id: %u '%08x' ", node->id, node->id); } static void print_node_neighborood_set(node_t node) { @@ -228,15 +230,14 @@ static void handle_task(node_t node, msg_task_t task) { int j; int min; int max; - int d; - int next; + unsigned next; msg_task_t task_sent; task_data_t req_data; task_data_t task_data = (task_data_t) MSG_task_get_data(task); e_task_type_t type = task_data->type; // If the node is not ready keep the task for later if (node->ready != 0 && !(type==TASK_JOIN_LAST_REPLY || type==TASK_JOIN_REPLY)) { - XBT_DEBUG("Task pending %i", type); + XBT_DEBUG("Task pending %u", type); xbt_dynar_push(node->pending_tasks, &task); return; } @@ -244,13 +245,13 @@ static void handle_task(node_t node, msg_task_t task) { /* Try to join the ring */ case TASK_JOIN: next = routing_next(node, task_data->answer_id); - XBT_DEBUG("Join request from %08x forwarding to %08x", task_data->answer_id, next); + XBT_DEBUG("Join request from %08x forwarding to %08x", task_data->answer_id, next); type = TASK_JOIN_LAST_REPLY; req_data = xbt_new0(s_task_data_t,1); req_data->answer_id = task_data->sender_id; req_data->steps = task_data->steps + 1; - + // if next different from current node forward the join if (next!=node->id) { get_mailbox(next, mailbox); @@ -258,12 +259,12 @@ static void handle_task(node_t node, msg_task_t task) { task_data->steps++; task_sent = MSG_task_create(NULL, COMP_SIZE, COMM_SIZE, task_data); if (MSG_task_send_with_timeout(task_sent, mailbox, timeout)== MSG_TIMEOUT) { - XBT_DEBUG("Timeout expired when forwarding join to next %d", next); + XBT_DEBUG("Timeout expired when forwarding join to next %u", next); task_free(task_sent); } type = TASK_JOIN_REPLY; - } - + } + // send back the current node state to the joining node req_data->type = type; req_data->sender_id = node->id; @@ -271,14 +272,14 @@ static void handle_task(node_t node, msg_task_t task) { req_data->state = node_get_state(node); task_sent = MSG_task_create(NULL, COMP_SIZE, COMM_SIZE, req_data); if (MSG_task_send_with_timeout(task_sent, task_data->answer_to, timeout)== MSG_TIMEOUT) { - XBT_DEBUG("Timeout expired when sending back the current node state to the joining node to %d", node->id); + XBT_DEBUG("Timeout expired when sending back the current node state to the joining node to %u", node->id); task_free(task_sent); } break; /* Join reply from all the node touched by the join */ case TASK_JOIN_LAST_REPLY: // if last node touched reply, copy its namespace set - // TODO: it works only if the two nodes are side to side (is it really the case ?) + // TODO: it works only if the two nodes are side to side (is it really the case ?) j = (task_data->sender_id < node->id) ? -1 : 0; for (i=0; inamespace_set[i] = task_data->state->namespace_set[i-j]; @@ -301,16 +302,16 @@ static void handle_task(node_t node, msg_task_t task) { min = (node->id==task_data->answer_id) ? 0 : shl(node->id, task_data->answer_id); max = shl(node->id, task_data->sender_id)+1; for (i=min;iid, i); + int d = domain(node->id, i); for (j=0; jrouting_table[i][j] = task_data->state->routing_table[i][j]; - } + } node->ready--; // if the node is ready, do all the pending tasks and send update to known nodes if (node->ready==0) { - XBT_DEBUG("Node %i is ready!!!", node->id); + XBT_DEBUG("Node %u is ready!!!", node->id); while(xbt_dynar_length(node->pending_tasks)){ msg_task_t task; xbt_dynar_shift(node->pending_tasks, &task); @@ -341,16 +342,16 @@ static void handle_task(node_t node, msg_task_t task) { break; /* Received an update of state */ case TASK_UPDATE: - XBT_DEBUG("Task update %i !!!", node->id); + XBT_DEBUG("Task update %u !!!", node->id); /* Update namespace ses */ - XBT_INFO("Task update from %i !!!", task_data->sender_id); + XBT_INFO("Task update from %u !!!", task_data->sender_id); XBT_INFO("Node:"); print_node_id(node); print_node_namespace_set(node); int curr_namespace_set[NAMESPACE_SIZE]; int task_namespace_set[NAMESPACE_SIZE+1]; - + // Copy the current namespace and the task state namespace with state->id in the middle i=0; for (; istate->id; for (; inamespace_set[i]; + curr_namespace_set[i] = node->namespace_set[i]; task_namespace_set[i+1] = task_data->state->namespace_set[i]; } @@ -399,19 +400,21 @@ static void handle_task(node_t node, msg_task_t task) { if (min<0 || max>=NAMESPACE_SIZE) { node->namespace_set[i] = curr_namespace_set[j]; j++; - } else if (curr_namespace_set[j] == -1) { - node->namespace_set[i] = task_namespace_set[max]; - max++; - } else if (curr_namespace_set[j] == task_namespace_set[max]) { - node->namespace_set[i] = curr_namespace_set[j]; - j++; - max++; - } else if (curr_namespace_set[j] < task_namespace_set[max]) { - node->namespace_set[i] = curr_namespace_set[j]; - j++; - } else { - node->namespace_set[i] = task_namespace_set[max]; - max++; + } else if (max >= 0){ + if (curr_namespace_set[j] == -1) { + node->namespace_set[i] = task_namespace_set[max]; + max++; + } else if (curr_namespace_set[j] == task_namespace_set[max]) { + node->namespace_set[i] = curr_namespace_set[j]; + j++; + max++; + } else if (curr_namespace_set[j] < task_namespace_set[max]) { + node->namespace_set[i] = curr_namespace_set[j]; + j++; + } else { + node->namespace_set[i] = task_namespace_set[max]; + max++; + } } } @@ -444,7 +447,7 @@ static int join(node_t node){ msg_task_t task_sent = MSG_task_create(NULL, COMP_SIZE, COMM_SIZE, req_data); XBT_DEBUG("Trying to join Pastry ring... (with node %s)", mailbox); if (MSG_task_send_with_timeout(task_sent, mailbox, timeout)== MSG_TIMEOUT) { - XBT_DEBUG("Timeout expired when joining ring with node %d", node->known_id); + XBT_DEBUG("Timeout expired when joining ring with node %u", node->known_id); task_free(task_sent); } @@ -462,8 +465,8 @@ static int join(node_t node){ static int node(int argc, char *argv[]) { double init_time = MSG_get_clock(); - msg_task_t task_received = NULL; - int join_success = 0; + msg_task_t task_received = NULL; + int join_success = 0; double deadline; xbt_assert(argc == 3 || argc == 5, "Wrong number of arguments for this node"); s_node_t node = {0}; @@ -553,9 +556,9 @@ static int node(int argc, char *argv[]) int main(int argc, char *argv[]) { MSG_init(&argc, argv); - xbt_assert(argc > 2, + xbt_assert(argc > 2, "Usage: %s [-nb_bits=n] [-timeout=t] platform_file deployment_file\n" - "\tExample: %s ../msg_platform.xml pastry10.xml\n", + "\tExample: %s ../msg_platform.xml pastry10.xml\n", argv[0], argv[0]); char **options = &argv[1];