| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- // 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 <limits>
- #include <list>
- #include "util/mutexlock.h"
- namespace ROCKSDB_NAMESPACE {
- //
- // Simple synchronized queue implementation with the option of
- // bounding the queue
- //
- // On overflow, the elements will be discarded
- //
- template <class T>
- class BoundedQueue {
- public:
- explicit BoundedQueue(
- const size_t max_size = std::numeric_limits<size_t>::max())
- : cond_empty_(&lock_), max_size_(max_size) {}
- virtual ~BoundedQueue() {}
- void Push(T&& t) {
- MutexLock _(&lock_);
- if (max_size_ != std::numeric_limits<size_t>::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 t;
- }
- size_t Size() const {
- MutexLock _(&lock_);
- return size_;
- }
- private:
- mutable port::Mutex lock_;
- port::CondVar cond_empty_;
- std::list<T> q_;
- size_t size_ = 0;
- const size_t max_size_;
- };
- } // namespace ROCKSDB_NAMESPACE
|