From bbc57f5380f908b965ad6b3e0b47d374b739a526 Mon Sep 17 00:00:00 2001 From: Frederic Suter Date: Fri, 1 Feb 2019 13:07:18 +0100 Subject: [PATCH] properly split init and start for IO activities --- include/simgrid/s4u/Io.hpp | 14 +++++++------- src/kernel/activity/IoImpl.cpp | 20 ++++++++++++++------ src/kernel/activity/IoImpl.hpp | 8 +++++--- src/s4u/s4u_Io.cpp | 12 ++++++++---- src/s4u/s4u_Storage.cpp | 4 +--- src/simix/smx_io.cpp | 15 --------------- src/simix/smx_io_private.hpp | 3 --- 7 files changed, 35 insertions(+), 41 deletions(-) diff --git a/include/simgrid/s4u/Io.hpp b/include/simgrid/s4u/Io.hpp index d0de67e470..4fb6b9ff49 100644 --- a/include/simgrid/s4u/Io.hpp +++ b/include/simgrid/s4u/Io.hpp @@ -21,16 +21,16 @@ namespace s4u { */ class XBT_PUBLIC Io : public Activity { -public: - enum class OpType { READ, WRITE }; - -private: - explicit Io(sg_size_t size, OpType type) : Activity(), size_(size), type_(type) {} public: friend XBT_PUBLIC void intrusive_ptr_release(simgrid::s4u::Io* i); friend XBT_PUBLIC void intrusive_ptr_add_ref(simgrid::s4u::Io* i); friend simgrid::s4u::Storage; // Factory of IOs + enum class OpType { READ, WRITE }; + +private: + explicit Io(sg_storage_t storage, sg_size_t size, OpType type); +public: ~Io() = default; Io* start() override; @@ -47,10 +47,10 @@ public: #endif private: - sg_size_t size_ = 0; sg_storage_t storage_ = nullptr; - std::string name_ = ""; + sg_size_t size_ = 0; OpType type_ = OpType::READ; + std::string name_ = ""; std::atomic_int_fast32_t refcount_{0}; }; // class } diff --git a/src/kernel/activity/IoImpl.cpp b/src/kernel/activity/IoImpl.cpp index f7121544ae..8f3071983c 100644 --- a/src/kernel/activity/IoImpl.cpp +++ b/src/kernel/activity/IoImpl.cpp @@ -6,17 +6,16 @@ #include "src/kernel/activity/IoImpl.hpp" #include "simgrid/kernel/resource/Action.hpp" #include "src/simix/smx_io_private.hpp" +#include "src/surf/StorageImpl.hpp" XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix_io); -simgrid::kernel::activity::IoImpl::IoImpl(std::string name, resource::Action* surf_action, s4u::Storage* storage) - : ActivityImpl(name), storage_(storage), surf_action_(surf_action) +simgrid::kernel::activity::IoImpl::IoImpl(std::string name, simgrid::surf::StorageImpl* storage) + : ActivityImpl(name), storage_(storage) { this->state_ = SIMIX_RUNNING; - surf_action_->set_data(this); - - XBT_DEBUG("Create io %p", this); + XBT_DEBUG("Create io impl %p", this); } simgrid::kernel::activity::IoImpl::~IoImpl() @@ -26,6 +25,15 @@ simgrid::kernel::activity::IoImpl::~IoImpl() XBT_DEBUG("Destroy io %p", this); } +void simgrid::kernel::activity::IoImpl::start(sg_size_t size, simgrid::s4u::Io::OpType type) +{ + surf_action_ = storage_->io_start(size, type); + surf_action_->set_data(this); + + XBT_DEBUG("Create IO synchro %p %s", this, name_.c_str()); + simgrid::kernel::activity::IoImpl::on_start(this); +} + void simgrid::kernel::activity::IoImpl::cancel() { XBT_VERB("This exec %p is canceled", this); @@ -71,5 +79,5 @@ void simgrid::kernel::activity::IoImpl::post() /************* * Callbacks * *************/ -simgrid::xbt::signal simgrid::kernel::activity::IoImpl::on_creation; +simgrid::xbt::signal simgrid::kernel::activity::IoImpl::on_start; simgrid::xbt::signal simgrid::kernel::activity::IoImpl::on_completion; diff --git a/src/kernel/activity/IoImpl.hpp b/src/kernel/activity/IoImpl.hpp index 456b325189..55619bfa39 100644 --- a/src/kernel/activity/IoImpl.hpp +++ b/src/kernel/activity/IoImpl.hpp @@ -8,6 +8,7 @@ #include "src/kernel/activity/ActivityImpl.hpp" #include "surf/surf.hpp" +#include namespace simgrid { namespace kernel { @@ -16,8 +17,9 @@ namespace activity { class XBT_PUBLIC IoImpl : public ActivityImpl { public: ~IoImpl() override; - explicit IoImpl(std::string name, resource::Action* surf_action, s4u::Storage* storage); + explicit IoImpl(std::string name, simgrid::surf::StorageImpl* storage); + void start(sg_size_t size, simgrid::s4u::Io::OpType type); void suspend() override; void resume() override; void post() override; @@ -25,10 +27,10 @@ public: double get_remaining(); sg_size_t get_performed_ioops() { return performed_ioops_; } - s4u::Storage* storage_ = nullptr; + simgrid::surf::StorageImpl* storage_ = nullptr; simgrid::kernel::resource::Action* surf_action_ = nullptr; sg_size_t performed_ioops_ = 0; - static simgrid::xbt::signal on_creation; + static simgrid::xbt::signal on_start; static simgrid::xbt::signal on_completion; }; } diff --git a/src/s4u/s4u_Io.cpp b/src/s4u/s4u_Io.cpp index 0e7f6ee845..27ff69f216 100644 --- a/src/s4u/s4u_Io.cpp +++ b/src/s4u/s4u_Io.cpp @@ -14,12 +14,16 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(s4u_io, s4u_activity, "S4U asynchronous IOs"); namespace simgrid { namespace s4u { -Io* Io::start() +Io::Io(sg_storage_t storage, sg_size_t size, OpType type) : Activity(), storage_(storage), size_(size), type_(type) { Activity::set_remaining(size_); - pimpl_ = simix::simcall([this] { - return boost::static_pointer_cast(SIMIX_io_start(name_, size_, storage_, type_)); - }); + pimpl_ = simix::simcall( + [this] { return kernel::activity::IoImplPtr(new kernel::activity::IoImpl(name_, storage_->get_impl())); }); +} + +Io* Io::start() +{ + simix::simcall([this] { dynamic_cast(pimpl_.get())->start(size_, type_); }); state_ = State::STARTED; return this; } diff --git a/src/s4u/s4u_Storage.cpp b/src/s4u/s4u_Storage.cpp index b9828c01d9..5ee855b0da 100644 --- a/src/s4u/s4u_Storage.cpp +++ b/src/s4u/s4u_Storage.cpp @@ -58,14 +58,12 @@ void Storage::set_property(std::string key, std::string value) IoPtr Storage::io_init(sg_size_t size, Io::OpType type) { - IoPtr res = IoPtr(new Io(size, type)); - res->storage_ = this; + IoPtr res = IoPtr(new Io(this, size, type)); return res; } IoPtr Storage::read_async(sg_size_t size) { - IoPtr res = io_init(size, Io::OpType::READ); res->start(); return res; diff --git a/src/simix/smx_io.cpp b/src/simix/smx_io.cpp index 602a9e47e2..2898422e40 100644 --- a/src/simix/smx_io.cpp +++ b/src/simix/smx_io.cpp @@ -16,21 +16,6 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_io, simix, "Logging specific to SIMIX (io)"); -simgrid::kernel::activity::IoImplPtr SIMIX_io_start(std::string name, sg_size_t size, sg_storage_t storage, - simgrid::s4u::Io::OpType type) -{ - /* set surf's action */ - simgrid::kernel::resource::Action* surf_action = storage->get_impl()->io_start(size, type); - - simgrid::kernel::activity::IoImplPtr io = - simgrid::kernel::activity::IoImplPtr(new simgrid::kernel::activity::IoImpl(name, surf_action, storage)); - - XBT_DEBUG("Create IO synchro %p %s", io.get(), name.c_str()); - simgrid::kernel::activity::IoImpl::on_creation(io); - - return io; -} - void simcall_HANDLER_io_wait(smx_simcall_t simcall, smx_activity_t synchro) { XBT_DEBUG("Wait for execution of synchro %p, state %d", synchro.get(), (int)synchro->state_); diff --git a/src/simix/smx_io_private.hpp b/src/simix/smx_io_private.hpp index 3da04a52ce..8cf9f003b2 100644 --- a/src/simix/smx_io_private.hpp +++ b/src/simix/smx_io_private.hpp @@ -9,9 +9,6 @@ #include #include "simgrid/s4u/Io.hpp" -XBT_PRIVATE simgrid::kernel::activity::IoImplPtr SIMIX_io_start(std::string name, sg_size_t size, sg_storage_t storage, - simgrid::s4u::Io::OpType type); - XBT_PRIVATE void SIMIX_io_finish(smx_activity_t synchro); #endif -- 2.20.1