// Copyright (c) 2013, Facebook, Inc. All rights reserved. // This source code is licensed under both the GPLv2 (found in the // COPYING file in the root directory) and Apache 2.0 License // (found in the LICENSE.Apache file in the root directory). #pragma once #include #include #include "util/mutexlock.h" namespace rocksdb { // // Simple synchronized queue implementation with the option of // bounding the queue // // On overflow, the elements will be discarded // template class BoundedQueue { public: explicit BoundedQueue( const size_t max_size = std::numeric_limits::max()) : cond_empty_(&lock_), max_size_(max_size) {} virtual ~BoundedQueue() {} void Push(T&& t) { MutexLock _(&lock_); if (max_size_ != std::numeric_limits::max() && size_ + t.Size() >= max_size_) { // overflow return; } size_ += t.Size(); q_.push_back(std::move(t)); cond_empty_.SignalAll(); } T Pop() { MutexLock _(&lock_); while (q_.empty()) { cond_empty_.Wait(); } T t = std::move(q_.front()); size_ -= t.Size(); q_.pop_front(); return std::move(t); } size_t Size() const { MutexLock _(&lock_); return size_; } private: mutable port::Mutex lock_; port::CondVar cond_empty_; std::list q_; size_t size_ = 0; const size_t max_size_; }; } // namespace rocksdb