Fork Vasum on GitHub Official Vasum Wiki on Tizen.org
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
request-queue.hpp
Go to the documentation of this file.
1 /*
2 * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
3 *
4 * Contact: Jan Olszak <j.olszak@samsung.com>
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License
17 */
18 
25 #ifndef CARGO_IPC_INTERNALS_REQUEST_QUEUE_HPP
26 #define CARGO_IPC_INTERNALS_REQUEST_QUEUE_HPP
27 
28 #include "cargo-ipc/exception.hpp"
29 #include "utils/eventfd.hpp"
30 #include "logger/logger.hpp"
31 
32 #include <list>
33 #include <memory>
34 #include <mutex>
35 #include <algorithm>
36 
37 namespace cargo {
38 namespace ipc {
39 
43 template<typename RequestIdType>
44 class RequestQueue {
45 public:
46  RequestQueue() = default;
47 
48  RequestQueue(const RequestQueue&) = delete;
49  RequestQueue& operator=(const RequestQueue&) = delete;
50 
51  struct Request {
52  Request(const Request& other) = delete;
53  Request& operator=(const Request&) = delete;
54 
55  Request(Request&&) = default;
56  Request(const RequestIdType requestID, const std::shared_ptr<void>& data)
57  : requestID(requestID),
58  data(data)
59  {}
60 
61  template<typename DataType>
62  std::shared_ptr<DataType> get()
63  {
64  return std::static_pointer_cast<DataType>(data);
65  }
66 
67  RequestIdType requestID;
68  std::shared_ptr<void> data;
69  };
70 
74  int getFD();
75 
79  bool isEmpty();
80 
87  void pushBack(const RequestIdType requestID,
88  const std::shared_ptr<void>& data = nullptr);
89 
96  void pushFront(const RequestIdType requestID,
97  const std::shared_ptr<void>& data = nullptr);
98 
102  Request pop();
103 
110  template<typename Predicate>
111  bool removeIf(Predicate predicate);
112 
113 private:
114  typedef std::unique_lock<std::mutex> Lock;
115 
116  std::list<Request> mRequests;
117  std::mutex mStateMutex;
119 };
120 
121 template<typename RequestIdType>
123 {
124  Lock lock(mStateMutex);
125  return mEventFD.getFD();
126 }
127 
128 template<typename RequestIdType>
130 {
131  Lock lock(mStateMutex);
132  return mRequests.empty();
133 }
134 
135 template<typename RequestIdType>
136 void RequestQueue<RequestIdType>::pushBack(const RequestIdType requestID,
137  const std::shared_ptr<void>& data)
138 {
139  Lock lock(mStateMutex);
140  Request request(requestID, data);
141  mRequests.push_back(std::move(request));
142  mEventFD.send();
143 }
144 
145 template<typename RequestIdType>
146 void RequestQueue<RequestIdType>::pushFront(const RequestIdType requestID,
147  const std::shared_ptr<void>& data)
148 {
149  Lock lock(mStateMutex);
150  Request request(requestID, data);
151  mRequests.push_front(std::move(request));
152  mEventFD.send();
153 }
154 
155 template<typename RequestIdType>
157 {
158  Lock lock(mStateMutex);
159  mEventFD.receive();
160  if (mRequests.empty()) {
161  const std::string msg = "Request queue is empty";
162  LOGE(msg);
163  throw IPCException(msg);
164  }
165  Request request = std::move(mRequests.front());
166  mRequests.pop_front();
167  return request;
168 }
169 
170 template<typename RequestIdType>
171 template<typename Predicate>
172 bool RequestQueue<RequestIdType>::removeIf(Predicate predicate)
173 {
174  Lock lock(mStateMutex);
175  auto it = std::find_if(mRequests.begin(), mRequests.end(), predicate);
176  if (it == mRequests.end()) {
177  return false;
178  }
179 
180  do {
181  it = mRequests.erase(it);
182  it = std::find_if(it, mRequests.end(), predicate);
183  } while (it != mRequests.end());
184 
185  return true;
186 }
187 } // namespace ipc
188 } // namespace cargo
189 
190 #endif // CARGO_IPC_INTERNALS_REQUEST_QUEUE_HPP
void pushFront(const RequestIdType requestID, const std::shared_ptr< void > &data=nullptr)
Push data to back of the queue.
Definition: request-queue.hpp:146
RequestQueue & operator=(const RequestQueue &)=delete
Class for managing a queue of Requests carrying any data.
Definition: request-queue.hpp:44
#define LOGE(MESSAGE)
Logging errors.
Definition: logger.hpp:140
int getFD()
Definition: request-queue.hpp:122
std::mutex mStateMutex
Definition: request-queue.hpp:117
void pushBack(const RequestIdType requestID, const std::shared_ptr< void > &data=nullptr)
Push data to back of the queue.
Definition: request-queue.hpp:136
Definition: eventfd.hpp:30
Definition: request-queue.hpp:51
char data[368]
Definition: initctl.cpp:41
Request(const Request &other)=delete
bool isEmpty()
Definition: request-queue.hpp:129
std::unique_lock< std::mutex > Lock
Definition: request-queue.hpp:114
Request(const RequestIdType requestID, const std::shared_ptr< void > &data)
Definition: request-queue.hpp:56
Request pop()
Definition: request-queue.hpp:156
utils::EventFD mEventFD
Definition: request-queue.hpp:118
Definition: exception.hpp:39
RequestIdType requestID
Definition: request-queue.hpp:67
Request & operator=(const Request &)=delete
bool removeIf(Predicate predicate)
Remove elements from the queue when the predicate returns true.
Definition: request-queue.hpp:172
std::shared_ptr< void > data
Definition: request-queue.hpp:68
Exceptions for the IPC.
std::list< Request > mRequests
Definition: request-queue.hpp:116
Eventfd wrapper.