-/* Copyright (c) 2013-2017. The SimGrid Team.
- * All rights reserved. */
+/* Copyright (c) 2013-2018. 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 "simgrid/msg.h"
#include "xbt/dynar.h"
-#include <math.h>
+#include <math.h>
+#include <stdio.h>
XBT_LOG_NEW_DEFAULT_CATEGORY(msg_pastry, "Messages specific for this msg example");
static int max_simulation_time = 1000;
typedef struct s_node {
- unsigned id; //128bits generated random(2^128 -1)
- unsigned known_id;
+ int id; //128bits generated random(2^128 -1)
+ int known_id;
char mailbox[MAILBOX_NAME_SIZE]; // my mailbox name (string representation of the id)
- unsigned namespace_set[NAMESPACE_SIZE];
- unsigned neighborhood_set[NEIGHBORHOOD_SIZE];
- unsigned routing_table[LEVELS_COUNT][LEVEL_SIZE];
+ int namespace_set[NAMESPACE_SIZE];
+ int neighborhood_set[NEIGHBORHOOD_SIZE];
+ int routing_table[LEVELS_COUNT][LEVEL_SIZE];
int ready;
msg_comm_t comm_receive; // current communication to receive
xbt_dynar_t pending_tasks;
typedef s_node_t* node_t;
typedef struct s_state {
- unsigned id;
- unsigned namespace_set[NAMESPACE_SIZE];
- unsigned neighborhood_set[NEIGHBORHOOD_SIZE];
- unsigned routing_table[LEVELS_COUNT][LEVEL_SIZE];
+ int id;
+ int namespace_set[NAMESPACE_SIZE];
+ int neighborhood_set[NEIGHBORHOOD_SIZE];
+ int routing_table[LEVELS_COUNT][LEVEL_SIZE];
} s_state_t;
typedef s_state_t* state_t;
typedef struct s_task_data {
e_task_type_t type; // type of task
- unsigned sender_id; // id parameter (used by some types of tasks)
+ int 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)
+ int 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;
}
static void print_node_id(node_t node) {
- XBT_INFO(" Id: %u '%08x' ", node->id, node->id);
+ XBT_INFO(" Id: %i '%08x' ", node->id, (unsigned)node->id);
}
static void print_node_neighborood_set(node_t node) {
XBT_INFO(" Neighborhood:");
for (int i=0; i<NEIGHBORHOOD_SIZE; i++)
- XBT_INFO(" %08x", node->neighborhood_set[i]);
+ XBT_INFO(" %08x", (unsigned)node->neighborhood_set[i]);
}
static void print_node_routing_table(node_t node) {
XBT_INFO(" Routing table:");
for (int i=0; i<LEVELS_COUNT; i++){
for (int j=0; j<LEVEL_SIZE; j++)
- XBT_INFO(" %08x ", node->routing_table[i][j]);
+ XBT_INFO(" %08x ", (unsigned)node->routing_table[i][j]);
}
}
/* Print the node namespace set */
static void print_node_namespace_set(node_t node) {
XBT_INFO(" Namespace:");
for (int i=0; i<NAMESPACE_SIZE; i++)
- XBT_INFO(" %08x", node->namespace_set[i]);
+ XBT_INFO(" %08x", (unsigned)node->namespace_set[i]);
}
/* Print the node information */
int j;
int min;
int max;
- unsigned next;
+ int next;
msg_task_t task_sent;
task_data_t req_data;
task_data_t task_data = (task_data_t) MSG_task_get_data(task);
/* 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", (unsigned)task_data->answer_id, (unsigned)next);
type = TASK_JOIN_LAST_REPLY;
req_data = xbt_new0(s_task_data_t,1);
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 %u", next);
+ XBT_DEBUG("Timeout expired when forwarding join to next %d", next);
task_free(task_sent);
}
type = TASK_JOIN_REPLY;
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 %u", node->id);
+ XBT_DEBUG("Timeout expired when sending back the current node state to the joining node to %d", node->id);
task_free(task_sent);
}
break;
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 %u is ready!!!", node->id);
- while(xbt_dynar_length(node->pending_tasks)){
+ XBT_DEBUG("Node %i is ready!!!", node->id);
+ while (!xbt_dynar_is_empty(node->pending_tasks)) {
msg_task_t task;
xbt_dynar_shift(node->pending_tasks, &task);
handle_task(node, task);
break;
/* Received an update of state */
case TASK_UPDATE:
- XBT_DEBUG("Task update %u !!!", node->id);
+ XBT_DEBUG("Task update %i !!!", node->id);
/* Update namespace ses */
- XBT_INFO("Task update from %u !!!", task_data->sender_id);
+ XBT_INFO("Task update from %i !!!", task_data->sender_id);
XBT_INFO("Node:");
print_node_id(node);
print_node_namespace_set(node);
// add lower elements
j = NAMESPACE_SIZE/2-1;
for (i=NAMESPACE_SIZE/2-1; i>=0; i--) {
- if (min<0) {
+ if (min < 0 || curr_namespace_set[j] > task_namespace_set[min]) {
node->namespace_set[i] = curr_namespace_set[j];
j--;
} else if (curr_namespace_set[j] == task_namespace_set[min]) {
node->namespace_set[i] = curr_namespace_set[j];
j--;
min--;
- } else if (curr_namespace_set[j] > task_namespace_set[min]) {
- node->namespace_set[i] = curr_namespace_set[j];
- j--;
} else {
node->namespace_set[i] = task_namespace_set[min];
min--;
node->namespace_set[i] = curr_namespace_set[j];
j++;
} else if (max >= 0){
- if (curr_namespace_set[j] == -1) {
+ if (curr_namespace_set[j] == -1 || curr_namespace_set[j] > task_namespace_set[max]) {
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]) {
+ } else {
node->namespace_set[i] = curr_namespace_set[j];
j++;
- } else {
- node->namespace_set[i] = task_namespace_set[max];
- max++;
}
}
}
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 %u", node->known_id);
+ XBT_DEBUG("Timeout expired when joining ring with node %d", node->known_id);
task_free(task_sent);
}
node.ready = -1;
node.pending_tasks = xbt_dynar_new(sizeof(msg_task_t), NULL);
get_mailbox(node.id, node.mailbox);
- XBT_DEBUG("New node with id %s (%08x)", node.mailbox, node.id);
+ XBT_DEBUG("New node with id %s (%08x)", node.mailbox, (unsigned)node.id);
for (int i=0; i<LEVELS_COUNT; i++){
int d = domain(node.id, i);