Dewobble
Video motion stabilization with awareness of lens projection
safe_queue.hpp
1 #ifndef DEWOBBLE_SAFE_QUEUE_HPP
2 #define DEWOBBLE_SAFE_QUEUE_HPP
3 
4 #include <condition_variable>
5 #include <memory>
6 #include <mutex>
7 #include <queue>
8 
9 namespace dewobble
10 {
11 
12 template <class T> class SafeQueue
13 {
14  std::queue<std::unique_ptr<T>> m_queue;
15  std::mutex m_mutex;
16  std::condition_variable m_cond;
17 
18  public:
19  void push(std::unique_ptr<T> elem)
20  {
21  std::lock_guard<std::mutex> lock(m_mutex);
22  m_queue.push(move(elem));
23  m_cond.notify_one();
24  }
25  std::unique_ptr<T> pop()
26  {
27  std::unique_lock<std::mutex> lock(m_mutex);
28  while (m_queue.size() == 0) {
29  m_cond.wait(lock);
30  }
31 
32  std::unique_ptr<T> result = move(m_queue.front());
33  m_queue.pop();
34  lock.unlock();
35 
36  // In case there were multiple concurrent calls to pop
37  m_cond.notify_one();
38 
39  return result;
40  }
41 };
42 
43 } // namespace dewobble
44 
45 #endif // DEWOBBLE_SAFE_QUEUE_HPP