*/
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;
#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
}
#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()
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);
/*************
* 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;
#include "src/kernel/activity/ActivityImpl.hpp"
#include "surf/surf.hpp"
+#include <simgrid/s4u/Io.hpp>
namespace simgrid {
namespace kernel {
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;
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;
};
}
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;
}
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;
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_);
#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