ewmscp  ..
Public Member Functions | Private Attributes | List of all members
waitQueues::timed< T, clock_type > Class Template Reference

#include <waitQueues.h>

Collaboration diagram for waitQueues::timed< T, clock_type >:
[legend]

Public Member Functions

void enqueue (std::unique_ptr< T > &item, typename clock_type::time_point when)
 
template<typename delayType >
void enqueue (std::unique_ptr< T > &item, delayType delay)
 
void signalDone ()
 
void resetDone ()
 
std::unique_ptr< T > dequeue ()
 
decltype(queue.size()) size () const
 
decltype(queue.empty()) empty () const
 

Private Attributes

std::multimap< typename clock_type::time_point, std::unique_ptr< T > > queue
 
std::mutex queue_mutex
 
std::condition_variable cv
 

Detailed Description

template<typename T, typename clock_type = std::chrono::steady_clock>
class waitQueues::timed< T, clock_type >

Definition at line 210 of file waitQueues.h.

Member Function Documentation

◆ dequeue()

template<typename T , typename clock_type = std::chrono::steady_clock>
std::unique_ptr<T> waitQueues::timed< T, clock_type >::dequeue ( )
inline

Definition at line 240 of file waitQueues.h.

240  {
241  std::unique_lock<decltype(queue_mutex)> lock(queue_mutex); //(NOLINT clang-analyzer-alpha.core.CastToStruct)
242  while (true) {
243  while (queue.empty()) {
244  cv.wait(lock);
245  }
246  auto it = queue.begin();
247  if (! it->second) {
248  return nullptr;
249  }
250  if (it->first < clock_type::now()) {
251  std::unique_ptr<T>item(std::move(it->second));
252  queue.erase(it);
253  return item;
254  }
255  auto status = cv.wait_until(lock, it->first);
256  if (status == std::cv_status::timeout) {
257  auto item = std::move(it->second);
258  queue.erase(it);
259  return item;
260  }
261  }
262  }

Referenced by delayRequest().

Here is the caller graph for this function:

◆ empty()

template<typename T , typename clock_type = std::chrono::steady_clock>
decltype(queue.empty()) waitQueues::timed< T, clock_type >::empty ( ) const
inline

Definition at line 266 of file waitQueues.h.

266  {
267  return queue.empty();
268  }

◆ enqueue() [1/2]

template<typename T , typename clock_type = std::chrono::steady_clock>
template<typename delayType >
void waitQueues::timed< T, clock_type >::enqueue ( std::unique_ptr< T > &  item,
delayType  delay 
)
inline

Definition at line 227 of file waitQueues.h.

227  {
228  enqueue(item, clock_type::now() + delay);
229  }

◆ enqueue() [2/2]

template<typename T , typename clock_type = std::chrono::steady_clock>
void waitQueues::timed< T, clock_type >::enqueue ( std::unique_ptr< T > &  item,
typename clock_type::time_point  when 
)
inline

Definition at line 216 of file waitQueues.h.

216  {
217  std::unique_lock<decltype(queue_mutex)> lock(queue_mutex); //(NOLINT clang-analyzer-alpha.core.CastToStruct)
218  if (!queue.empty() && queue.crbegin()->second == nullptr) {
219  throw std::logic_error("after adding a nullptr no further stuff may be added to a wait queue");
220  }
221  if (item == nullptr) {
222  when = clock_type::time_point::max();
223  }
224  queue.emplace(when, std::move(item));
225  cv.notify_all();
226  }

Referenced by waitQueues::timed< copyRequest::base >::enqueue(), followRequestProvider::enqueueOrAppend(), copyRequest::base::processQueue(), copyRequest::base::retry(), and waitQueues::timed< copyRequest::base >::signalDone().

Here is the caller graph for this function:

◆ resetDone()

template<typename T , typename clock_type = std::chrono::steady_clock>
void waitQueues::timed< T, clock_type >::resetDone ( )
inline

Definition at line 234 of file waitQueues.h.

234  {
235  std::unique_lock<decltype(queue_mutex)> lock(queue_mutex); //(NOLINT clang-analyzer-alpha.core.CastToStruct)
236  while (!queue.empty() && *(queue.crbegin()) == nullptr) {
237  queue.erase(queue.rbegin());
238  }
239  }

◆ signalDone()

template<typename T , typename clock_type = std::chrono::steady_clock>
void waitQueues::timed< T, clock_type >::signalDone ( )
inline

Definition at line 230 of file waitQueues.h.

230  {
231  std::unique_ptr<T> end(nullptr);
232  enqueue(end, clock_type::time_point::max());
233  }

◆ size()

template<typename T , typename clock_type = std::chrono::steady_clock>
decltype(queue.size()) waitQueues::timed< T, clock_type >::size ( ) const
inline

Definition at line 263 of file waitQueues.h.

263  {
264  return queue.size();
265  }

Member Data Documentation

◆ cv

template<typename T , typename clock_type = std::chrono::steady_clock>
std::condition_variable waitQueues::timed< T, clock_type >::cv
private

◆ queue

template<typename T , typename clock_type = std::chrono::steady_clock>
std::multimap<typename clock_type::time_point, std::unique_ptr<T> > waitQueues::timed< T, clock_type >::queue
private

◆ queue_mutex

template<typename T , typename clock_type = std::chrono::steady_clock>
std::mutex waitQueues::timed< T, clock_type >::queue_mutex
private

The documentation for this class was generated from the following file:
waitQueues::timed::queue_mutex
std::mutex queue_mutex
Definition: waitQueues.h:213
waitQueues::timed::enqueue
void enqueue(std::unique_ptr< T > &item, typename clock_type::time_point when)
Definition: waitQueues.h:216
waitQueues::timed::queue
std::multimap< typename clock_type::time_point, std::unique_ptr< T > > queue
Definition: waitQueues.h:212
waitQueues::timed::cv
std::condition_variable cv
Definition: waitQueues.h:214