| #pragma once |
| |
| #include "MctpEndpoint.hpp" |
| #include "NVMeIntf.hpp" |
| #include "NVMeSubsys.hpp" |
| |
| #include <chrono> |
| #include <memory> |
| |
| class NVMeDevice : public std::enable_shared_from_this<NVMeDevice> |
| { |
| struct Private |
| {}; |
| |
| public: |
| static std::shared_ptr<NVMeDevice> create(const std::string& name, |
| NVMeIntf intf) |
| { |
| return std::make_shared<NVMeDevice>(Private(), name, std::move(intf)); |
| } |
| |
| static std::shared_ptr<NVMeDevice> |
| create(boost::asio::io_context& io, const std::string& name, |
| const std::shared_ptr<MctpDevice>& dev, NVMeIntf intf, |
| std::chrono::seconds gracePeriod = std::chrono::seconds(5)) |
| { |
| return std::make_shared<NVMeDevice>(Private(), io, name, dev, |
| std::move(intf), gracePeriod); |
| } |
| NVMeDevice(Private /*unused*/, const std::string& name, NVMeIntf intf) : |
| name(name), intf(std::move(intf)) |
| {} |
| NVMeDevice(Private /*unused*/, boost::asio::io_context& io, |
| const std::string& name, const std::shared_ptr<MctpDevice>& dev, |
| NVMeIntf intf, std::chrono::seconds gracePeriod) : |
| name(name), dev(dev), intf(std::move(intf)), timer(io), |
| gracePeriod{gracePeriod} |
| {} |
| ~NVMeDevice() = default; |
| void start(); |
| void stop(); |
| |
| private: |
| void setup(); |
| void restart(); |
| void degraded(const std::shared_ptr<MctpEndpoint>& ep); |
| void available(const std::shared_ptr<MctpEndpoint>& ep); |
| void removed(const std::shared_ptr<MctpEndpoint>& ep); |
| void finalize(const std::error_code& ec, |
| const std::shared_ptr<MctpEndpoint>& ep); |
| |
| std::string name; |
| std::shared_ptr<MctpDevice> dev; |
| NVMeIntf intf; |
| std::optional<boost::asio::steady_timer> timer; |
| std::optional<std::chrono::seconds> gracePeriod; |
| bool recovering{}; |
| bool gracePeriodActive{}; |
| }; |