X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/f7f97f7369be31efa83102c6718adb88ce2f9c01..a707ad979be7c88d7581f403661c67598d320d55:/include/simgrid/s4u/Disk.hpp diff --git a/include/simgrid/s4u/Disk.hpp b/include/simgrid/s4u/Disk.hpp index 5f395d667e..671c4e31b9 100644 --- a/include/simgrid/s4u/Disk.hpp +++ b/include/simgrid/s4u/Disk.hpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2019-2021. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2019-2022. The SimGrid Team. All rights reserved. */ /* 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. */ @@ -30,9 +30,11 @@ namespace s4u { */ class XBT_PUBLIC Disk : public xbt::Extendable { +#ifndef DOXYGEN friend Engine; friend Io; friend kernel::resource::DiskImpl; +#endif explicit Disk(kernel::resource::DiskImpl* pimpl) : pimpl_(pimpl) {} virtual ~Disk() = default; @@ -55,6 +57,17 @@ public: Disk* set_write_bandwidth(double write_bw); double get_write_bandwidth() const; + /** + * @brief Set limit for read/write operations. + * + * This determines the limit for read and write operation in the same disk. + * Usually, it's configured to max(read_bw, write_bw). + * You can change this behavior using this method + * + * @param bw New bandwidth for the disk + */ + Disk* set_readwrite_bandwidth(double bw); + const std::unordered_map* get_properties() const; const char* get_property(const std::string& key) const; Disk* set_property(const std::string&, const std::string& value); @@ -71,18 +84,58 @@ public: IoPtr read_async(sg_size_t size) const; sg_size_t read(sg_size_t size) const; + sg_size_t read(sg_size_t size, double priority) const; IoPtr write_async(sg_size_t size) const; sg_size_t write(sg_size_t size) const; + sg_size_t write(sg_size_t size, double priority) const; + + /** @brief Policy for sharing the disk among activities */ + enum class SharingPolicy { NONLINEAR = 1, LINEAR = 0 }; + enum class Operation { READ = 2, WRITE = 1, READWRITE = 0 }; + + /** + * @brief Describes how the disk is shared between activities for each operation + * + * Disks have different bandwidths for read and write operations, that can have different policies: + * - Read: resource sharing for read operation + * - Write: resource sharing for write + * - ReadWrite: global sharing for read and write operations + * + * Note that the NONLINEAR callback is in the critical path of the solver, so it should be fast. + * + * @param op Operation type + * @param policy Sharing policy + * @param cb Callback for NONLINEAR policies + */ + Disk* set_sharing_policy(Operation op, SharingPolicy policy, const s4u::NonLinearResourceCb& cb = {}); + SharingPolicy get_sharing_policy(Operation op) const; + /** + * @brief Callback to set IO factors + * + * This callback offers a flexible way to create variability in I/O operations + * + * @param size I/O operation size in bytes + * @param op I/O operation type: read or write + * @return Multiply factor + */ + using IoFactorCb = double(sg_size_t size, Io::OpType op); + /** @brief Configure the factor callback */ + Disk* set_factor_cb(const std::function& cb); Disk* seal(); /* The signals */ - /** @brief Callback signal fired when a new Disk is created */ + /** @brief Add a callback fired when a new Disk is created */ + static void on_creation_cb(const std::function& cb) { on_creation.connect(cb); } + /** @brief Add a callback fired when a Disk is destroyed */ + static void on_destruction_cb(const std::function& cb) { on_destruction.connect(cb); } + /** @brief Add a callback fired when a Disk's state changes */ + static void on_state_change_cb(const std::function& cb) { on_state_change.connect(cb); } + +private: static xbt::signal on_creation; - /** @brief Callback signal fired when a Disk is destroyed */ static xbt::signal on_destruction; - /** @brief Callback signal fired when a Disk's state changes */ static xbt::signal on_state_change; };