-/* Copyright (c) 2010-2020. The SimGrid Team. All rights reserved. */
+/* Copyright (c) 2010-2023. 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. */
xbt_free(node);
}
+/**
+ * Try to asynchronously get a new message from given mailbox. Return null if none available.
+ */
+kademlia_message_t receive(node_t node, sg_mailbox_t mailbox)
+{
+ if (node->receive_comm == NULL)
+ node->receive_comm = sg_mailbox_get_async(mailbox, &node->received_msg);
+ if (!sg_comm_test(node->receive_comm))
+ return NULL;
+ node->receive_comm = NULL;
+ return node->received_msg;
+}
+
/**
* @brief Tries to join the network
* @param node node data
/* First step: Send a "FIND_NODE" request to the node we know */
send_find_node(node, id_known, node->id);
do {
- if (node->receive_comm == NULL)
- node->receive_comm = sg_mailbox_get_async(mailbox, &node->received_msg);
-
- if (sg_comm_test(node->receive_comm)) {
+ const kademlia_message_t msg = receive(node, mailbox);
+ if (msg) {
XBT_DEBUG("Received an answer from the node I know.");
got_answer = 1;
// retrieve the node list and ping them.
- const kademlia_message_t msg = (kademlia_message_t)(node->received_msg);
const s_answer_t* node_list = msg->answer;
if (node_list != NULL) {
node_contact_t contact;
} else {
handle_find_node(node, msg);
}
- answer_free(msg->answer);
- free(msg);
- node->receive_comm = NULL;
+ free_message(msg);
} else {
sg_actor_sleep_for(1);
}
// check if the id is already in the bucket.
unsigned int id_pos = bucket_find_id(bucket, id);
- if (id_pos == -1) {
+ if (id_pos == (unsigned int)-1) {
/* We check if the bucket is full or not. If it is, we evict an old element */
if (xbt_dynar_length(bucket->nodes) >= BUCKET_SIZE)
xbt_dynar_pop(bucket->nodes, NULL);
unsigned int find_node(node_t node, unsigned int id_to_find, unsigned int count_in_stats)
{
- unsigned int i = 0;
unsigned int queries;
unsigned int answers;
unsigned int destination_found = 0;
double time_beginreceive = simgrid_get_clock();
do {
- if (node->receive_comm == NULL)
- node->receive_comm = sg_mailbox_get_async(mailbox, &node->received_msg);
-
- if (sg_comm_test(node->receive_comm)) {
+ const kademlia_message_t msg = receive(node, mailbox);
+ if (msg) {
// Figure out if we received an answer or something else
- const kademlia_message_t msg = (kademlia_message_t)(node->received_msg);
-
// Check if what we have received is what we are looking for.
if (msg->answer != NULL && msg->answer->destination_id == id_to_find) {
// Handle the answer
routing_table_update(node, msg->sender_id);
node_contact_t contact;
+ unsigned int i;
xbt_dynar_foreach (node_list->nodes, i, contact)
routing_table_update(node, contact->id);
timeout += simgrid_get_clock() - time_beginreceive;
time_beginreceive = simgrid_get_clock();
}
- answer_free(msg->answer);
- free(msg);
- node->receive_comm = NULL;
+ free_message(msg);
} else {
sg_actor_sleep_for(1);
}
unsigned int size = sizeof(unsigned int) * 8;
for (unsigned int j = 0; j < size; j++) {
if (((id >> (size - 1 - j)) & 0x1) != 0) {
- return nb_bits - (j);
+ return nb_bits - j;
}
}
return 0;