Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
properly split init and start for IO activities
authorFrederic Suter <frederic.suter@cc.in2p3.fr>
Fri, 1 Feb 2019 12:07:18 +0000 (13:07 +0100)
committerFrederic Suter <frederic.suter@cc.in2p3.fr>
Fri, 1 Feb 2019 12:07:18 +0000 (13:07 +0100)
include/simgrid/s4u/Io.hpp
src/kernel/activity/IoImpl.cpp
src/kernel/activity/IoImpl.hpp
src/s4u/s4u_Io.cpp
src/s4u/s4u_Storage.cpp
src/simix/smx_io.cpp
src/simix/smx_io_private.hpp

index d0de67e..4fb6b9f 100644 (file)
@@ -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
 }
index f712154..8f30719 100644 (file)
@@ -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<void(simgrid::kernel::activity::IoImplPtr)> simgrid::kernel::activity::IoImpl::on_creation;
+simgrid::xbt::signal<void(simgrid::kernel::activity::IoImplPtr)> simgrid::kernel::activity::IoImpl::on_start;
 simgrid::xbt::signal<void(simgrid::kernel::activity::IoImplPtr)> simgrid::kernel::activity::IoImpl::on_completion;
index 456b325..55619bf 100644 (file)
@@ -8,6 +8,7 @@
 
 #include "src/kernel/activity/ActivityImpl.hpp"
 #include "surf/surf.hpp"
+#include <simgrid/s4u/Io.hpp>
 
 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<void(kernel::activity::IoImplPtr)> on_creation;
+  static simgrid::xbt::signal<void(kernel::activity::IoImplPtr)> on_start;
   static simgrid::xbt::signal<void(kernel::activity::IoImplPtr)> on_completion;
 };
 }
index 0e7f6ee..27ff69f 100644 (file)
@@ -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<kernel::activity::IoImpl>(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<kernel::activity::IoImpl*>(pimpl_.get())->start(size_, type_); });
   state_ = State::STARTED;
   return this;
 }
index b9828c0..5ee855b 100644 (file)
@@ -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;
index 602a9e4..2898422 100644 (file)
 
 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_);
index 3da04a5..8cf9f00 100644 (file)
@@ -9,9 +9,6 @@
 #include <xbt/base.h>
 #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