X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/9df3f2e0264961bdb73743c3ffcc124ec786d4a8..3e1e1ef3fe28de3204d1c6d60e89f8b2ae0cbb50:/src/surf/virtual_machine.cpp diff --git a/src/surf/virtual_machine.cpp b/src/surf/virtual_machine.cpp index 75017d8790..3b35bf3d14 100644 --- a/src/surf/virtual_machine.cpp +++ b/src/surf/virtual_machine.cpp @@ -4,12 +4,14 @@ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ +#include + #include "cpu_cas01.hpp" #include "virtual_machine.hpp" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_vm, surf, "Logging specific to the SURF VM module"); -simgrid::surf::VMModel *surf_vm_model = NULL; +simgrid::surf::VMModel *surf_vm_model = nullptr; namespace simgrid { namespace surf { @@ -18,26 +20,27 @@ namespace surf { * Callbacks * *************/ -simgrid::xbt::signal VMCreatedCallbacks; -simgrid::xbt::signal VMDestructedCallbacks; -simgrid::xbt::signal VMStateChangedCallbacks; +simgrid::xbt::signal onVmCreation; +simgrid::xbt::signal onVmDestruction; +simgrid::xbt::signal onVmStateChange; /********* * Model * *********/ -VMModel::vm_list_t VMModel::ws_vms; +std::deque VirtualMachine::allVms_; /************ * Resource * ************/ VirtualMachine::VirtualMachine(HostModel *model, const char *name, simgrid::s4u::Host *hostPM) -: HostImpl(model, name, NULL, NULL, NULL) +: HostImpl(model, name, nullptr, nullptr, nullptr) , hostPM_(hostPM) { - VMModel::ws_vms.push_back(*this); - simgrid::s4u::Host::by_name_or_create(name)->extension_set(this); + allVms_.push_back(this); + piface_ = simgrid::s4u::Host::by_name_or_create(name); + piface_->extension_set(this); } /* @@ -45,32 +48,62 @@ VirtualMachine::VirtualMachine(HostModel *model, const char *name, simgrid::s4u: */ VirtualMachine::~VirtualMachine() { - VMDestructedCallbacks(this); - VMModel::ws_vms.erase(VMModel::vm_list_t::s_iterator_to(*this)); + onVmDestruction(this); + allVms_.erase( find(allVms_.begin(), allVms_.end(), this) ); + /* Free the cpu_action of the VM. */ XBT_ATTRIB_UNUSED int ret = action_->unref(); xbt_assert(ret == 1, "Bug: some resource still remains"); } e_surf_vm_state_t VirtualMachine::getState() { - return p_vm_state; + return vmState_; } void VirtualMachine::setState(e_surf_vm_state_t state) { - p_vm_state = state; + vmState_ = state; } void VirtualMachine::turnOn() { if (isOff()) { Resource::turnOn(); - VMStateChangedCallbacks(this); + onVmStateChange(this); } } void VirtualMachine::turnOff() { if (isOn()) { Resource::turnOff(); - VMStateChangedCallbacks(this); + onVmStateChange(this); } } +void VirtualMachine::suspend() +{ + action_->suspend(); + vmState_ = SURF_VM_STATE_SUSPENDED; +} + +void VirtualMachine::resume() +{ + action_->resume(); + vmState_ = SURF_VM_STATE_RUNNING; +} + +void VirtualMachine::save() +{ + vmState_ = SURF_VM_STATE_SAVING; + + /* FIXME: do something here */ + action_->suspend(); + vmState_ = SURF_VM_STATE_SAVED; +} + +void VirtualMachine::restore() +{ + vmState_ = SURF_VM_STATE_RESTORING; + + /* FIXME: do something here */ + action_->resume(); + vmState_ = SURF_VM_STATE_RUNNING; +} /** @brief returns the physical machine on which the VM is running **/ sg_host_t VirtualMachine::getPm() {