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

#include <waitQueues.h>

Collaboration diagram for waitQueues::simple< T >:
[legend]

Public Member Functions

void enqueue (std::unique_ptr< T > &item)
 
template<class ... Types>
void emplace (Types ... args)
 
void signalDone ()
 
void resetDone ()
 
template<class ... Types>
std::unique_ptr< T > dequeue (bool mayCreateNew, Types ... args)
 
template<typename durationType >
std::unique_ptr< T > dequeue (durationType timeout, bool &timedOut)
 
std::unique_ptr< T > dequeue ()
 
decltype(queue.size()) size () const
 
decltype(queue.empty()) empty () const
 
template<typename iterType >
void signalDone (iterType begin, iterType end)
 
template<typename iterType >
std::thread signalDoneThread (iterType begin, iterType end)
 

Private Attributes

std::deque< std::unique_ptr< T > > queue
 
std::mutex queue_mutex
 
std::condition_variable cv
 

Detailed Description

template<typename T>
class waitQueues::simple< T >

Definition at line 31 of file waitQueues.h.

Member Function Documentation

◆ dequeue() [1/3]

template<typename T >
std::unique_ptr<T> waitQueues::simple< T >::dequeue ( )
inline

Definition at line 88 of file waitQueues.h.

88  {
89  std::unique_lock<decltype(queue_mutex)> lock(queue_mutex);
90  while (queue.empty()) {
91  cv.wait(lock);
92  }
93  auto item = std::move(queue.front());
94  if (item) { // nullptrs are end markers, multiple readers need many of them...
95  queue.pop_front();
96  }
97  return item;
98  }

◆ dequeue() [2/3]

template<typename T >
template<class ... Types>
std::unique_ptr<T> waitQueues::simple< T >::dequeue ( bool  mayCreateNew,
Types ...  args 
)
inline

Definition at line 59 of file waitQueues.h.

59  {
60  std::unique_lock<decltype(queue_mutex)> lock(queue_mutex); //(NOLINT clang-analyzer-alpha.core.CastToStruct)
61  while (queue.empty()) {
62  if (mayCreateNew) {
63  return std::unique_ptr<T>(new T(args...));
64  }
65  cv.wait(lock);
66  }
67  auto item = std::move(queue.front());
68  if (item) { // nullptrs are end markers, multiple readers need many of them...
69  queue.pop_front();
70  }
71  return item;
72  }

Referenced by copyRequest::base::hash_worker(), copyRequest::base::hasher(), main(), printResults(), copyRequest::base::processQueue(), copyRequest::base::reader(), copyRequest::base::readWorker(), copyRequest::base::writer(), and copyRequest::base::writeWorker().

Here is the caller graph for this function:

◆ dequeue() [3/3]

template<typename T >
template<typename durationType >
std::unique_ptr<T> waitQueues::simple< T >::dequeue ( durationType  timeout,
bool &  timedOut 
)
inline

Definition at line 73 of file waitQueues.h.

73  {
74  std::unique_lock<decltype(queue_mutex)> lock(queue_mutex);
75  while (queue.empty()) {
76  if (cv.wait_for(lock, timeout) == std::cv_status::timeout) {
77  timedOut = true;
78  return nullptr;
79  }
80  }
81  std::unique_ptr<T> item(std::move(queue.front()));
82  if (item) { // nullptrs are end markers, multiple readers need many of them...
83  queue.pop_front();
84  }
85  timedOut = false;
86  return item;
87  }

◆ emplace()

template<typename T >
template<class ... Types>
void waitQueues::simple< T >::emplace ( Types ...  args)
inline

Definition at line 45 of file waitQueues.h.

45  {
46  std::unique_ptr<T> item(new T(args...));
47  enqueue(item);
48  }

Referenced by copyRequest::base::reader().

Here is the caller graph for this function:

◆ empty()

template<typename T >
decltype(queue.empty()) waitQueues::simple< T >::empty ( ) const
inline

Definition at line 102 of file waitQueues.h.

102  {
103  return queue.empty();
104  }

◆ enqueue()

template<typename T >
void waitQueues::simple< T >::enqueue ( std::unique_ptr< T > &  item)
inline

Definition at line 37 of file waitQueues.h.

37  {
38  std::unique_lock<decltype(queue_mutex)> lock(queue_mutex); //(NOLINT clang-analyzer-alpha.core.CastToStruct)
39  if (!queue.empty() && queue.back() == nullptr) {
40  throw std::logic_error("after adding a nullptr no further stuff may be added to a wait queue");
41  }
42  queue.emplace_back(std::move(item));
43  cv.notify_all();
44  }

Referenced by delayRequest(), waitQueues::simple< block >::emplace(), followRequestProvider::enqueueOrAppend(), copyRequest::base::hash_worker(), copyRequest::base::hasher(), o2s(), copyRequest::base::processQueue(), moveRequestProvider::processSources(), noFollowRequestProvider::processSources(), copyRequest::base::reader(), copyRequest::base::readWorker(), waitQueues::simple< block >::signalDone(), copyRequest::base::writer(), and copyRequest::base::writeWorker().

Here is the caller graph for this function:

◆ resetDone()

template<typename T >
void waitQueues::simple< T >::resetDone ( )
inline

Definition at line 53 of file waitQueues.h.

53  {
54  std::unique_lock<decltype(queue_mutex)> lock(queue_mutex); //(NOLINT clang-analyzer-alpha.core.CastToStruct)
55  while (!queue.empty() && queue.back() == nullptr) {
56  queue.pop_back();
57  }
58  }

◆ signalDone() [1/2]

template<typename T >
void waitQueues::simple< T >::signalDone ( )
inline

Definition at line 49 of file waitQueues.h.

49  {
50  std::unique_ptr<T> end(nullptr);
51  enqueue(end);
52  }

Referenced by copyRequest::base::reader(), and waitQueues::simple< block >::signalDone().

Here is the caller graph for this function:

◆ signalDone() [2/2]

template<typename T >
template<typename iterType >
void waitQueues::simple< T >::signalDone ( iterType  begin,
iterType  end 
)
inline

Definition at line 105 of file waitQueues.h.

106  {
107  for (auto it = begin; it != end; ++it) {
108  it->join();
109  }
110  signalDone();
111  }

◆ signalDoneThread()

template<typename T >
template<typename iterType >
std::thread waitQueues::simple< T >::signalDoneThread ( iterType  begin,
iterType  end 
)
inline

Definition at line 112 of file waitQueues.h.

113  {
114  return std::thread(&simple::signalDone<iterType>, this, begin, end);
115  }

Referenced by main().

Here is the caller graph for this function:

◆ size()

template<typename T >
decltype(queue.size()) waitQueues::simple< T >::size ( ) const
inline

Definition at line 99 of file waitQueues.h.

99  {
100  return queue.size();
101  }

Referenced by printResults(), copyRequest::base::reader(), and copyRequest::base::readWorker().

Here is the caller graph for this function:

Member Data Documentation

◆ cv

template<typename T >
std::condition_variable waitQueues::simple< T >::cv
private

◆ queue

template<typename T >
std::deque<std::unique_ptr<T> > waitQueues::simple< T >::queue
private

◆ queue_mutex

template<typename T >
std::mutex waitQueues::simple< T >::queue_mutex
private

The documentation for this class was generated from the following file:
waitQueues::simple::queue_mutex
std::mutex queue_mutex
Definition: waitQueues.h:34
waitQueues::simple::enqueue
void enqueue(std::unique_ptr< T > &item)
Definition: waitQueues.h:37
waitQueues::simple::signalDone
void signalDone()
Definition: waitQueues.h:49
waitQueues::simple::cv
std::condition_variable cv
Definition: waitQueues.h:35
waitQueues::simple::queue
std::deque< std::unique_ptr< T > > queue
Definition: waitQueues.h:33