13#include <l4/cxx/unique_ptr>
15namespace Block_device {
63inline Pending_request::~Pending_request() =
default;
67 virtual ~Request_queue() = 0;
75 virtual void add_to_queue(cxx::unique_ptr<Pending_request> &&request) = 0;
93 virtual void process_pending() = 0;
96 virtual bool empty()
const = 0;
99inline Request_queue::~Request_queue() =
default;
107 bool empty()
const override {
return _queue.empty(); }
109 void add_to_queue(cxx::unique_ptr<Pending_request> &&request)
override
110 { _queue.emplace_back(std::move(request)); }
114 for (
auto it = _queue.begin(); it != _queue.end();)
116 if ((*it)->is_owner(owner))
119 (*it)->fail_request();
120 it = _queue.erase(it);
127 void process_pending()
override
129 while (!_queue.empty())
131 auto &front = _queue.front();
132 int ret = front->handle_request();
148 std::deque<cxx::unique_ptr<Pending_request>> _queue;
Simple request queue implementation based on a linked list.
@ L4_EBUSY
Object currently busy, try later.
Base class for object that can be owner of a pending request.
Interface for pending requests that can be queued.
virtual void fail_request()=0
Callback used when a request is dropped from the queue.
virtual bool is_owner(Owner *owner)=0
Check if somebody is owner of this request.
virtual int handle_request()=0
Callback used when the request is ready for processing.