1 /* Copyright (c) 2013-2015. The SimGrid Team.
2 * All rights reserved. */
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. */
7 #include <xbt/signal.hpp>
9 #include "cpu_cas01.hpp"
10 #include "virtual_machine.hpp"
12 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_vm, surf, "Logging specific to the SURF VM module");
14 simgrid::surf::VMModel *surf_vm_model = nullptr;
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;
31 std::deque<VirtualMachine*> VirtualMachine::allVms_;
37 VirtualMachine::VirtualMachine(HostModel *model, const char *name, simgrid::s4u::Host *hostPM)
38 : HostImpl(model, name, nullptr, nullptr, nullptr)
41 allVms_.push_back(this);
42 piface_ = simgrid::s4u::Host::by_name_or_create(name);
43 piface_->extension_set<simgrid::surf::HostImpl>(this);
47 * A physical host does not disappear in the current SimGrid code, but a VM may disappear during a simulation.
49 VirtualMachine::~VirtualMachine()
51 onVmDestruction(this);
52 allVms_.erase( find(allVms_.begin(), allVms_.end(), this) );
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");
59 e_surf_vm_state_t VirtualMachine::getState() {
63 void VirtualMachine::setState(e_surf_vm_state_t state) {
66 void VirtualMachine::turnOn() {
69 onVmStateChange(this);
72 void VirtualMachine::turnOff() {
75 onVmStateChange(this);
78 void VirtualMachine::suspend()
81 vmState_ = SURF_VM_STATE_SUSPENDED;
84 void VirtualMachine::resume()
87 vmState_ = SURF_VM_STATE_RUNNING;
90 void VirtualMachine::save()
92 vmState_ = SURF_VM_STATE_SAVING;
94 /* FIXME: do something here */
96 vmState_ = SURF_VM_STATE_SAVED;
99 void VirtualMachine::restore()
101 vmState_ = SURF_VM_STATE_RESTORING;
103 /* FIXME: do something here */
105 vmState_ = SURF_VM_STATE_RUNNING;
108 /** @brief returns the physical machine on which the VM is running **/
109 sg_host_t VirtualMachine::getPm() {