| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 | //  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 <stdint.h>#include <atomic>#include <mutex>#include <set>#include "util/autovector.h"namespace ROCKSDB_NAMESPACE {class ColumnFamilyData;// FlushScheduler keeps track of all column families whose memtable may// be full and require flushing. Unless otherwise noted, all methods on// FlushScheduler should be called only with the DB mutex held or from// a single-threaded recovery context.class FlushScheduler { public:  FlushScheduler() : head_(nullptr) {}  // May be called from multiple threads at once, but not concurrent with  // any other method calls on this instance  void ScheduleWork(ColumnFamilyData* cfd);  // Removes and returns Ref()-ed column family. Client needs to Unref().  // Filters column families that have been dropped.  ColumnFamilyData* TakeNextColumnFamily();  // This can be called concurrently with ScheduleWork but it would miss all  // the scheduled flushes after the last synchronization. This would result  // into less precise enforcement of memtable sizes but should not matter much.  bool Empty();  void Clear(); private:  struct Node {    ColumnFamilyData* column_family;    Node* next;  };  std::atomic<Node*> head_;#ifndef NDEBUG  std::mutex checking_mutex_;  std::set<ColumnFamilyData*> checking_set_;#endif  // NDEBUG};}  // namespace ROCKSDB_NAMESPACE
 |