+ pimpl_netpoint = nullptr;
+
+ if (TRACE_msg_vm_is_enabled()) {
+ container_t container = simgrid::instr::Container::byName(getName());
+ container->removeFromParent();
+ delete container;
+ }
+}
+
+void VirtualMachine::start()
+{
+ if (TRACE_msg_vm_is_enabled())
+ simgrid::instr::Container::byName(getName())->getState("MSG_VM_STATE")->pushEvent("start");
+
+ simgrid::simix::kernelImmediate([this]() {
+ simgrid::vm::VmHostExt::ensureVmExtInstalled();
+
+ simgrid::s4u::Host* pm = this->pimpl_vm_->getPm();
+ if (pm->extension<simgrid::vm::VmHostExt>() == nullptr)
+ pm->extension_set(new simgrid::vm::VmHostExt());
+
+ long pm_ramsize = pm->extension<simgrid::vm::VmHostExt>()->ramsize;
+ int pm_overcommit = pm->extension<simgrid::vm::VmHostExt>()->overcommit;
+ long vm_ramsize = this->getRamsize();
+
+ if (pm_ramsize && not pm_overcommit) { /* Only verify that we don't overcommit on need */
+ /* Retrieve the memory occupied by the VMs on that host. Yep, we have to traverse all VMs of all hosts for that */
+ long total_ramsize_of_vms = 0;
+ for (simgrid::s4u::VirtualMachine* const& ws_vm : simgrid::vm::VirtualMachineImpl::allVms_)
+ if (pm == ws_vm->getPm())
+ total_ramsize_of_vms += ws_vm->getRamsize();
+
+ if (vm_ramsize > pm_ramsize - total_ramsize_of_vms) {
+ XBT_WARN("cannnot start %s@%s due to memory shortage: vm_ramsize %ld, free %ld, pm_ramsize %ld (bytes).",
+ this->getCname(), pm->getCname(), vm_ramsize, pm_ramsize - total_ramsize_of_vms, pm_ramsize);
+ THROWF(vm_error, 0, "Memory shortage on host '%s', VM '%s' cannot be started", pm->getCname(),
+ this->getCname());
+ }
+ }
+
+ this->pimpl_vm_->setState(SURF_VM_STATE_RUNNING);
+ });
+
+ if (TRACE_msg_vm_is_enabled())
+ simgrid::instr::Container::byName(getName())->getState("MSG_VM_STATE")->popEvent();
+}
+
+void VirtualMachine::suspend()
+{
+ smx_actor_t issuer = SIMIX_process_self();
+ simgrid::simix::kernelImmediate([this, issuer]() { pimpl_vm_->suspend(issuer); });
+ if (TRACE_msg_vm_is_enabled())
+ simgrid::instr::Container::byName(getName())->getState("MSG_VM_STATE")->pushEvent("suspend");
+ XBT_DEBUG("vm_suspend done");
+}
+
+void VirtualMachine::resume()
+{
+ pimpl_vm_->resume();
+ if (TRACE_msg_vm_is_enabled())
+ simgrid::instr::Container::byName(getName())->getState("MSG_VM_STATE")->popEvent();
+}
+
+void VirtualMachine::shutdown()
+{
+ smx_actor_t issuer = SIMIX_process_self();
+ simgrid::simix::kernelImmediate([this, issuer]() { pimpl_vm_->shutdown(issuer); });
+}
+
+void VirtualMachine::destroy()
+{
+ if (isMigrating())
+ THROWF(vm_error, 0, "Cannot destroy VM '%s', which is migrating.", getCname());
+
+ /* First, terminate all processes on the VM if necessary */
+ shutdown();
+
+ /* Then, destroy the VM object */
+ Host::destroy();