X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/1abe27c3efd3ba83f6b0da4f391a1f29e053c588..3f9b311ec56db95ec539001a860ae3c838c48312:/src/s4u/s4u_ActivitySet.cpp diff --git a/src/s4u/s4u_ActivitySet.cpp b/src/s4u/s4u_ActivitySet.cpp index 8ba545ac0c..61957a3f9e 100644 --- a/src/s4u/s4u_ActivitySet.cpp +++ b/src/s4u/s4u_ActivitySet.cpp @@ -64,6 +64,21 @@ ActivityPtr ActivitySet::test_any() return ret; } +void ActivitySet::handle_failed_activities() +{ + for (size_t i = 0; i < activities_.size(); i++) { + auto act = activities_[i]; + if (act->pimpl_->get_state() == kernel::activity::State::FAILED) { + act->complete(Activity::State::FAILED); + + failed_activities_.push_back(act); + activities_[i] = activities_[activities_.size() - 1]; + activities_.resize(activities_.size() - 1); + i--; // compensate the i++ occuring at the end of the loop + } + } +} + ActivityPtr ActivitySet::wait_any_for(double timeout) { std::vector act_impls(activities_.size()); @@ -72,19 +87,30 @@ ActivityPtr ActivitySet::wait_any_for(double timeout) kernel::actor::ActorImpl* issuer = kernel::actor::ActorImpl::self(); kernel::actor::ActivityWaitanySimcall observer{issuer, act_impls, timeout, "wait_any_for"}; - ssize_t changed_pos = kernel::actor::simcall_blocking( - [&observer] { - kernel::activity::ActivityImpl::wait_any_for(observer.get_issuer(), observer.get_activities(), - observer.get_timeout()); - }, - &observer); - if (changed_pos == -1) - throw TimeoutException(XBT_THROW_POINT, "Timeouted"); - - auto ret = activities_.at(changed_pos); - erase(ret); - ret->complete(Activity::State::FINISHED); - return ret; + try { + ssize_t changed_pos = kernel::actor::simcall_blocking( + [&observer] { + kernel::activity::ActivityImpl::wait_any_for(observer.get_issuer(), observer.get_activities(), + observer.get_timeout()); + }, + &observer); + if (changed_pos == -1) + throw TimeoutException(XBT_THROW_POINT, "Timeouted"); + + auto ret = activities_.at(changed_pos); + erase(ret); + ret->complete(Activity::State::FINISHED); + return ret; + } catch (const HostFailureException& e) { + handle_failed_activities(); + throw; + } catch (const NetworkFailureException& e) { + handle_failed_activities(); + throw; + } catch (const StorageFailureException& e) { + handle_failed_activities(); + throw; + } } ActivityPtr ActivitySet::get_failed_activity() @@ -156,5 +182,9 @@ void sg_activity_set_delete(sg_activity_set_t as) { delete as; } +void sg_activity_unref(sg_activity_t acti) +{ + acti->unref(); +} SG_END_DECL