X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/26cedf483e8d0abd14a53797eb28d6d1d477e913..4bf353490f2324e8df2e3fa9f9d51e585a8dfca7:/src/plugins/vm/s4u_VirtualMachine.cpp diff --git a/src/plugins/vm/s4u_VirtualMachine.cpp b/src/plugins/vm/s4u_VirtualMachine.cpp index f1bc4f79b6..88d7f498b9 100644 --- a/src/plugins/vm/s4u_VirtualMachine.cpp +++ b/src/plugins/vm/s4u_VirtualMachine.cpp @@ -1,9 +1,10 @@ -/* Copyright (c) 2015-2020. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2015-2021. The SimGrid Team. All rights reserved. */ /* 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 "simgrid/Exception.hpp" +#include "simgrid/kernel/routing/NetPoint.hpp" #include "simgrid/s4u/Actor.hpp" #include "simgrid/vm.h" #include "src/include/surf/surf.hpp" @@ -29,7 +30,8 @@ VirtualMachine::VirtualMachine(const std::string& name, s4u::Host* physical_host } VirtualMachine::VirtualMachine(const std::string& name, s4u::Host* physical_host, int core_amount, size_t ramsize) - : Host(name), pimpl_vm_(new vm::VirtualMachineImpl(this, physical_host, core_amount, ramsize)) + : Host(new vm::VirtualMachineImpl(name, this, physical_host, core_amount, ramsize)) + , pimpl_vm_(dynamic_cast(Host::get_impl())) { XBT_DEBUG("Create VM %s", get_cname()); @@ -41,21 +43,23 @@ VirtualMachine::VirtualMachine(const std::string& name, s4u::Host* physical_host for (int i = 0; i < physical_host->get_pstate_count(); i++) speeds.push_back(physical_host->get_pstate_speed(i)); - surf_cpu_model_vm->create_cpu(this, speeds, core_amount); + physical_host->get_netpoint() + ->get_englobing_zone() + ->get_cpu_vm_model() + ->create_cpu(this, speeds) + ->set_core_count(core_amount) + ->seal(); + if (physical_host->get_pstate() != 0) set_pstate(physical_host->get_pstate()); - // Real hosts are (only) created through NetZone::create_host(), and this where the on_creation signal is fired. - // VMs are created directly, thus firing the signal here. The right solution is probably to separate Host and VM. - simgrid::s4u::Host::on_creation(*this); + seal(); // seal this host } VirtualMachine::~VirtualMachine() { on_destruction(*this); - XBT_DEBUG("destroy %s", get_cname()); - /* Don't free these things twice: they are the ones of my physical host */ set_netpoint(nullptr); } @@ -122,8 +126,13 @@ void VirtualMachine::destroy() /* First, terminate all processes on the VM if necessary */ shutdown(); + XBT_DEBUG("destroy %s", get_cname()); + /* Then, destroy the VM object */ - Host::destroy(); + kernel::actor::simcall([this]() { + get_impl()->destroy(); + delete this; + }); } simgrid::s4u::Host* VirtualMachine::get_pm() const @@ -184,8 +193,8 @@ VirtualMachine* VirtualMachine::set_bound(double bound) return this; } -} // namespace simgrid } // namespace s4u +} // namespace simgrid /* **************************** Public C interface *************************** */ @@ -279,12 +288,13 @@ void sg_vm_resume(sg_vm_t vm) /** @brief Immediately kills all processes within the given VM. * @beginrst - + The memory allocated by these actors is leaked, unless you used :cpp:func:`simgrid::s4u::Actor::on_exit`. - + @endrst - * - * No extra delay occurs by default. You may let your actor sleep by a specific amount to simulate any extra delay that you want. + * + * No extra delay occurs by default. You may let your actor sleep by a specific amount to simulate any extra delay that + you want. */ void sg_vm_shutdown(sg_vm_t vm) {