-/* 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
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 {
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);
}
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) {
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;
}
/* 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);
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;
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; i<NAMESPACE_SIZE/2; i++) {
node->namespace_set[i] = task_data->state->namespace_set[i-j];
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;i<max;i++) {
- d = domain(node->id, i);
+ int d = domain(node->id, i);
for (j=0; j<LEVEL_SIZE; j++)
if (d!=j)
node->routing_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);
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 (; i<NAMESPACE_SIZE/2; i++){
}
task_namespace_set[i] = task_data->state->id;
for (; i<NAMESPACE_SIZE; i++){
- curr_namespace_set[i] = node->namespace_set[i];
+ curr_namespace_set[i] = node->namespace_set[i];
task_namespace_set[i+1] = task_data->state->namespace_set[i];
}
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);
}
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};
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];