#include "mc/mc.h"
#include "simgrid/Exception.hpp"
#include "simgrid/kernel/resource/Action.hpp"
+#include "simgrid/kernel/routing/NetPoint.hpp"
#include "simgrid/s4u/Host.hpp"
#include "simgrid/s4u/Io.hpp"
#include "src/kernel/actor/SimcallObserver.hpp"
IoImpl* IoImpl::start()
{
state_ = State::RUNNING;
- surf_action_ = disk_->io_start(size_, type_);
+ surf_action_ =
+ disk_->get_host()->get_netpoint()->get_englobing_zone()->get_disk_model()->io_start(disk_, size_, type_);
surf_action_->set_activity(this);
XBT_DEBUG("Create IO synchro %p %s", this, get_cname());
DiskModel& operator=(const DiskModel&) = delete;
virtual DiskImpl* create_disk(const std::string& name, double read_bandwidth, double write_bandwidth) = 0;
+
+ virtual DiskAction* io_start(const DiskImpl* disk, sg_size_t size, s4u::Io::OpType type) = 0;
};
/************
void seal() override;
void destroy(); // Must be called instead of the destructor
- virtual DiskAction* io_start(sg_size_t size, s4u::Io::OpType type) = 0;
- virtual DiskAction* read(sg_size_t size) = 0;
- virtual DiskAction* write(sg_size_t size) = 0;
};
/**********
}
}
-/************
- * Resource *
- ************/
-DiskAction* DiskS19::io_start(sg_size_t size, s4u::Io::OpType type)
-{
- return new DiskS19Action(get_model(), static_cast<double>(size), not is_on(), this, type);
-}
-
-DiskAction* DiskS19::read(sg_size_t size)
+DiskAction* DiskS19Model::io_start(const DiskImpl* disk, sg_size_t size, s4u::Io::OpType type)
{
- return new DiskS19Action(get_model(), static_cast<double>(size), not is_on(), this, s4u::Io::OpType::READ);
-}
-
-DiskAction* DiskS19::write(sg_size_t size)
-{
- return new DiskS19Action(get_model(), static_cast<double>(size), not is_on(), this, s4u::Io::OpType::WRITE);
+ auto* action = new DiskS19Action(this, static_cast<double>(size), not disk->is_on(), disk, type);
+ get_maxmin_system()->expand(disk->get_constraint(), action->get_variable(), 1.0);
+ switch (type) {
+ case s4u::Io::OpType::READ:
+ get_maxmin_system()->expand(disk->get_read_constraint(), action->get_variable(), 1.0);
+ break;
+ case s4u::Io::OpType::WRITE:
+ get_maxmin_system()->expand(disk->get_write_constraint(), action->get_variable(), 1.0);
+ break;
+ default:
+ THROW_UNIMPLEMENTED;
+ }
+ return action;
}
+/************
+ * Resource *
+ ************/
/**********
* Action *
**********/
DiskS19Action::DiskS19Action(Model* model, double cost, bool failed, const DiskImpl* disk, s4u::Io::OpType type)
: DiskAction(model, cost, failed, model->get_maxmin_system()->variable_new(this, 1.0, -1.0, 3))
{
- XBT_IN("(%s,%g", disk->get_cname(), cost);
-
- // Must be less than the max bandwidth for all actions
- model->get_maxmin_system()->expand(disk->get_constraint(), get_variable(), 1.0);
- switch (type) {
- case s4u::Io::OpType::READ:
- model->get_maxmin_system()->expand(disk->get_read_constraint(), get_variable(), 1.0);
- break;
- case s4u::Io::OpType::WRITE:
- model->get_maxmin_system()->expand(disk->get_write_constraint(), get_variable(), 1.0);
- break;
- default:
- THROW_UNIMPLEMENTED;
- }
- XBT_OUT();
}
void DiskS19Action::update_remains_lazy(double /*now*/)
public:
using DiskModel::DiskModel;
DiskImpl* create_disk(const std::string& name, double read_bandwidth, double write_bandwidth) override;
+
+ DiskAction* io_start(const DiskImpl* disk, sg_size_t size, s4u::Io::OpType type) override;
+
void update_actions_state(double now, double delta) override;
};
class DiskS19 : public DiskImpl {
public:
using DiskImpl::DiskImpl;
- DiskAction* io_start(sg_size_t size, s4u::Io::OpType type) override;
- DiskAction* read(sg_size_t size) override;
- DiskAction* write(sg_size_t size) override;
};
/**********