X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/d97d6e19cb366fd112e63d56a9f411d968ee8670..cfc676704bebcd57e5ea98bb43154245a150948f:/examples/msg/chord/chord.c diff --git a/examples/msg/chord/chord.c b/examples/msg/chord/chord.c index ff34bf3dfa..800a648bcf 100644 --- a/examples/msg/chord/chord.c +++ b/examples/msg/chord/chord.c @@ -1,29 +1,24 @@ -/* Copyright (c) 2010-2014. The SimGrid Team. +/* Copyright (c) 2010-2015. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ -#include #include "simgrid/msg.h" -#include "xbt/log.h" -#include "xbt/asserts.h" #include "simgrid/modelchecker.h" #include -#include "mc/mc_replay.h" +#include "src/mc/mc_replay.h" // FIXME: this is an internal header /** @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/ + * 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"); +XBT_LOG_NEW_DEFAULT_CATEGORY(msg_chord, "Messages specific for this msg example"); #define COMM_SIZE 10 #define COMP_SIZE 0 @@ -42,17 +37,13 @@ static const double sleep_delay = 4.9999; extern long int smx_total_comms; -/* - * Finger element. - */ +/* Finger element. */ typedef struct s_finger { int id; char mailbox[MAILBOX_NAME_SIZE]; // string representation of the id } s_finger_t, *finger_t; -/* - * Node data. - */ +/* Node data. */ typedef struct s_node { int id; // my id char mailbox[MAILBOX_NAME_SIZE]; // my mailbox name (string representation of the id) @@ -65,9 +56,7 @@ typedef struct s_node { RngStream stream; //RngStream for } s_node_t, *node_t; -/** - * Types of tasks exchanged between nodes. - */ +/* Types of tasks exchanged between nodes. */ typedef enum { TASK_FIND_SUCCESSOR, TASK_FIND_SUCCESSOR_ANSWER, @@ -80,9 +69,7 @@ typedef enum { TASK_PREDECESSOR_ALIVE_ANSWER } e_task_type_t; -/* - * Data attached with the tasks sent and received - */ +/* Data attached with the tasks sent and received */ typedef struct s_task_data { e_task_type_t type; // type of task int request_id; // id paramater (used by some types of tasks) @@ -96,7 +83,6 @@ static int *powers2; static xbt_dynar_t host_list; // utility functions -static void chord_initialize(void); static void chord_exit(void); static int normalize(int id); static int is_in_interval(int id, int start, int end); @@ -126,9 +112,7 @@ static void check_predecessor(node_t node); static void random_lookup(node_t); static void quit_notify(node_t node); -/** - * \brief Global initialization of the Chord simulation. - */ +/* \brief Global initialization of the Chord simulation. */ static void chord_initialize(void) { // compute the powers of 2 once for all @@ -322,9 +306,8 @@ int node(int argc, char *argv[]) // initialize my node s_node_t node = {0}; - node.id = atoi(argv[1]); - node.stream = - (RngStream)MSG_host_get_property_value(MSG_host_self(), "stream"); + node.id = xbt_str_parse_int(argv[1],"Invalid ID: %s"); + node.stream = (RngStream)MSG_host_get_property_value(MSG_host_self(), "stream"); get_mailbox(node.id, node.mailbox); node.next_finger_to_fix = 0; node.fingers = xbt_new0(s_finger_t, nb_bits); @@ -336,14 +319,14 @@ int node(int argc, char *argv[]) } if (argc == 3) { // first ring - deadline = atof(argv[2]); + deadline = xbt_str_parse_double(argv[2],"Invalid deadline: %s"); create(&node); join_success = 1; - } - else { - int known_id = atoi(argv[2]); + + } else { + int known_id = xbt_str_parse_int(argv[2],"Invalid root ID: %s"); //double sleep_time = atof(argv[3]); - deadline = atof(argv[4]); + deadline = xbt_str_parse_double(argv[4],"Invalid deadline: %s"); /* // sleep before starting @@ -714,19 +697,19 @@ static int remote_find_successor(node_t node, int ask_to, int id) XBT_DEBUG("Received a task (%p)", task_received); task_data_t ans_data = MSG_task_get_data(task_received); - // Once upon a time, our code assumed that here, task_received != task_sent all the time - // - // This assumption is wrong (as messages from differing round can interleave), leading to a bug in our code. - // We failed to find this bug directly, as it only occured on large platforms, leading to hardly usable traces. - // Instead, we used the model-checker to track down the issue by adding the following test here in the code: - // if (MC_is_active()) { - // MC_assert(task_received == task_sent); + // Once upon a time, our code assumed that here, task_received != task_sent all the time + // + // This assumption is wrong (as messages from differing round can interleave), leading to a bug in our code. + // We failed to find this bug directly, as it only occured on large platforms, leading to hardly usable traces. + // Instead, we used the model-checker to track down the issue by adding the following test here in the code: + // if (MC_is_active()) { + // MC_assert(task_received == task_sent); // } - // That explained the bug in a snap, with a very cool example and everything. - // - // This MC_assert is now desactivated as the case is now properly handled in our code and we don't want the - // MC to fail any further under that condition, but this comment is here to as a memorial for this first - // brillant victory of the model-checking in the SimGrid community :) + // That explained the bug in a snap, with a very cool example and everything. + // + // This MC_assert is now desactivated as the case is now properly handled in our code and we don't want the + // MC to fail any further under that condition, but this comment is here to as a memorial for this first + // brillant victory of the model-checking in the SimGrid community :) if (task_received != task_sent || ans_data->type != TASK_FIND_SUCCESSOR_ANSWER) { @@ -995,7 +978,8 @@ static void check_predecessor(node_t node) node->comm_receive = NULL; handle_task(node, task_received); }else{ - XBT_DEBUG("Received the answer to my 'Predecessor Alive' request (task %p) : my predecessor %d is alive", task_received, node->pred_id); + XBT_DEBUG("Received the answer to my 'Predecessor Alive' request (task %p) : my predecessor %d is alive", + task_received, node->pred_id); stop = 1; MSG_comm_destroy(node->comm_receive); node->comm_receive = NULL; @@ -1020,31 +1004,26 @@ static void random_lookup(node_t node) } -/** - * \brief Main function. - */ int main(int argc, char *argv[]) { MSG_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); - } + xbt_assert(argc > 2, + "Usage: %s [-nb_bits=n] [-timeout=t] platform_file deployment_file\n" + "\tExample: %s ../msg_platform.xml chord.xml\n", argv[0], argv[0]); char **options = &argv[1]; while (!strncmp(options[0], "-", 1)) { int length = strlen("-nb_bits="); if (!strncmp(options[0], "-nb_bits=", length) && strlen(options[0]) > length) { - nb_bits = atoi(options[0] + length); + nb_bits = xbt_str_parse_int(options[0] + length, "Invalid nb_bits parameter: %s"); XBT_DEBUG("Set nb_bits to %d", nb_bits); } else { length = strlen("-timeout="); if (!strncmp(options[0], "-timeout=", length) && strlen(options[0]) > length) { - timeout = atoi(options[0] + length); + timeout = xbt_str_parse_int(options[0] + length, "Invalid timeout parameter: %s"); XBT_DEBUG("Set timeout to %d", timeout); } else { @@ -1070,8 +1049,5 @@ int main(int argc, char *argv[]) chord_exit(); - if (res == MSG_OK) - return 0; - else - return 1; + return res != MSG_OK; }