From: Fred Suter Date: Fri, 6 Oct 2023 19:54:26 +0000 (-0400) Subject: Use Ptr to store disks of a HostImpl, do not care about cleanup anymore X-Git-Tag: v3.35~95 X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/9db79d70d969bdb58f26c689ad4f965b3d9e80cf?ds=sidebyside Use Ptr to store disks of a HostImpl, do not care about cleanup anymore --- diff --git a/include/simgrid/forward.h b/include/simgrid/forward.h index 85fe6a71a4..2c1da4f7f1 100644 --- a/include/simgrid/forward.h +++ b/include/simgrid/forward.h @@ -197,6 +197,7 @@ class StandardLinkImpl; class SplitDuplexLinkImpl; class NetworkAction; class DiskImpl; +using DiskImplPtr = boost::intrusive_ptr; class DiskModel; class VirtualMachineImpl; class VMModel; diff --git a/src/kernel/resource/DiskImpl.hpp b/src/kernel/resource/DiskImpl.hpp index 55f6857cdd..a1bdb8ae50 100644 --- a/src/kernel/resource/DiskImpl.hpp +++ b/src/kernel/resource/DiskImpl.hpp @@ -50,6 +50,7 @@ class DiskImpl : public Resource_T, public xbt::PropertyHolder { Metric read_bw_ = {0.0, 0, nullptr}; Metric write_bw_ = {0.0, 0, nullptr}; double readwrite_bw_ = -1; /* readwrite constraint bound, usually max(read, write) */ + std::atomic_int_fast32_t refcount_{0}; void apply_sharing_policy_cfg(); @@ -60,6 +61,17 @@ public: explicit DiskImpl(const std::string& name, double read_bandwidth, double write_bandwidth); DiskImpl(const DiskImpl&) = delete; DiskImpl& operator=(const DiskImpl&) = delete; + friend void intrusive_ptr_add_ref(DiskImpl* disk) + { + disk->refcount_.fetch_add(1, std::memory_order_acq_rel); + } + friend void intrusive_ptr_release(DiskImpl* disk) + { + if (disk->refcount_.fetch_sub(1, std::memory_order_release) == 1) { + std::atomic_thread_fence(std::memory_order_acquire); + delete disk; + } + } /** @brief Public interface */ const s4u::Disk* get_iface() const { return &piface_; } diff --git a/src/kernel/resource/HostImpl.cpp b/src/kernel/resource/HostImpl.cpp index 614bf9e387..4a0c728943 100644 --- a/src/kernel/resource/HostImpl.cpp +++ b/src/kernel/resource/HostImpl.cpp @@ -53,9 +53,6 @@ HostImpl::~HostImpl() delete arg; actors_at_boot_.clear(); - for (auto const& [_, d] : disks_) - d->destroy(); - for (auto const& [_, vm] : vms_) vm->vm_destroy(); } @@ -216,7 +213,7 @@ s4u::Disk* HostImpl::create_disk(const std::string& name, double read_bandwidth, void HostImpl::add_disk(const s4u::Disk* disk) { - disks_[disk->get_name()] = disk->get_impl(); + disks_[disk->get_name()] = kernel::resource::DiskImplPtr(disk->get_impl()); } void HostImpl::remove_disk(const std::string& name) diff --git a/src/kernel/resource/HostImpl.hpp b/src/kernel/resource/HostImpl.hpp index 0de2d0b4be..2701e3bf51 100644 --- a/src/kernel/resource/HostImpl.hpp +++ b/src/kernel/resource/HostImpl.hpp @@ -49,7 +49,7 @@ class XBT_PRIVATE HostImpl : public xbt::PropertyHolder, public actor::ObjectAcc ActorList actor_list_; std::vector actors_at_boot_; s4u::Host piface_; - std::map> disks_; + std::map> disks_; std::map> vms_; std::string name_{"noname"}; routing::NetZoneImpl* englobing_zone_ = nullptr;