X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/c4b7bad9496047f71e12b920ee69366769686018..130f51aeb55bd3bf2706c1f5b09ca59fa291c087:/include/simgrid/plugins/jbod.hpp diff --git a/include/simgrid/plugins/jbod.hpp b/include/simgrid/plugins/jbod.hpp index 5c84e91927..202ec3c45e 100644 --- a/include/simgrid/plugins/jbod.hpp +++ b/include/simgrid/plugins/jbod.hpp @@ -10,15 +10,15 @@ namespace simgrid::plugin { +class Jbod; +using JbodPtr = boost::intrusive_ptr; class JbodIo; -/** Smart pointer to a simgrid::s4u::Activity */ using JbodIoPtr = boost::intrusive_ptr; -XBT_PUBLIC void intrusive_ptr_release(const JbodIo* io); -XBT_PUBLIC void intrusive_ptr_add_ref(const JbodIo* io); -class Jbod : public s4u::Host { +class Jbod { public: enum class RAID {RAID0 = 0, RAID1 = 1, RAID4 = 4 , RAID5 = 5, RAID6 = 6}; + s4u::Host* get_controller() const { return controller_; } int get_parity_disk_idx() { return parity_disk_idx_; } void update_parity_disk_idx() { parity_disk_idx_ = (parity_disk_idx_- 1) % num_disks_; } @@ -30,20 +30,33 @@ public: JbodIoPtr write_async(sg_size_t size); sg_size_t write(sg_size_t size); - static Jbod* create_jbod(s4u::NetZone* zone, const std::string& name, double speed, unsigned int num_disks, - RAID raid_level, double read_bandwidth, double write_bandwidth); + static JbodPtr create_jbod(s4u::NetZone* zone, const std::string& name, double speed, unsigned int num_disks, + RAID raid_level, double read_bandwidth, double write_bandwidth); protected: + void set_controller(s4u::Host* host) { controller_ = host; } void set_num_disks(unsigned int num_disks) { num_disks_ = num_disks; } void set_parity_disk_idx(unsigned int index) { parity_disk_idx_ = index; } void set_read_disk_idx(int index) { read_disk_idx_ = index; } void set_raid_level(RAID raid_level) { raid_level_ = raid_level; } private: + s4u::Host* controller_; unsigned int num_disks_; RAID raid_level_; unsigned int parity_disk_idx_; int read_disk_idx_; + std::atomic_int_fast32_t refcount_{1}; +#ifndef DOXYGEN + friend void intrusive_ptr_release(Jbod* jbod) + { + if (jbod->refcount_.fetch_sub(1, std::memory_order_release) == 1) { + std::atomic_thread_fence(std::memory_order_acquire); + delete jbod; + } + } + friend void intrusive_ptr_add_ref(Jbod* jbod) { jbod->refcount_.fetch_add(1, std::memory_order_relaxed); } +#endif }; class JbodIo { @@ -74,5 +87,11 @@ public: #endif }; +/* Refcounting functions */ +XBT_PUBLIC void intrusive_ptr_release(const Jbod* io); +XBT_PUBLIC void intrusive_ptr_add_ref(const Jbod* io); +XBT_PUBLIC void intrusive_ptr_release(const JbodIo* io); +XBT_PUBLIC void intrusive_ptr_add_ref(const JbodIo* io); + } // namespace simgrid::plugin -#endif \ No newline at end of file +#endif