X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/79a679e4a184d17d8029fefa1e022cfbbebac88c..596e36117322c22fd31372e7803bc197bcd4a016:/src/kernel/resource/DiskImpl.hpp 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_; }