Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Use a deque instead of an intrusive hook for all VMs
[simgrid.git] / src / surf / virtual_machine.cpp
1 /* Copyright (c) 2013-2015. The SimGrid Team.
2  * All rights reserved.                                                     */
3
4 /* This program is free software; you can redistribute it and/or modify it
5  * under the terms of the license (GNU LGPL) which comes with this package. */
6
7 #include <xbt/signal.hpp>
8
9 #include "cpu_cas01.hpp"
10 #include "virtual_machine.hpp"
11
12 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_vm, surf, "Logging specific to the SURF VM module");
13
14 simgrid::surf::VMModel *surf_vm_model = nullptr;
15
16 namespace simgrid {
17 namespace surf {
18
19 /*************
20  * Callbacks *
21  *************/
22
23 simgrid::xbt::signal<void(simgrid::surf::VirtualMachine*)> onVmCreation;
24 simgrid::xbt::signal<void(simgrid::surf::VirtualMachine*)> onVmDestruction;
25 simgrid::xbt::signal<void(simgrid::surf::VirtualMachine*)> onVmStateChange;
26
27 /*********
28  * Model *
29  *********/
30
31 std::deque<VirtualMachine*> VirtualMachine::allVms_;
32
33 /************
34  * Resource *
35  ************/
36
37 VirtualMachine::VirtualMachine(HostModel *model, const char *name, simgrid::s4u::Host *hostPM)
38 : HostImpl(model, name, nullptr, nullptr, nullptr)
39 , hostPM_(hostPM)
40 {
41   allVms_.push_back(this);
42   piface = simgrid::s4u::Host::by_name_or_create(name);
43   piface->extension_set<simgrid::surf::HostImpl>(this);
44 }
45
46 /*
47  * A physical host does not disappear in the current SimGrid code, but a VM may disappear during a simulation.
48  */
49 VirtualMachine::~VirtualMachine()
50 {
51   onVmDestruction(this);
52   allVms_.erase( find(allVms_.begin(), allVms_.end(), this) );
53
54   /* Free the cpu_action of the VM. */
55   XBT_ATTRIB_UNUSED int ret = action_->unref();
56   xbt_assert(ret == 1, "Bug: some resource still remains");
57 }
58
59 e_surf_vm_state_t VirtualMachine::getState() {
60   return p_vm_state;
61 }
62
63 void VirtualMachine::setState(e_surf_vm_state_t state) {
64   p_vm_state = state;
65 }
66 void VirtualMachine::turnOn() {
67   if (isOff()) {
68     Resource::turnOn();
69     onVmStateChange(this);
70   }
71 }
72 void VirtualMachine::turnOff() {
73   if (isOn()) {
74     Resource::turnOff();
75     onVmStateChange(this);
76   }
77 }
78
79 /** @brief returns the physical machine on which the VM is running **/
80 sg_host_t VirtualMachine::getPm() {
81   return hostPM_;
82 }
83
84 }
85 }