1 #ifndef SIMGRID_PLUGINS_OPERATION_H_
2 #define SIMGRID_PLUGINS_OPERATION_H_
4 #include <simgrid/s4u/Activity.hpp>
5 #include <xbt/Extendable.hpp>
11 namespace simgrid::plugins {
14 using OperationPtr = std::shared_ptr<Operation>;
16 using ExecOpPtr = std::shared_ptr<ExecOp>;
18 using CommOpPtr = std::shared_ptr<CommOp>;
20 class ExtendedAttributeActivity {
22 static simgrid::xbt::Extension<simgrid::s4u::Activity, ExtendedAttributeActivity> EXTENSION_ID;
23 Operation* operation_;
25 ExtendedAttributeActivity(){};
31 std::set<Operation*> successors_ = {};
32 std::map<Operation*, unsigned int> predecessors_ = {};
34 void add_predecessor(Operation* predecessor);
35 void remove_predecessor(Operation* predecessor);
36 bool ready_to_run() const;
37 void receive(Operation* source);
43 int queued_execs_ = 0;
45 bool working_ = false;
46 simgrid::s4u::ActivityPtr current_activity_;
47 std::function<void(Operation*)> end_func_ = [](Operation*) {};
48 std::function<void(Operation*)> start_func_ = [](Operation*) {};
49 Operation(const std::string& name, double amount);
50 virtual ~Operation() = default;
51 virtual void execute() = 0;
53 static xbt::signal<void(Operation*)> on_start;
54 static xbt::signal<void(Operation*)> on_end;
58 std::string get_name();
59 void enqueue_execs(int n);
60 void set_amount(double amount);
61 void add_successor(OperationPtr op);
62 void remove_successor(OperationPtr op);
63 void on_this_start(std::function<void(Operation*)> func);
64 void on_this_end(std::function<void(Operation*)> func);
67 /** Add a callback fired before an operation activity start.
68 * Triggered after the on_this_start function**/
69 static void on_start_cb(const std::function<void(Operation*)>& cb) { on_start.connect(cb); }
70 /** Add a callback fired after an operation activity end.
71 * Triggered after the on_this_end function, but before
72 * sending tokens to successors.**/
73 static void on_end_cb(const std::function<void(Operation*)>& cb) { on_end.connect(cb); }
76 class ExecOp : public Operation {
78 simgrid::s4u::Host* host_;
80 ExecOp(const std::string& name, double flops, simgrid::s4u::Host* host);
84 static ExecOpPtr create(const std::string& name, double flops, simgrid::s4u::Host* host);
85 void set_host(simgrid::s4u::Host* host);
88 class CommOp : public Operation {
90 simgrid::s4u::Host* source_;
91 simgrid::s4u::Host* destination_;
93 CommOp(const std::string& name, double bytes, simgrid::s4u::Host* source, simgrid::s4u::Host* destination);
97 static CommOpPtr create(const std::string& name, double bytes, simgrid::s4u::Host* source,
98 simgrid::s4u::Host* destination);
99 void set_source(simgrid::s4u::Host* source);
100 void set_destination(simgrid::s4u::Host* destination);
102 } // namespace simgrid::plugins