#include "xbt/asserts.h"
#include "simgrid/modelchecker.h"
-XBT_LOG_NEW_DEFAULT_CATEGORY(msg_chord,
+/** @addtogroup MSG_examples
+ *
+ * - <b>chord/chord.c: Classical Chord P2P protocol</b>
+ * 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
/**
* 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;
/**
* 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)
/**
* 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)
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;
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);
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);
}
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
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);
XBT_DEBUG("Failed to receive the answer to my 'Find Successor' request (task %p): %d",
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 {
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);
}
}
if (res != MSG_OK) {
XBT_DEBUG("Failed to receive the answer to my 'Get Predecessor' request (task %p): %d",
- task_sent, (int)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 {
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);
}
}
*/
int main(int argc, char *argv[])
{
- MSG_global_init(&argc, 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]);
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++;