From 255700918582111f0aacaa7b7fed87dcedc1a840 Mon Sep 17 00:00:00 2001 From: SUTER Frederic Date: Tue, 21 Dec 2021 17:20:17 +0100 Subject: [PATCH] (crudly) deal with I/O launched by maestro --- include/simgrid/s4u/Io.hpp | 1 + src/kernel/EngineImpl.cpp | 8 ++++++++ src/kernel/activity/IoImpl.cpp | 5 +++++ src/kernel/activity/IoImpl.hpp | 3 ++- 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/include/simgrid/s4u/Io.hpp b/include/simgrid/s4u/Io.hpp index 2f596869dc..841f18b932 100644 --- a/include/simgrid/s4u/Io.hpp +++ b/include/simgrid/s4u/Io.hpp @@ -22,6 +22,7 @@ namespace s4u { class XBT_PUBLIC Io : public Activity_T { #ifndef DOXYGEN friend kernel::activity::IoImpl; + friend kernel::EngineImpl; #endif protected: diff --git a/src/kernel/EngineImpl.cpp b/src/kernel/EngineImpl.cpp index c674144e54..15fb9f4672 100644 --- a/src/kernel/EngineImpl.cpp +++ b/src/kernel/EngineImpl.cpp @@ -422,6 +422,10 @@ void EngineImpl::wake_all_waiting_actors() const if (exec != nullptr && exec->get_actor() == maestro_) exec->get_iface()->complete(s4u::Activity::State::FAILED); + auto* io = dynamic_cast(action->get_activity()); + if (io != nullptr && io->get_actor() == maestro_) + io->get_iface()->complete(s4u::Activity::State::FAILED); + activity::ActivityImplPtr(action->get_activity())->post(); } } @@ -439,6 +443,10 @@ void EngineImpl::wake_all_waiting_actors() const exec->set_finish_time(action->get_finish_time()); exec->get_iface()->complete(s4u::Activity::State::FINISHED); } + auto* io = dynamic_cast(action->get_activity()); + if (io != nullptr && io->get_actor() == maestro_) + io->get_iface()->complete(s4u::Activity::State::FINISHED); + activity::ActivityImplPtr(action->get_activity())->post(); } } diff --git a/src/kernel/activity/IoImpl.cpp b/src/kernel/activity/IoImpl.cpp index c9f8e3553a..a6dcf3ae78 100644 --- a/src/kernel/activity/IoImpl.cpp +++ b/src/kernel/activity/IoImpl.cpp @@ -26,6 +26,11 @@ namespace activity { IoImpl::IoImpl() { piface_ = new s4u::Io(this); + actor::ActorImpl* self = actor::ActorImpl::self(); + if (self) { + actor_ = self; + self->activities_.emplace_back(this); + } } IoImpl& IoImpl::set_sharing_penalty(double sharing_penalty) diff --git a/src/kernel/activity/IoImpl.hpp b/src/kernel/activity/IoImpl.hpp index 0bd71e2d08..ed3c705ee8 100644 --- a/src/kernel/activity/IoImpl.hpp +++ b/src/kernel/activity/IoImpl.hpp @@ -14,6 +14,7 @@ namespace kernel { namespace activity { class XBT_PUBLIC IoImpl : public ActivityImpl_T { + actor::ActorImpl* actor_ = nullptr; resource::DiskImpl* disk_ = nullptr; double sharing_penalty_ = 1.0; sg_size_t size_ = 0; @@ -21,10 +22,10 @@ class XBT_PUBLIC IoImpl : public ActivityImpl_T { sg_size_t performed_ioops_ = 0; resource::Action* timeout_detector_ = nullptr; s4u::Io* piface_; - public: IoImpl(); s4u::Io* get_iface() { return piface_; } + actor::ActorImpl* get_actor() { return actor_; } IoImpl& set_sharing_penalty(double sharing_penalty); IoImpl& set_timeout(double timeout) override; -- 2.20.1