|  | #pragma once | 
|  |  | 
|  | #include "NVMeContext.hpp" | 
|  | #include "NVMeSensor.hpp" | 
|  |  | 
|  | #include <boost/asio/io_context.hpp> | 
|  | #include <boost/asio/posix/stream_descriptor.hpp> | 
|  |  | 
|  | #include <cstddef> | 
|  | #include <memory> | 
|  | #include <thread> | 
|  |  | 
|  | class NVMeBasicContext : public NVMeContext | 
|  | { | 
|  | public: | 
|  | NVMeBasicContext(boost::asio::io_context& io, int rootBus); | 
|  | ~NVMeBasicContext() override = default; | 
|  | void pollNVMeDevices() override; | 
|  | void readAndProcessNVMeSensor() override; | 
|  | void processResponse(std::shared_ptr<NVMeSensor>& sensor, void* msg, | 
|  | size_t len) override; | 
|  |  | 
|  | private: | 
|  | NVMeBasicContext(boost::asio::io_context& io, int rootBus, int cmdOut, | 
|  | int streamIn, int streamOut, int cmdIn); | 
|  | boost::asio::io_context& io; | 
|  |  | 
|  | // The IO thread must be destructed after the stream descriptors, so | 
|  | // initialise it first. http://eel.is/c++draft/class.base.init#note-6 | 
|  | // | 
|  | // Providing a stop-source to the thread execution function isn't | 
|  | // particularly useful as it will spend most of its time blocked in a system | 
|  | // call - ioctl() for the actual device communication, or read() and write() | 
|  | // on the pipes associated with reqStream and respStream. Rather than trying | 
|  | // to force a stop, rely on read()/write() failures from closed pipes to | 
|  | // coerce it to exit and thus allow completion of the join(). | 
|  | std::jthread thread; | 
|  |  | 
|  | // Destruction of the stream descriptors has the effect of issuing cancel(), | 
|  | // destroying the closure of the callback where we might be carrying | 
|  | // weak_ptrs to `this`. | 
|  | // https://www.boost.org/doc/libs/1_79_0/doc/html/boost_asio/reference/posix__basic_descriptor/_basic_descriptor.html | 
|  | boost::asio::posix::stream_descriptor reqStream; | 
|  | boost::asio::posix::stream_descriptor respStream; | 
|  |  | 
|  | enum | 
|  | { | 
|  | NVME_MI_BASIC_SFLGS_DRIVE_NOT_READY = 0x40, | 
|  | NVME_MI_BASIC_SFLGS_DRIVE_FUNCTIONAL = 0x20, | 
|  | }; | 
|  | }; |