X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/e080adacaf1ba847ad467f5b8d21da385636ed3c..447a95c2dd42863dc11b210dd1e1dd857017a954:/examples/c/dht-kademlia/node.c diff --git a/examples/c/dht-kademlia/node.c b/examples/c/dht-kademlia/node.c index 308f00ac7f..f118c64f5e 100644 --- a/examples/c/dht-kademlia/node.c +++ b/examples/c/dht-kademlia/node.c @@ -1,4 +1,4 @@ -/* 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. */ @@ -37,6 +37,19 @@ void node_free(node_t node) 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 @@ -56,14 +69,11 @@ unsigned int join(node_t node, unsigned int id_known) /* 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; @@ -73,9 +83,7 @@ unsigned int join(node_t node, unsigned int id_known) } 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); } @@ -148,7 +156,7 @@ void routing_table_update(const_node_t node, unsigned int id) // 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); @@ -203,7 +211,6 @@ answer_t find_closest(const_node_t node, unsigned int destination_id) 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; @@ -228,18 +235,15 @@ unsigned int find_node(node_t node, unsigned int id_to_find, unsigned int count_ 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); @@ -259,9 +263,7 @@ unsigned int find_node(node_t node, unsigned int id_to_find, unsigned int count_ 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); } @@ -333,7 +335,7 @@ unsigned int get_node_prefix(unsigned int id, unsigned int nb_bits) 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;