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;
+} s_state_t;
+typedef s_state_t* state_t;
/** Types of tasks exchanged between nodes. */
typedef enum {
//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);
int j;
int min;
int max;
- int d;
int next;
msg_task_t task_sent;
task_data_t req_data;
/* 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 (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++;
+ }
}
}