// 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). // // Copyright (c) 2011 The LevelDB Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. See the AUTHORS file for names of contributors. #pragma once #include #include "rocksdb/rocksdb_namespace.h" namespace ROCKSDB_NAMESPACE { /* * ThreadPool is a component that will spawn N background threads that will * be used to execute scheduled work, The number of background threads could * be modified by calling SetBackgroundThreads(). * */ class ThreadPool { public: virtual ~ThreadPool() {} // Wait for all threads to finish. // Discard those threads that did not start // executing virtual void JoinAllThreads() = 0; // Set the number of background threads that will be executing the // scheduled jobs. virtual void SetBackgroundThreads(int num) = 0; virtual int GetBackgroundThreads() = 0; // Get the number of jobs scheduled in the ThreadPool queue. virtual unsigned int GetQueueLen() const = 0; // Waits for all jobs to complete those // that already started running and those that did not // start yet. This ensures that everything that was thrown // on the TP runs even though // we may not have specified enough threads for the amount // of jobs virtual void WaitForJobsAndJoinAllThreads() = 0; // Submit a fire and forget jobs // This allows to submit the same job multiple times virtual void SubmitJob(const std::function&) = 0; // This moves the function in for efficiency virtual void SubmitJob(std::function&&) = 0; // Reserve available background threads. This function does not ensure // so many threads can be reserved, instead it will return the number of // threads that can be reserved against the desired one. In other words, // the number of available threads could be less than the input. virtual int ReserveThreads(int /*threads_to_be_reserved*/) { return 0; } // Release a specific number of reserved threads virtual int ReleaseThreads(int /*threads_to_be_released*/) { return 0; } }; // NewThreadPool() is a function that could be used to create a ThreadPool // with `num_threads` background threads. extern ThreadPool* NewThreadPool(int num_threads); } // namespace ROCKSDB_NAMESPACE