// 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 namespace rocksdb { /* * 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; }; // 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