Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Use const& for std::string parameter (sonar, again).
[simgrid.git] / src / kernel / resource / DiskImpl.cpp
1 /* Copyright (c) 2019-2021. The SimGrid Team. All rights reserved.          */
2
3 /* This program is free software; you can redistribute it and/or modify it
4  * under the terms of the license (GNU LGPL) which comes with this package. */
5
6 #include "DiskImpl.hpp"
7
8 #include "simgrid/s4u/Engine.hpp"
9 #include "src/kernel/EngineImpl.hpp"
10 #include "src/kernel/lmm/maxmin.hpp"
11
12 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(res_disk, ker_resource, "Disk resources, fuelling I/O activities");
13
14 namespace simgrid {
15 namespace kernel {
16 namespace resource {
17
18 /*********
19  * Model *
20  *********/
21
22 DiskModel::DiskModel(const std::string& name) : Model(name)
23 {
24   set_maxmin_system(new lmm::System(true /* selective update */));
25 }
26
27 /************
28  * Resource *
29  ************/
30 DiskImpl* DiskImpl::set_host(s4u::Host* host)
31 {
32   host_ = host;
33   return this;
34 }
35
36 DiskImpl* DiskImpl::set_read_bandwidth(double read_bw)
37 {
38   read_bw_ = read_bw;
39   return this;
40 }
41
42 DiskImpl* DiskImpl::set_write_bandwidth(double write_bw)
43 {
44   write_bw_ = write_bw;
45   return this;
46 }
47
48 DiskImpl* DiskImpl::set_read_constraint(lmm::Constraint* constraint_read)
49 {
50   constraint_read_ = constraint_read;
51   return this;
52 }
53
54 DiskImpl* DiskImpl::set_write_constraint(lmm::Constraint* constraint_write)
55 {
56   constraint_write_ = constraint_write;
57   return this;
58 }
59
60 /** @brief Fire the required callbacks and destroy the object
61  *
62  * Don't delete directly a Disk, call d->destroy() instead.
63  */
64 void DiskImpl::destroy()
65 {
66   s4u::Disk::on_destruction(this->piface_);
67   delete this;
68 }
69
70 bool DiskImpl::is_used() const
71 {
72   THROW_UNIMPLEMENTED;
73 }
74
75 void DiskImpl::apply_event(kernel::profile::Event* /*event*/, double /*value*/)
76 {
77   THROW_UNIMPLEMENTED;
78 }
79
80 void DiskImpl::turn_on()
81 {
82   if (not is_on()) {
83     Resource::turn_on();
84     s4u::Disk::on_state_change(this->piface_);
85   }
86 }
87 void DiskImpl::turn_off()
88 {
89   if (is_on()) {
90     Resource::turn_off();
91     s4u::Disk::on_state_change(this->piface_);
92   }
93 }
94
95 void DiskImpl::seal()
96 {
97   xbt_assert(this->get_model(), "Cannot seal Disk (%s) without setting the model first", this->get_cname());
98   lmm::System* maxmin_system = get_model()->get_maxmin_system();
99   this->set_read_constraint(maxmin_system->constraint_new(this, read_bw_))
100       ->set_write_constraint(maxmin_system->constraint_new(this, write_bw_))
101       ->set_constraint(maxmin_system->constraint_new(this, std::max(read_bw_, write_bw_)));
102   XBT_DEBUG("Create resource with read_bw '%f' write_bw '%f'", read_bw_, write_bw_);
103   Resource::seal();
104   turn_on();
105 }
106 xbt::signal<void(DiskAction const&, Action::State, Action::State)> DiskAction::on_state_change;
107
108 /**********
109  * Action *
110  **********/
111 void DiskAction::set_state(Action::State state)
112 {
113   Action::State old = get_state();
114   Action::set_state(state);
115   on_state_change(*this, old, state);
116 }
117 } // namespace resource
118 } // namespace kernel
119 } // namespace simgrid