Sha256: ff52e8bac9d5ece6a326413e1694b02070e236afec4443fe478ab79dda949635

Contents?: true

Size: 973 Bytes

Versions: 9

Compression:

Stored size: 973 Bytes

Contents

#ifndef LIMONP_BLOCKINGQUEUE_HPP
#define LIMONP_BLOCKINGQUEUE_HPP

#include <queue>
#include "Condition.hpp"

namespace limonp {
template<class T>
class BlockingQueue: NonCopyable {
 public:
  BlockingQueue()
    : mutex_(), notEmpty_(mutex_), queue_() {
  }

  void Push(const T& x) {
    MutexLockGuard lock(mutex_);
    queue_.push(x);
    notEmpty_.Notify(); // Wait morphing saves us
  }

  T Pop() {
    MutexLockGuard lock(mutex_);
    // always use a while-loop, due to spurious wakeup
    while (queue_.empty()) {
      notEmpty_.Wait();
    }
    assert(!queue_.empty());
    T front(queue_.front());
    queue_.pop();
    return front;
  }

  size_t Size() const {
    MutexLockGuard lock(mutex_);
    return queue_.size();
  }
  bool Empty() const {
    return Size() == 0;
  }

 private:
  mutable MutexLock mutex_;
  Condition         notEmpty_;
  std::queue<T>     queue_;
}; // class BlockingQueue

} // namespace limonp

#endif // LIMONP_BLOCKINGQUEUE_HPP

Version data entries

9 entries across 9 versions & 2 rubygems

Version Path
cppjieba_rb-0.4.2 ext/cppjieba/deps/limonp/BlockingQueue.hpp
cppjieba_rb-0.4.1 ext/cppjieba/deps/limonp/BlockingQueue.hpp
jieba-rb-5.0.0 ext/cppjieba/deps/limonp/BlockingQueue.hpp
cppjieba_rb-0.3.3 ext/cppjieba/deps/limonp/BlockingQueue.hpp
cppjieba_rb-0.3.1 ext/cppjieba/deps/limonp/BlockingQueue.hpp
cppjieba_rb-0.3.0 ext/cppjieba/deps/limonp/BlockingQueue.hpp
cppjieba_rb-0.2.3 ext/cppjieba/deps/limonp/BlockingQueue.hpp
cppjieba_rb-0.2.2 ext/cppjieba/deps/limonp/BlockingQueue.hpp
cppjieba_rb-0.2.1 ext/cppjieba/deps/limonp/BlockingQueue.hpp