CARMA C++
ConcurrentQueue.h
1 #ifndef CARMA_UTIL_CONCURRENTQUEUE_H
2 #define CARMA_UTIL_CONCURRENTQUEUE_H
3 
4 #include <queue>
5 
6 #include <carma/util/PthreadCond.h>
7 #include <carma/util/PthreadMutex.h>
8 #include <carma/util/ScopedPthreadMutexLock.h>
9 
10 namespace carma {
11 namespace util {
12 
13 template<typename T>
14 class ConcurrentQueue
15 {
16  private:
17  std::queue<T> queue_;
18  mutable PthreadMutex mutex_;
19  PthreadCond cond_;
20 
21  public:
22  typedef typename std::queue<T>::size_type size_type;
23 
24  void push(T const& val);
25  bool empty() const;
26  bool try_pop(T& val);
27  void wait_and_pop(T& val);
28  size_type size() const;
29 };
30 
31 } // namespace util
32 } // namespace carma
33 
34 template<typename T>
35 void carma::util::ConcurrentQueue<T>::push(T const& val)
36 {
37  const ScopedPthreadMutexLock lock(mutex_);
38 
39  queue_.push(val);
40  cond_.Broadcast();
41 }
42 
43 template<typename T>
44 bool carma::util::ConcurrentQueue<T>::empty() const
45 {
46  const ScopedPthreadMutexLock lock(mutex_);
47  return queue_.empty();
48 }
49 
50 template<typename T>
51 bool carma::util::ConcurrentQueue<T>::try_pop(T &val)
52 {
53  const ScopedPthreadMutexLock lock(mutex_);
54 
55  if (queue_.empty())
56  return false;
57 
58  val = queue_.front();
59  queue_.pop();
60  return true;
61 }
62 
63 template<typename T>
64 void carma::util::ConcurrentQueue<T>::wait_and_pop(T& val)
65 {
66  const ScopedPthreadMutexLock lock(mutex_);
67 
68  while (queue_.empty())
69  cond_.Wait(mutex_);
70 
71  val = queue_.front();
72  queue_.pop();
73 }
74 
75 template<typename T>
76 typename carma::util::ConcurrentQueue<T>::size_type
77 carma::util::ConcurrentQueue<T>::size() const
78 {
79  const ScopedPthreadMutexLock lock(mutex_);
80 
81  return queue_.size();
82 }
83 #endif
84 /* vim: set ts=4 sts=4 sw=4 et: */