bda8d93ba9
Summary: It's always annoying to find a header does not include its own dependencies and only works when included after other includes. This change adds `make check-headers` which validates that each header can be included at the top of a file. Some headers are excluded e.g. because of platform or external dependencies. rocksdb_namespace.h had to be re-worked slightly to enable checking for failure to include it. (ROCKSDB_NAMESPACE is a valid namespace name.) Fixes mostly involve adding and cleaning up #includes, but for FileTraceWriter, a constructor was out-of-lined to make a forward declaration sufficient. This check is not currently run with `make check` but is added to CircleCI build-linux-unity since that one is already relatively fast. Pull Request resolved: https://github.com/facebook/rocksdb/pull/8893 Test Plan: existing tests and resolving issues detected by new check Reviewed By: mrambacher Differential Revision: D30823300 Pulled By: pdillinger fbshipit-source-id: 9fff223944994c83c105e2e6496d24845dc8e572
70 lines
1.6 KiB
C++
70 lines
1.6 KiB
C++
// Copyright (c) 2011-present, 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 <condition_variable>
|
|
#include <mutex>
|
|
#include <queue>
|
|
#include <utility>
|
|
|
|
#include "rocksdb/rocksdb_namespace.h"
|
|
|
|
namespace ROCKSDB_NAMESPACE {
|
|
|
|
template <class T>
|
|
class channel {
|
|
public:
|
|
explicit channel() : eof_(false) {}
|
|
|
|
channel(const channel&) = delete;
|
|
void operator=(const channel&) = delete;
|
|
|
|
void sendEof() {
|
|
std::lock_guard<std::mutex> lk(lock_);
|
|
eof_ = true;
|
|
cv_.notify_all();
|
|
}
|
|
|
|
bool eof() {
|
|
std::lock_guard<std::mutex> lk(lock_);
|
|
return buffer_.empty() && eof_;
|
|
}
|
|
|
|
size_t size() const {
|
|
std::lock_guard<std::mutex> lk(lock_);
|
|
return buffer_.size();
|
|
}
|
|
|
|
// writes elem to the queue
|
|
void write(T&& elem) {
|
|
std::unique_lock<std::mutex> lk(lock_);
|
|
buffer_.emplace(std::forward<T>(elem));
|
|
cv_.notify_one();
|
|
}
|
|
|
|
/// Moves a dequeued element onto elem, blocking until an element
|
|
/// is available.
|
|
// returns false if EOF
|
|
bool read(T& elem) {
|
|
std::unique_lock<std::mutex> lk(lock_);
|
|
cv_.wait(lk, [&] { return eof_ || !buffer_.empty(); });
|
|
if (eof_ && buffer_.empty()) {
|
|
return false;
|
|
}
|
|
elem = std::move(buffer_.front());
|
|
buffer_.pop();
|
|
cv_.notify_one();
|
|
return true;
|
|
}
|
|
|
|
private:
|
|
std::condition_variable cv_;
|
|
mutable std::mutex lock_;
|
|
std::queue<T> buffer_;
|
|
bool eof_;
|
|
};
|
|
} // namespace ROCKSDB_NAMESPACE
|