[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/2php/CaffeOnACL/master/src/caffe/util/blocking_queue.cpp [Back]  [Original]

#include 
#include 

#include "caffe/layers/base_data_layer.hpp"
#include "caffe/parallel.hpp"
#include "caffe/util/blocking_queue.hpp"

namespace caffe {

template
class BlockingQueue::sync {
 public:
  mutable boost::mutex mutex_;
  boost::condition_variable condition_;
};

template
BlockingQueue::BlockingQueue()
    : sync_(new sync()) {
}

template
void BlockingQueue::push(const T& t) {
  boost::mutex::scoped_lock lock(sync_->mutex_);
  queue_.push(t);
  lock.unlock();
  sync_->condition_.notify_one();
}

template
bool BlockingQueue::try_pop(T* t) {
  boost::mutex::scoped_lock lock(sync_->mutex_);

  if (queue_.empty()) {
    return false;
  }

  *t = queue_.front();
  queue_.pop();
  return true;
}

template
T BlockingQueue::pop(const string& log_on_wait) {
  boost::mutex::scoped_lock lock(sync_->mutex_);

  while (queue_.empty()) {
    if (!log_on_wait.empty()) {
      LOG_EVERY_N(INFO, 1000)condition_.wait(lock);
  }

  T t = queue_.front();
  queue_.pop();
  return t;
}

template
bool BlockingQueue::try_peek(T* t) {
  boost::mutex::scoped_lock lock(sync_->mutex_);

  if (queue_.empty()) {
    return false;
  }

  *t = queue_.front();
  return true;
}

template
T BlockingQueue::peek() {
  boost::mutex::scoped_lock lock(sync_->mutex_);

  while (queue_.empty()) {
    sync_->condition_.wait(lock);
  }

  return queue_.front();
}

template
size_t BlockingQueue::size() const {
  boost::mutex::scoped_lock lock(sync_->mutex_);
  return queue_.size();
}

template class BlockingQueue;
template class BlockingQueue;

}  // namespace caffe

Web Proxy Viewer  |  New URL  |  Original Page