X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/d182f2207624776d4d1b87662436663f81b00dc4..50990f080fb5e086a481cb9b119156cf89f7437e:/examples/s4u/dht-chord/s4u-dht-chord-node.cpp diff --git a/examples/s4u/dht-chord/s4u-dht-chord-node.cpp b/examples/s4u/dht-chord/s4u-dht-chord-node.cpp index 1fa0c39b06..1b9f3bdcf8 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-2019. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2010-2020. 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. */ @@ -20,9 +20,9 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(s4u_chord); * @param id id to check * @param start lower bound * @param end upper bound - * @return a non-zero value if id in in [start, end] + * @return true if id in in [start, end] */ -static int is_in_interval(int id, int start, int end) +static bool is_in_interval(int id, int start, int end) { int i = id % nb_keys; int s = start % nb_keys; @@ -134,7 +134,7 @@ void Node::notifyAndQuit() void Node::randomLookup() { int res = id_; - int random_index = generator() % nb_bits; + int random_index = simgrid::xbt::random::uniform_int(0, nb_bits - 1); int random_id = fingers_[random_index]; XBT_DEBUG("Making a lookup request for id %d", random_id); if (random_id != id_) @@ -267,7 +267,7 @@ int Node::remoteGetPredecessor(int ask_to) try { comm->wait_for(timeout); - ChordMessage* answer = static_cast(data); + const 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; @@ -314,7 +314,7 @@ int Node::findSuccessor(int id) int Node::remoteFindSuccessor(int ask_to, int id) { int successor = -1; - void* data = nullptr; + ChordMessage* data = nullptr; 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"); @@ -333,18 +333,18 @@ int Node::remoteFindSuccessor(int ask_to, int id) } // 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); + simgrid::s4u::CommPtr comm = return_mailbox->get_async(reinterpret_cast(&data)); try { comm->wait_for(timeout); - ChordMessage* answer = static_cast(data); + const ChordMessage* answer = 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 (const simgrid::TimeoutException&) { XBT_DEBUG("Failed to receive the answer to my 'Find Successor' request"); - delete static_cast(data); + delete data; } return successor; @@ -474,3 +474,65 @@ void Node::handleMessage(ChordMessage* message) delete message; } } + +void Node::operator()() +{ + simgrid::s4u::this_actor::sleep_for(start_time_); + if (known_id_ == -1) { + setPredecessor(-1); // -1 means that I have no predecessor + printFingerTable(); + joined = true; + } else { + join(known_id_); + } + + if (not joined) + return; + void* data = nullptr; + double now = simgrid::s4u::Engine::get_clock(); + double next_stabilize_date = start_time_ + PERIODIC_STABILIZE_DELAY; + double next_fix_fingers_date = start_time_ + PERIODIC_FIX_FINGERS_DELAY; + double next_check_predecessor_date = start_time_ + PERIODIC_CHECK_PREDECESSOR_DELAY; + double next_lookup_date = start_time_ + PERIODIC_LOOKUP_DELAY; + simgrid::s4u::CommPtr comm_receive = nullptr; + while ((now < (start_time_ + deadline_)) && now < MAX_SIMULATION_TIME) { + if (comm_receive == nullptr) + comm_receive = mailbox_->get_async(&data); + while ((now < (start_time_ + deadline_)) && now < MAX_SIMULATION_TIME && not comm_receive->test()) { + // no task was received: make some periodic calls + if (now >= next_stabilize_date) { + stabilize(); + next_stabilize_date = simgrid::s4u::Engine::get_clock() + PERIODIC_STABILIZE_DELAY; + } else if (now >= next_fix_fingers_date) { + fixFingers(); + next_fix_fingers_date = simgrid::s4u::Engine::get_clock() + PERIODIC_FIX_FINGERS_DELAY; + } else if (now >= next_check_predecessor_date) { + checkPredecessor(); + next_check_predecessor_date = simgrid::s4u::Engine::get_clock() + PERIODIC_CHECK_PREDECESSOR_DELAY; + } else if (now >= next_lookup_date) { + randomLookup(); + next_lookup_date = simgrid::s4u::Engine::get_clock() + PERIODIC_LOOKUP_DELAY; + } else { + // nothing to do: sleep for a while + simgrid::s4u::this_actor::sleep_for(SLEEP_DELAY); + } + now = simgrid::s4u::Engine::get_clock(); + } + + if (data != nullptr) { + ChordMessage* message = static_cast(data); + handleMessage(message); + comm_receive = nullptr; + data = nullptr; + } + now = simgrid::s4u::Engine::get_clock(); + } + if (comm_receive != nullptr) { + if (comm_receive->test()) + delete static_cast(data); + else + comm_receive->cancel(); + } + // leave the ring + leave(); +}