L4Re Operating System Framework – Interface and Usage Documentation
Loading...
Searching...
No Matches
request_queue.h
1/*
2 * Copyright (C) 2019-2020 Kernkonzept GmbH.
3 * Author(s): Sarah Hoffmann <sarah.hoffmann@kernkonzept.com>
4 *
5 * This file is distributed under the terms of the GNU General Public
6 * License, version 2. Please see the COPYING-GPL-2 file for details.
7 */
8#pragma once
9
10#include <functional>
11#include <deque>
12
13#include <l4/cxx/unique_ptr>
14
15namespace Block_device {
16
21{
29 struct Owner {};
30
31 virtual ~Pending_request() = 0;
32
43 virtual int handle_request() = 0;
44
51 virtual void fail_request() = 0;
52
60 virtual bool is_owner(Owner *owner) = 0;
61};
62
63inline Pending_request::~Pending_request() = default;
64
65struct Request_queue
66{
67 virtual ~Request_queue() = 0;
68
75 virtual void add_to_queue(cxx::unique_ptr<Pending_request> &&request) = 0;
76
88 virtual void drain_queue_for(Pending_request::Owner *owner, bool finalize) = 0;
89
93 virtual void process_pending() = 0;
94
96 virtual bool empty() const = 0;
97};
98
99inline Request_queue::~Request_queue() = default;
100
104class Simple_request_queue : public Request_queue
105{
106public:
107 bool empty() const override { return _queue.empty(); }
108
109 void add_to_queue(cxx::unique_ptr<Pending_request> &&request) override
110 { _queue.emplace_back(std::move(request)); }
111
112 void drain_queue_for(Pending_request::Owner *owner, bool finalize) override
113 {
114 for (auto it = _queue.begin(); it != _queue.end();)
115 {
116 if ((*it)->is_owner(owner))
117 {
118 if (finalize)
119 (*it)->fail_request();
120 it = _queue.erase(it);
121 }
122 else
123 ++it;
124 }
125 }
126
127 void process_pending() override
128 {
129 while (!_queue.empty())
130 {
131 auto &front = _queue.front();
132 int ret = front->handle_request();
133
134 if (ret == -L4_EBUSY)
135 // still no processing unit available, keep element in queue
136 return;
137
138 if (ret >= 0)
139 // request has been sent to hardware
140 front.release();
141
142 // element was processed, remove it from queue
143 _queue.pop_front();
144 }
145 }
146
147private:
148 std::deque<cxx::unique_ptr<Pending_request>> _queue;
149};
150
151} // namespace
Simple request queue implementation based on a linked list.
@ L4_EBUSY
Object currently busy, try later.
Definition err.h:53
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.