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) {
+ while (now < std::min(start_time_ + deadline_, 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()) {
+ bool comm_completed = true;
+ try {
+ if (not comm_receive->test())
+ comm_completed = false;
+ } catch (const simgrid::TimeoutException&) {
+ XBT_DEBUG("Caught a timeout, go ahead.");
+ }
+
+ if (comm_completed) {
+ if (data != nullptr) {
+ ChordMessage* message = static_cast<ChordMessage*>(data);
+ handleMessage(message);
+ data = nullptr;
+ }
+ comm_receive = nullptr;
+ } else {
// no task was received: make some periodic calls
if (now >= next_stabilize_date) {
stabilize();
// 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<ChordMessage*>(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<ChordMessage*>(data);
- else
- comm_receive->cancel();
+ try {
+ if (comm_receive->test())
+ delete static_cast<ChordMessage*>(data);
+ else
+ comm_receive->cancel();
+ } catch (const simgrid::TimeoutException&) {
+ XBT_DEBUG("Caught a timeout for last message, nevermind.");
+ }
}
// leave the ring
leave();