| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 | //  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 "rocksdb/threadpool.h"#include "rocksdb/env.h"#include <memory>#include <functional>namespace ROCKSDB_NAMESPACE {class ThreadPoolImpl : public ThreadPool { public:  ThreadPoolImpl();  ~ThreadPoolImpl();  ThreadPoolImpl(ThreadPoolImpl&&) = delete;  ThreadPoolImpl& operator=(ThreadPoolImpl&&) = delete;  // Implement ThreadPool interfaces  // Wait for all threads to finish.  // Discards all the jobs that did not  // start executing and waits for those running  // to complete  void JoinAllThreads() override;  // Set the number of background threads that will be executing the  // scheduled jobs.  void SetBackgroundThreads(int num) override;  int GetBackgroundThreads() override;  // Get the number of jobs scheduled in the ThreadPool queue.  unsigned int GetQueueLen() const override;  // Waits for all jobs to complete those  // that already started running and those that did not  // start yet  void WaitForJobsAndJoinAllThreads() override;  // Make threads to run at a lower kernel IO priority  // Currently only has effect on Linux  void LowerIOPriority();  // Make threads to run at a lower kernel CPU priority  // Currently only has effect on Linux  void LowerCPUPriority();  // Ensure there is at aleast num threads in the pool  // but do not kill threads if there are more  void IncBackgroundThreadsIfNeeded(int num);  // Submit a fire and forget job  // These jobs can not be unscheduled  // This allows to submit the same job multiple times  void SubmitJob(const std::function<void()>&) override;  // This moves the function in for efficiency  void SubmitJob(std::function<void()>&&) override;  // Schedule a job with an unschedule tag and unschedule function  // Can be used to filter and unschedule jobs by a tag  // that are still in the queue and did not start running  void Schedule(void (*function)(void* arg1), void* arg, void* tag,                void (*unschedFunction)(void* arg));  // Filter jobs that are still in a queue and match  // the given tag. Remove them from a queue if any  // and for each such job execute an unschedule function  // if such was given at scheduling time.  int UnSchedule(void* tag);  void SetHostEnv(Env* env);  Env* GetHostEnv() const;  // Return the thread priority.  // This would allow its member-thread to know its priority.  Env::Priority GetThreadPriority() const;  // Set the thread priority.  void SetThreadPriority(Env::Priority priority);  static void PthreadCall(const char* label, int result);  struct Impl; private:   // Current public virtual interface does not provide usable   // functionality and thus can not be used internally to   // facade different implementations.   //   // We propose a pimpl idiom in order to easily replace the thread pool impl   // w/o touching the header file but providing a different .cc potentially   // CMake option driven.   //   // Another option is to introduce a Env::MakeThreadPool() virtual interface   // and override the environment. This would require refactoring ThreadPool usage.   //   // We can also combine these two approaches   std::unique_ptr<Impl>   impl_;};}  // namespace ROCKSDB_NAMESPACE
 |