X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/caffead47df585ba6594a74ffa3724691ed0e35c..ebf7be2320c9239e70924752b5d9833224113ab4:/examples/msg/chord/chord.c diff --git a/examples/msg/chord/chord.c b/examples/msg/chord/chord.c index e916d85a9f..d9f9995584 100644 --- a/examples/msg/chord/chord.c +++ b/examples/msg/chord/chord.c @@ -9,11 +9,19 @@ #include "msg/msg.h" #include "xbt/log.h" #include "xbt/asserts.h" -#include "mc/modelchecker.h" -#include "mc/mc.h" -#include "xbt/xbt_os_time.h" +#include "simgrid/modelchecker.h" -XBT_LOG_NEW_DEFAULT_CATEGORY(msg_chord, +/** @addtogroup MSG_examples + * + * - chord/chord.c: Classical Chord P2P protocol + * This example implements the well known Chord P2P protocol. Its + * main advantage is that it constitute a fully working non-trivial + * example. In addition, its implementation is rather efficient, as + * demonstrated in http://hal.inria.fr/inria-00602216/ + */ + + + XBT_LOG_NEW_DEFAULT_CATEGORY(msg_chord, "Messages specific for this msg example"); #define COMM_SIZE 10 @@ -34,7 +42,7 @@ extern long int smx_total_comms; /** * Finger element. */ -typedef struct finger { +typedef struct s_finger { int id; char mailbox[MAILBOX_NAME_SIZE]; // string representation of the id } s_finger_t, *finger_t; @@ -42,7 +50,7 @@ typedef struct finger { /** * Node data. */ -typedef struct node { +typedef struct s_node { int id; // my id char mailbox[MAILBOX_NAME_SIZE]; // my mailbox name (string representation of the id) s_finger_t *fingers; // finger table, of size nb_bits (fingers[0] is my successor) @@ -69,7 +77,7 @@ typedef enum { /** * Data attached with the tasks sent and received */ -typedef struct task_data { +typedef struct s_task_data { e_task_type_t type; // type of task int request_id; // id paramater (used by some types of tasks) int request_finger; // finger parameter (used by some types of tasks) @@ -145,7 +153,7 @@ static int normalize(int id) } /** - * \brief Returns whether a id belongs to the interval [start, end]. + * \brief Returns whether an id belongs to the interval [start, end]. * * The parameters are noramlized to make sure they are between 0 and nb_keys - 1). * 1 belongs to [62, 3] @@ -315,8 +323,8 @@ int node(int argc, char *argv[]) if (join_success) { while (MSG_get_clock() < init_time + deadline -// && MSG_get_clock() < node.last_change_date + 1000 - && MSG_get_clock() < max_simulation_time) { +// && MSG_get_clock() < node.last_change_date + 1000 + && MSG_get_clock() < max_simulation_time) { if (node.comm_receive == NULL) { task_received = NULL; @@ -339,10 +347,10 @@ int node(int argc, char *argv[]) check_predecessor(&node); next_check_predecessor_date = MSG_get_clock() + periodic_check_predecessor_delay; } - else if (MSG_get_clock() >= next_lookup_date) { - random_lookup(&node); - next_lookup_date = MSG_get_clock() + periodic_lookup_delay; - } + else if (MSG_get_clock() >= next_lookup_date) { + random_lookup(&node); + next_lookup_date = MSG_get_clock() + periodic_lookup_delay; + } else { // nothing to do: sleep for a while MSG_process_sleep(5); @@ -407,7 +415,7 @@ static void handle_task(node_t node, m_task_t task) { task_data->answer_id = node->fingers[0].id; XBT_DEBUG("Sending back a 'Find Successor Answer' to %s (mailbox %s): the successor of %d is %d", task_data->issuer_host_name, - task_data->answer_to, + task_data->answer_to, task_data->request_id, task_data->answer_id); MSG_task_dsend(task, task_data->answer_to, task_free); } @@ -463,7 +471,7 @@ static void handle_task(node_t node, m_task_t task) { case TASK_FIND_SUCCESSOR_ANSWER: case TASK_GET_PREDECESSOR_ANSWER: - XBT_DEBUG("Ignoring unexpected task of type %d (%p)", type, task); + XBT_DEBUG("Ignoring unexpected task of type %d (%p)", (int)type, task); task_free(task); break; } @@ -544,7 +552,7 @@ static void quit_notify(node_t node, int to) if (to == 1) { // notify my successor to_mailbox = node->fingers[0].mailbox; XBT_INFO("Telling my Successor %d about my departure via mailbox %s", - node->fingers[0].id, to_mailbox); + node->fingers[0].id, to_mailbox); req_data->type = TASK_PREDECESSOR_LEAVING; } else if (to == -1) { // notify my predecessor @@ -555,7 +563,7 @@ static void quit_notify(node_t node, int to) to_mailbox = node->pred_mailbox; XBT_INFO("Telling my Predecessor %d about my departure via mailbox %s", - node->pred_id, to_mailbox); + node->pred_id, to_mailbox); req_data->type = TASK_SUCCESSOR_LEAVING; } m_task_t task = MSG_task_create(NULL, COMP_SIZE, COMM_SIZE, req_data); @@ -628,24 +636,24 @@ static int remote_find_successor(node_t node, int ask_to, int id) if (res != MSG_OK) { XBT_DEBUG("Failed to receive the answer to my 'Find Successor' request (task %p): %d", - task_sent, res); + task_sent, (int)res); stop = 1; - MSG_comm_destroy(node->comm_receive); - node->comm_receive = NULL; + MSG_comm_destroy(node->comm_receive); + node->comm_receive = NULL; } else { m_task_t task_received = MSG_comm_get_task(node->comm_receive); XBT_DEBUG("Received a task (%p)", task_received); task_data_t ans_data = MSG_task_get_data(task_received); - if (MC_IS_ENABLED) { - MC_assert(task_received == task_sent); - } + if (MC_IS_ENABLED) { + MC_assert(task_received == task_sent); + } if (task_received != task_sent) { // this is not the expected answer - MSG_comm_destroy(node->comm_receive); - node->comm_receive = NULL; + MSG_comm_destroy(node->comm_receive); + node->comm_receive = NULL; handle_task(node, task_received); } else { @@ -654,8 +662,8 @@ static int remote_find_successor(node_t node, int ask_to, int id) ans_data->request_id, task_received, id, ans_data->answer_id); successor = ans_data->answer_id; stop = 1; - MSG_comm_destroy(node->comm_receive); - node->comm_receive = NULL; + MSG_comm_destroy(node->comm_receive); + node->comm_receive = NULL; task_free(task_received); } } @@ -709,22 +717,22 @@ static int remote_get_predecessor(node_t node, int ask_to) if (res != MSG_OK) { XBT_DEBUG("Failed to receive the answer to my 'Get Predecessor' request (task %p): %d", - task_sent, res); + task_sent, (int)res); stop = 1; - MSG_comm_destroy(node->comm_receive); - node->comm_receive = NULL; + MSG_comm_destroy(node->comm_receive); + node->comm_receive = NULL; } else { m_task_t task_received = MSG_comm_get_task(node->comm_receive); task_data_t ans_data = MSG_task_get_data(task_received); - if (MC_IS_ENABLED) { - MC_assert(task_received == task_sent); - } + if (MC_IS_ENABLED) { + MC_assert(task_received == task_sent); + } if (task_received != task_sent) { - MSG_comm_destroy(node->comm_receive); - node->comm_receive = NULL; + MSG_comm_destroy(node->comm_receive); + node->comm_receive = NULL; handle_task(node, task_received); } else { @@ -732,8 +740,8 @@ static int remote_get_predecessor(node_t node, int ask_to) task_received, ask_to, ans_data->answer_id); predecessor_id = ans_data->answer_id; stop = 1; - MSG_comm_destroy(node->comm_receive); - node->comm_receive = NULL; + MSG_comm_destroy(node->comm_receive); + node->comm_receive = NULL; task_free(task_received); } } @@ -876,14 +884,13 @@ static void random_lookup(node_t node) */ int main(int argc, char *argv[]) { + MSG_global_init(&argc, argv); if (argc < 3) { printf("Usage: %s [-nb_bits=n] [-timeout=t] platform_file deployment_file\n", argv[0]); printf("example: %s ../msg_platform.xml chord.xml\n", argv[0]); exit(1); } - MSG_global_init(&argc, argv); - char **options = &argv[1]; while (!strncmp(options[0], "-", 1)) { @@ -896,11 +903,11 @@ int main(int argc, char *argv[]) length = strlen("-timeout="); if (!strncmp(options[0], "-timeout=", length) && strlen(options[0]) > length) { - timeout = atoi(options[0] + length); - XBT_DEBUG("Set timeout to %d", timeout); + timeout = atoi(options[0] + length); + XBT_DEBUG("Set timeout to %d", timeout); } else { - xbt_die("Invalid chord option '%s'", options[0]); + xbt_die("Invalid chord option '%s'", options[0]); } } options++; @@ -911,7 +918,6 @@ int main(int argc, char *argv[]) chord_initialize(); - MSG_set_channel_number(0); MSG_create_environment(platform_file); MSG_function_register("node", node);