X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/87b1fdc15d908c4e94bc6a81cbcf97f18a451205..50990f080fb5e086a481cb9b119156cf89f7437e:/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 8eda1ef168..1b9f3bdcf8 100644 --- a/examples/s4u/dht-chord/s4u-dht-chord-node.cpp +++ b/examples/s4u/dht-chord/s4u-dht-chord-node.cpp @@ -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(); +}