Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
5d735021edcff3ea63c99a1b83f5aec170b99dcc
[simgrid.git] / src / plugins / vm / VirtualMachineImpl.hpp
1 /* Copyright (c) 2004-2019. 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 "simgrid/s4u/VirtualMachine.hpp"
7 #include "src/simix/ActorImpl.hpp"
8 #include "src/surf/HostImpl.hpp"
9 #include <algorithm>
10 #include <deque>
11 #include <unordered_map>
12
13 #ifndef VM_INTERFACE_HPP_
14 #define VM_INTERFACE_HPP_
15
16 #define GUESTOS_NOISE 100 // This value corresponds to the cost of the global action associated to the VM
17                           // It corresponds to the cost of a VM running no tasks.
18
19 namespace simgrid {
20 namespace vm {
21
22 /************
23  * Resource *
24  ************/
25
26 /** @ingroup SURF_vm_interface
27  * @brief SURF VM interface class
28  * @details A VM represent a virtual machine
29  */
30 class XBT_PUBLIC VirtualMachineImpl : public surf::HostImpl, public simgrid::xbt::Extendable<VirtualMachineImpl> {
31   friend simgrid::s4u::VirtualMachine;
32
33 public:
34   explicit VirtualMachineImpl(s4u::VirtualMachine* piface, s4u::Host* host, int core_amount, size_t ramsize);
35   ~VirtualMachineImpl();
36
37   /** @brief Callbacks fired after VM creation. Signature: `void(VirtualMachineImpl*)` */
38   static xbt::signal<void(simgrid::vm::VirtualMachineImpl*)> on_creation;
39   /** @brief Callbacks fired after VM destruction. Signature: `void(VirtualMachineImpl*)` */
40   static xbt::signal<void(simgrid::vm::VirtualMachineImpl*)> on_destruction;
41   /** @brief Callbacks after VM State changes. Signature: `void(VirtualMachineImpl*)` */
42   static xbt::signal<void(simgrid::vm::VirtualMachineImpl*)> on_state_change;
43
44   virtual void suspend(kernel::actor::ActorImpl* issuer);
45   virtual void resume();
46   virtual void shutdown(kernel::actor::ActorImpl* issuer);
47
48   /** @brief Change the physical host on which the given VM is running */
49   virtual void set_physical_host(s4u::Host* dest);
50   /** @brief Get the physical host on which the given VM is running */
51   s4u::Host* get_physical_host() { return physical_host_; }
52
53   sg_size_t get_ramsize() { return ramsize_; }
54   void set_ramsize(sg_size_t ramsize) { ramsize_ = ramsize; }
55
56   s4u::VirtualMachine::state get_state() { return vm_state_; }
57   void set_state(s4u::VirtualMachine::state state) { vm_state_ = state; }
58
59   int get_core_amount() { return core_amount_; }
60
61   virtual void set_bound(double bound);
62
63   /* The vm object of the lower layer */
64   kernel::resource::Action* action_ = nullptr;
65   static std::deque<s4u::VirtualMachine*> allVms_;
66   bool is_migrating_ = false;
67   int active_tasks_ = 0;
68
69   void update_action_weight();
70
71 private:
72   s4u::Host* physical_host_;
73   int core_amount_;
74   double user_bound_;
75   size_t ramsize_            = 0;
76   s4u::VirtualMachine::state vm_state_ = s4u::VirtualMachine::state::CREATED;
77 };
78
79 /*********
80  * Model *
81  *********/
82 /** @ingroup SURF_vm_interface
83  * @brief SURF VM model interface class
84  * @details A model is an object which handle the interactions between its Resources and its Actions
85  */
86 class XBT_PRIVATE VMModel : public surf::HostModel {
87 public:
88   VMModel();
89
90   double next_occuring_event(double now) override;
91   void update_actions_state(double /*now*/, double /*delta*/) override{};
92 };
93 }
94 }
95
96 XBT_PUBLIC_DATA simgrid::vm::VMModel* surf_vm_model;
97
98 #endif /* VM_INTERFACE_HPP_ */