X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/63ebf4be4ca6a243a64c7ded8df9b96a9d28d3ff..54e818e2dea66d457ec7061f3f2bec19be321f39:/examples/s4u/dht-chord/s4u-dht-chord-node.cpp?ds=sidebyside diff --git a/examples/s4u/dht-chord/s4u-dht-chord-node.cpp b/examples/s4u/dht-chord/s4u-dht-chord-node.cpp index 0db3cef31d..8d9640f064 100644 --- a/examples/s4u/dht-chord/s4u-dht-chord-node.cpp +++ b/examples/s4u/dht-chord/s4u-dht-chord-node.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2018. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2010-2019. 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. */ @@ -17,10 +17,10 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(s4u_chord); * 24 belongs to [21, 29] * 24 does not belong to [29, 21] * - * \param id id to check - * \param start lower bound - * \param end upper bound - * \return a non-zero value if id in in [start, end] + * @param id id to check + * @param start lower bound + * @param end upper bound + * @return a non-zero value if id in in [start, end] */ static int is_in_interval(int id, int start, int end) { @@ -52,14 +52,9 @@ Node::Node(std::vector args) // initialize my node id_ = std::stoi(args[1]); - stream = simgrid::s4u::this_actor::get_host()->extension()->getStream(); - mailbox_ = simgrid::s4u::Mailbox::byName(std::to_string(id_)); + mailbox_ = simgrid::s4u::Mailbox::by_name(std::to_string(id_)); next_finger_to_fix = 0; - fingers_ = new int[nb_bits]; - - for (int i = 0; i < nb_bits; i++) { - fingers_[i] = id_; - } + fingers_.resize(nb_bits, id_); if (args.size() == 3) { // first ring deadline_ = std::stod(args[2]); @@ -74,14 +69,10 @@ Node::Node(std::vector args) } } -Node::~Node() -{ - delete[] fingers_; -} /* Makes the current node join the ring, knowing the id of a node already in the ring * - * \param known_id id of a node already in the ring - * \return true if the join operation succeeded + * @param known_id id of a node already in the ring + * @return true if the join operation succeeded * */ void Node::join(int known_id) @@ -117,12 +108,10 @@ void Node::notifyAndQuit() XBT_DEBUG("Sending a 'PREDECESSOR_LEAVING' to my successor %d", fingers_[0]); try { - simgrid::s4u::Mailbox::byName(std::to_string(fingers_[0]))->put(pred_msg, 10, timeout); - } catch (xbt_ex& e) { - if (e.category == timeout_error) { - XBT_DEBUG("Timeout expired when sending a 'PREDECESSOR_LEAVING' to my successor %d", fingers_[0]); - delete pred_msg; - } + simgrid::s4u::Mailbox::by_name(std::to_string(fingers_[0]))->put(pred_msg, 10, timeout); + } catch (const simgrid::TimeoutException&) { + XBT_DEBUG("Timeout expired when sending a 'PREDECESSOR_LEAVING' to my successor %d", fingers_[0]); + delete pred_msg; } if (pred_id_ != -1 && pred_id_ != id_) { @@ -133,12 +122,10 @@ void Node::notifyAndQuit() XBT_DEBUG("Sending a 'SUCCESSOR_LEAVING' to my predecessor %d", pred_id_); try { - simgrid::s4u::Mailbox::byName(std::to_string(pred_id_))->put(succ_msg, 10, timeout); - } catch (xbt_ex& e) { - if (e.category == timeout_error) { - XBT_DEBUG("Timeout expired when sending a 'SUCCESSOR_LEAVING' to my predecessor %d", pred_id_); - delete succ_msg; - } + simgrid::s4u::Mailbox::by_name(std::to_string(pred_id_))->put(succ_msg, 10, timeout); + } catch (const simgrid::TimeoutException&) { + XBT_DEBUG("Timeout expired when sending a 'SUCCESSOR_LEAVING' to my predecessor %d", pred_id_); + delete succ_msg; } } } @@ -147,7 +134,9 @@ void Node::notifyAndQuit() void Node::randomLookup() { int res = id_; - int random_index = RngStream_RandInt(stream, 0, nb_bits - 1); + // std::uniform_int_distribution dist(0, nb_bits - 1); + // int random_index = dist(generator); + int random_index = generator() % nb_bits; // ensure reproducibility across platforms int random_id = fingers_[random_index]; XBT_DEBUG("Making a lookup request for id %d", random_id); if (random_id != id_) @@ -157,9 +146,9 @@ void Node::randomLookup() /* Sets a finger of the current node. * - * \param node the current node - * \param finger_index index of the finger to set (0 to nb_bits - 1) - * \param id the id to set for this finger + * @param node the current node + * @param finger_index index of the finger to set (0 to nb_bits - 1) + * @param id the id to set for this finger */ void Node::setFinger(int finger_index, int id) { @@ -170,7 +159,7 @@ void Node::setFinger(int finger_index, int id) } /* Sets the predecessor of the current node. - * \param id the id to predecessor, or -1 to unset the predecessor + * @param id the id to predecessor, or -1 to unset the predecessor */ void Node::setPredecessor(int predecessor_id) { @@ -184,7 +173,7 @@ void Node::setPredecessor(int predecessor_id) void Node::fixFingers() { XBT_DEBUG("Fixing fingers"); - int id = findSuccessor(id_ + powers2[next_finger_to_fix]); + int id = findSuccessor(id_ + (1U << next_finger_to_fix)); if (id != -1) { if (id != fingers_[next_finger_to_fix]) { setFinger(next_finger_to_fix, id); @@ -201,7 +190,7 @@ void Node::printFingerTable() XBT_VERB("My finger table:"); XBT_VERB("Start | Succ"); for (int i = 0; i < nb_bits; i++) { - XBT_VERB(" %3d | %3d", (id_ + powers2[i]) % nb_keys, fingers_[i]); + XBT_VERB(" %3u | %3d", (id_ + (1U << i)) % nb_keys, fingers_[i]); } XBT_VERB("Predecessor: %d", pred_id_); @@ -216,8 +205,8 @@ void Node::checkPredecessor() if (pred_id_ == -1) return; - simgrid::s4u::MailboxPtr mailbox = simgrid::s4u::Mailbox::byName(std::to_string(pred_id_)); - simgrid::s4u::MailboxPtr return_mailbox = simgrid::s4u::Mailbox::byName(std::to_string(id_) + "_is_alive"); + simgrid::s4u::Mailbox* mailbox = simgrid::s4u::Mailbox::by_name(std::to_string(pred_id_)); + simgrid::s4u::Mailbox* return_mailbox = simgrid::s4u::Mailbox::by_name(std::to_string(id_) + "_is_alive"); ChordMessage* message = new ChordMessage(PREDECESSOR_ALIVE); message->request_id = pred_id_; @@ -226,41 +215,38 @@ void Node::checkPredecessor() XBT_DEBUG("Sending a 'Predecessor Alive' request to my predecessor %d", pred_id_); try { mailbox->put(message, 10, timeout); - } catch (xbt_ex& e) { - if (e.category == timeout_error) { - XBT_DEBUG("Failed to send the 'Predecessor Alive' request to %d", pred_id_); - delete message; - return; - } + } catch (const simgrid::TimeoutException&) { + XBT_DEBUG("Failed to send the 'Predecessor Alive' request to %d", pred_id_); + delete message; + return; } + // receive the answer XBT_DEBUG("Sent 'Predecessor Alive' request to %d, waiting for the answer on my mailbox '%s'", pred_id_, message->answer_to->get_cname()); simgrid::s4u::CommPtr comm = return_mailbox->get_async(&data); try { - comm->wait(timeout); + comm->wait_for(timeout); XBT_DEBUG("Received the answer to my 'Predecessor Alive': my predecessor %d is alive", pred_id_); delete static_cast(data); - } catch (xbt_ex& e) { - if (e.category == timeout_error) { - XBT_DEBUG("Failed to receive the answer to my 'Predecessor Alive' request"); - pred_id_ = -1; - } + } catch (const simgrid::TimeoutException&) { + XBT_DEBUG("Failed to receive the answer to my 'Predecessor Alive' request"); + pred_id_ = -1; } } /* Asks its predecessor to a remote node * - * \param ask_to the node to ask to - * \return the id of its predecessor node, or -1 if the request failed (or if the node does not know its predecessor) + * @param ask_to the node to ask to + * @return the id of its predecessor node, or -1 if the request failed (or if the node does not know its predecessor) */ int Node::remoteGetPredecessor(int ask_to) { int predecessor_id = -1; void* data = nullptr; - simgrid::s4u::MailboxPtr mailbox = simgrid::s4u::Mailbox::byName(std::to_string(ask_to)); - simgrid::s4u::MailboxPtr return_mailbox = simgrid::s4u::Mailbox::byName(std::to_string(id_) + "_pred"); + simgrid::s4u::Mailbox* mailbox = simgrid::s4u::Mailbox::by_name(std::to_string(ask_to)); + simgrid::s4u::Mailbox* return_mailbox = simgrid::s4u::Mailbox::by_name(std::to_string(id_) + "_pred"); ChordMessage* message = new ChordMessage(GET_PREDECESSOR); message->request_id = id_; @@ -270,12 +256,10 @@ int Node::remoteGetPredecessor(int ask_to) XBT_DEBUG("Sending a 'Get Predecessor' request to %d", ask_to); try { mailbox->put(message, 10, timeout); - } catch (xbt_ex& e) { - if (e.category == timeout_error) { - XBT_DEBUG("Failed to send the 'Get Predecessor' request to %d", ask_to); - delete message; - return predecessor_id; - } + } catch (const simgrid::TimeoutException&) { + XBT_DEBUG("Failed to send the 'Get Predecessor' request to %d", ask_to); + delete message; + return predecessor_id; } // receive the answer @@ -284,17 +268,15 @@ int Node::remoteGetPredecessor(int ask_to) simgrid::s4u::CommPtr comm = return_mailbox->get_async(&data); try { - comm->wait(timeout); + comm->wait_for(timeout); ChordMessage* answer = static_cast(data); XBT_DEBUG("Received the answer to my 'Get Predecessor' request: the predecessor of node %d is %d", ask_to, answer->answer_id); predecessor_id = answer->answer_id; delete answer; - } catch (xbt_ex& e) { - if (e.category == timeout_error) { - XBT_DEBUG("Failed to receive the answer to my 'Get Predecessor' request"); - delete static_cast(data); - } + } catch (const simgrid::TimeoutException&) { + XBT_DEBUG("Failed to receive the answer to my 'Get Predecessor' request"); + delete static_cast(data); } return predecessor_id; @@ -302,8 +284,8 @@ int Node::remoteGetPredecessor(int ask_to) /* Returns the closest preceding finger of an id with respect to the finger table of the current node. * - * \param id the id to find - * \return the closest preceding finger of that id + * @param id the id to find + * @return the closest preceding finger of that id */ int Node::closestPrecedingFinger(int id) { @@ -317,8 +299,8 @@ int Node::closestPrecedingFinger(int id) /* Makes the current node find the successor node of an id. * - * \param id the id to find - * \return the id of the successor node, or -1 if the request failed + * @param id the id to find + * @return the id of the successor node, or -1 if the request failed */ int Node::findSuccessor(int id) { @@ -335,8 +317,8 @@ int Node::remoteFindSuccessor(int ask_to, int id) { int successor = -1; void* data = nullptr; - simgrid::s4u::MailboxPtr mailbox = simgrid::s4u::Mailbox::byName(std::to_string(ask_to)); - simgrid::s4u::MailboxPtr return_mailbox = simgrid::s4u::Mailbox::byName(std::to_string(id_) + "_succ"); + simgrid::s4u::Mailbox* mailbox = simgrid::s4u::Mailbox::by_name(std::to_string(ask_to)); + simgrid::s4u::Mailbox* return_mailbox = simgrid::s4u::Mailbox::by_name(std::to_string(id_) + "_succ"); ChordMessage* message = new ChordMessage(FIND_SUCCESSOR); message->request_id = id_; @@ -346,30 +328,27 @@ int Node::remoteFindSuccessor(int ask_to, int id) XBT_DEBUG("Sending a 'Find Successor' request to %d for id %d", ask_to, id); try { mailbox->put(message, 10, timeout); - } catch (xbt_ex& e) { - if (e.category == timeout_error) { - XBT_DEBUG("Failed to send the 'Find Successor' request to %d for id %d", ask_to, id_); - delete message; - return successor; - } + } catch (const simgrid::TimeoutException&) { + XBT_DEBUG("Failed to send the 'Find Successor' request to %d for id %d", ask_to, id_); + delete message; + return successor; } // receive the answer XBT_DEBUG("Sent a 'Find Successor' request to %d for key %d, waiting for the answer", ask_to, id); simgrid::s4u::CommPtr comm = return_mailbox->get_async(&data); try { - comm->wait(timeout); + comm->wait_for(timeout); ChordMessage* answer = static_cast(data); XBT_DEBUG("Received the answer to my 'Find Successor' request for id %d: the successor of key %d is %d", answer->request_id, id_, answer->answer_id); successor = answer->answer_id; delete answer; - } catch (xbt_ex& e) { - if (e.category == timeout_error) { - XBT_DEBUG("Failed to receive the answer to my 'Find Successor' request"); - delete static_cast(data); - } + } catch (const simgrid::TimeoutException&) { + XBT_DEBUG("Failed to receive the answer to my 'Find Successor' request"); + delete static_cast(data); } + return successor; } @@ -393,7 +372,7 @@ void Node::remoteNotify(int notify_id, int predecessor_candidate_id) // send a "Notify" request to notify_id XBT_DEBUG("Sending a 'Notify' request to %d", notify_id); - simgrid::s4u::MailboxPtr mailbox = simgrid::s4u::Mailbox::byName(std::to_string(notify_id)); + simgrid::s4u::Mailbox* mailbox = simgrid::s4u::Mailbox::by_name(std::to_string(notify_id)); mailbox->put_init(message, 10)->detach(ChordMessage::destroy); } @@ -419,7 +398,7 @@ void Node::stabilize() /* This function is called when a node receives a message. * - * \param message the message to handle (don't touch it afterward: it will be destroyed, reused or forwarded) + * @param message the message to handle (don't touch it afterward: it will be destroyed, reused or forwarded) */ void Node::handleMessage(ChordMessage* message) { @@ -440,7 +419,7 @@ void Node::handleMessage(ChordMessage* message) int closest = closestPrecedingFinger(message->request_id); XBT_DEBUG("Forwarding the 'Find Successor' request for id %d to my closest preceding finger %d", message->request_id, closest); - simgrid::s4u::MailboxPtr mailbox = simgrid::s4u::Mailbox::byName(std::to_string(closest)); + simgrid::s4u::Mailbox* mailbox = simgrid::s4u::Mailbox::by_name(std::to_string(closest)); mailbox->put_init(message, 10)->detach(ChordMessage::destroy); } break;