Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
missing virtual destructor
[simgrid.git] / include / simgrid / plugins / operation.hpp
1 #ifndef SIMGRID_PLUGINS_OPERATION_H_
2 #define SIMGRID_PLUGINS_OPERATION_H_
3
4 #include <simgrid/s4u/Activity.hpp>
5 #include <xbt/Extendable.hpp>
6
7 #include <map>
8 #include <memory>
9 #include <set>
10
11 namespace simgrid::plugins {
12
13 class Operation;
14 using OperationPtr = std::shared_ptr<Operation>;
15 class ExecOp;
16 using ExecOpPtr = std::shared_ptr<ExecOp>;
17 class CommOp;
18 using CommOpPtr = std::shared_ptr<CommOp>;
19
20 class ExtendedAttributeActivity {
21 public:
22   static simgrid::xbt::Extension<simgrid::s4u::Activity, ExtendedAttributeActivity> EXTENSION_ID;
23   Operation* operation_;
24
25   ExtendedAttributeActivity(){};
26 };
27
28 class Operation {
29 private:
30   static bool inited_;
31   std::set<Operation*> successors_                 = {};
32   std::map<Operation*, unsigned int> predecessors_ = {};
33
34   void add_predecessor(Operation* predecessor);
35   void remove_predecessor(Operation* predecessor);
36   bool ready_to_run() const;
37   void receive(Operation* source);
38   void complete();
39
40 protected:
41   std::string name_;
42   double amount_;
43   int queued_execs_ = 0;
44   int count_        = 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;
52
53 public:
54   static void init();
55   std::string get_name();
56   void enqueue_execs(int n);
57   void set_amount(double amount);
58   void add_successor(OperationPtr op);
59   void remove_successor(OperationPtr op);
60   void on_start(std::function<void(Operation*)> func);
61   void on_end(std::function<void(Operation*)> func);
62   int get_count();
63 };
64
65 class ExecOp : public Operation {
66 private:
67   simgrid::s4u::Host* host_;
68
69   ExecOp(const std::string& name, double flops, simgrid::s4u::Host* host);
70   void execute();
71
72 public:
73   static ExecOpPtr create(const std::string& name, double flops, simgrid::s4u::Host* host);
74   void set_host(simgrid::s4u::Host* host);
75 };
76
77 class CommOp : public Operation {
78 private:
79   simgrid::s4u::Host* source_;
80   simgrid::s4u::Host* destination_;
81
82   CommOp(const std::string& name, double bytes, simgrid::s4u::Host* source, simgrid::s4u::Host* destination);
83   void execute();
84
85 public:
86   static CommOpPtr create(const std::string& name, double bytes, simgrid::s4u::Host* source,
87                           simgrid::s4u::Host* destination);
88   void set_source(simgrid::s4u::Host* source);
89   void set_destination(simgrid::s4u::Host* destination);
90 };
91 } // namespace simgrid::plugins
92 #endif