X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/9104957deccc59e0e804215d5db498fabfd40d29..9b4e5a12b9e11e584c2c5af4d96e38b8220a72b9:/src/plugins/vm/s4u_VirtualMachine.cpp?ds=sidebyside diff --git a/src/plugins/vm/s4u_VirtualMachine.cpp b/src/plugins/vm/s4u_VirtualMachine.cpp index c689d2dcce..7450b709cd 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,9 +43,18 @@ 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); } VirtualMachine::~VirtualMachine() @@ -119,7 +130,8 @@ void VirtualMachine::destroy() shutdown(); /* Then, destroy the VM object */ - Host::destroy(); + get_impl()->destroy(); + delete this; } simgrid::s4u::Host* VirtualMachine::get_pm() const @@ -127,12 +139,13 @@ simgrid::s4u::Host* VirtualMachine::get_pm() const return pimpl_vm_->get_physical_host(); } -void VirtualMachine::set_pm(simgrid::s4u::Host* pm) +VirtualMachine* VirtualMachine::set_pm(simgrid::s4u::Host* pm) { kernel::actor::simcall([this, pm]() { pimpl_vm_->set_physical_host(pm); }); + return this; } -VirtualMachine::state VirtualMachine::get_state() +VirtualMachine::state VirtualMachine::get_state() const { return kernel::actor::simcall([this]() { return pimpl_vm_->get_state(); }); } @@ -142,9 +155,10 @@ size_t VirtualMachine::get_ramsize() const return pimpl_vm_->get_ramsize(); } -void VirtualMachine::set_ramsize(size_t ramsize) +VirtualMachine* VirtualMachine::set_ramsize(size_t ramsize) { pimpl_vm_->set_ramsize(ramsize); + return this; } /** @brief Set a CPU bound for a given VM. * @ingroup msg_VMs @@ -172,13 +186,14 @@ void VirtualMachine::set_ramsize(size_t ramsize) * 2. Note that bound == 0 means no bound (i.e., unlimited). But, if a host has multiple CPU cores, the CPU share of a * computation task (or a VM) never exceeds the capacity of a CPU core. */ -void VirtualMachine::set_bound(double bound) +VirtualMachine* VirtualMachine::set_bound(double bound) { kernel::actor::simcall([this, bound]() { pimpl_vm_->set_bound(bound); }); + return this; } -} // namespace simgrid } // namespace s4u +} // namespace simgrid /* **************************** Public C interface *************************** */ @@ -224,19 +239,19 @@ void sg_vm_set_bound(sg_vm_t vm, double bound) } /** @brief Returns whether the given VM has just created, not running. */ -int sg_vm_is_created(sg_vm_t vm) +int sg_vm_is_created(const_sg_vm_t vm) { return vm->get_state() == simgrid::s4u::VirtualMachine::state::CREATED; } /** @brief Returns whether the given VM is currently running */ -int sg_vm_is_running(sg_vm_t vm) +int sg_vm_is_running(const_sg_vm_t vm) { return vm->get_state() == simgrid::s4u::VirtualMachine::state::RUNNING; } /** @brief Returns whether the given VM is currently suspended, not running. */ -int sg_vm_is_suspended(sg_vm_t vm) +int sg_vm_is_suspended(const_sg_vm_t vm) { return vm->get_state() == simgrid::s4u::VirtualMachine::state::SUSPENDED; } @@ -272,12 +287,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) {