From cc9460b0958168a1f9adec8208d190bf128ce6cc Mon Sep 17 00:00:00 2001 From: Martin Quinson Date: Sun, 28 Aug 2016 22:32:12 +0200 Subject: [PATCH 1/1] Use a deque instead of an intrusive hook for all VMs - This is much simpler this way. - Also, put it in the VirtualMachine class, not the Model one. --- src/surf/HostImpl.cpp | 14 +++----------- src/surf/virtual_machine.cpp | 7 ++++--- src/surf/virtual_machine.hpp | 11 +++-------- src/surf/vm_hl13.cpp | 3 +-- 4 files changed, 11 insertions(+), 24 deletions(-) diff --git a/src/surf/HostImpl.cpp b/src/surf/HostImpl.cpp index 010d3198b7..d4ae879136 100644 --- a/src/surf/HostImpl.cpp +++ b/src/surf/HostImpl.cpp @@ -44,11 +44,8 @@ HostImpl *HostModel::createHost(const char *name, kernel::routing::NetCard *netE void HostModel::adjustWeightOfDummyCpuActions() { /* iterate for all virtual machines */ - for (VMModel::vm_list_t::iterator iter = - VMModel::ws_vms.begin(); - iter != VMModel::ws_vms.end(); ++iter) { + for (VirtualMachine *ws_vm : VirtualMachine::allVms_) { - VirtualMachine *ws_vm = &*iter; Cpu *cpu = ws_vm->p_cpu; int is_active = lmm_constraint_used(cpu->getModel()->getMaxminSystem(), cpu->getConstraint()); @@ -379,13 +376,8 @@ xbt_dynar_t HostImpl::getVms() { xbt_dynar_t dyn = xbt_dynar_new(sizeof(simgrid::surf::VirtualMachine*), nullptr); - /* iterate for all virtual machines */ - for (simgrid::surf::VMModel::vm_list_t::iterator iter = - simgrid::surf::VMModel::ws_vms.begin(); - iter != simgrid::surf::VMModel::ws_vms.end(); ++iter) { - - simgrid::surf::VirtualMachine *ws_vm = &*iter; - if (this == ws_vm->getPm()->extension(simgrid::surf::HostImpl::EXTENSION_ID)) + for (VirtualMachine *ws_vm : VirtualMachine::allVms_) { + if (this == ws_vm->getPm()->extension()) xbt_dynar_push(dyn, &ws_vm); } diff --git a/src/surf/virtual_machine.cpp b/src/surf/virtual_machine.cpp index 5e333c01ae..1666df5034 100644 --- a/src/surf/virtual_machine.cpp +++ b/src/surf/virtual_machine.cpp @@ -28,7 +28,7 @@ simgrid::xbt::signal onVmStateChange; * Model * *********/ -VMModel::vm_list_t VMModel::ws_vms; +std::deque VirtualMachine::allVms_; /************ * Resource * @@ -38,7 +38,7 @@ VirtualMachine::VirtualMachine(HostModel *model, const char *name, simgrid::s4u: : HostImpl(model, name, nullptr, nullptr, nullptr) , hostPM_(hostPM) { - VMModel::ws_vms.push_back(*this); + allVms_.push_back(this); piface = simgrid::s4u::Host::by_name_or_create(name); piface->extension_set(this); } @@ -49,7 +49,8 @@ VirtualMachine::VirtualMachine(HostModel *model, const char *name, simgrid::s4u: VirtualMachine::~VirtualMachine() { onVmDestruction(this); - VMModel::ws_vms.erase(VMModel::vm_list_t::s_iterator_to(*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"); diff --git a/src/surf/virtual_machine.hpp b/src/surf/virtual_machine.hpp index d5cc175ef9..d75e48029f 100644 --- a/src/surf/virtual_machine.hpp +++ b/src/surf/virtual_machine.hpp @@ -4,6 +4,7 @@ /* 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 #include @@ -89,11 +90,10 @@ public: e_surf_vm_state_t getState(); void setState(e_surf_vm_state_t state); + static std::deque allVms_; + protected: e_surf_vm_state_t p_vm_state = SURF_VM_STATE_CREATED; - -public: - boost::intrusive::list_member_hook<> vm_hook; }; /********* @@ -116,11 +116,6 @@ public: */ virtual s4u::Host *createVM(const char *name, sg_host_t host_PM)=0; void adjustWeightOfDummyCpuActions() {}; - - typedef boost::intrusive::member_hook< - VirtualMachine, boost::intrusive::list_member_hook<>, &VirtualMachine::vm_hook> VmOptions; - typedef boost::intrusive::list > vm_list_t; - static vm_list_t ws_vms; }; } diff --git a/src/surf/vm_hl13.cpp b/src/surf/vm_hl13.cpp index 532892113b..9dd72aae81 100644 --- a/src/surf/vm_hl13.cpp +++ b/src/surf/vm_hl13.cpp @@ -67,8 +67,7 @@ double VMHL13Model::next_occuring_event(double now) **/ /* iterate for all virtual machines */ - for (VMModel::vm_list_t::iterator iter = VMModel::ws_vms.begin(); iter != VMModel::ws_vms.end(); ++iter) { - VirtualMachine *ws_vm = &*iter; + for (VirtualMachine *ws_vm : VirtualMachine::allVms_) { Cpu *cpu = ws_vm->p_cpu; xbt_assert(cpu, "cpu-less host"); -- 2.20.1