2016-02-10 00:12:00 +01:00
|
|
|
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
|
2017-07-16 01:03:42 +02:00
|
|
|
// 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).
|
2015-10-27 13:03:43 +01:00
|
|
|
//
|
|
|
|
// 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
|
2016-05-13 03:34:04 +02:00
|
|
|
|
2016-08-26 19:41:35 +02:00
|
|
|
#include "rocksdb/threadpool.h"
|
2017-02-06 23:43:55 +01:00
|
|
|
#include "rocksdb/env.h"
|
2016-05-13 03:34:04 +02:00
|
|
|
|
2017-02-06 23:43:55 +01:00
|
|
|
#include <memory>
|
|
|
|
#include <functional>
|
2016-05-13 03:34:04 +02:00
|
|
|
|
2015-10-27 13:03:43 +01:00
|
|
|
namespace rocksdb {
|
|
|
|
|
2017-02-06 23:43:55 +01:00
|
|
|
|
2016-08-26 19:41:35 +02:00
|
|
|
class ThreadPoolImpl : public ThreadPool {
|
2015-10-27 13:03:43 +01:00
|
|
|
public:
|
2016-08-26 19:41:35 +02:00
|
|
|
ThreadPoolImpl();
|
|
|
|
~ThreadPoolImpl();
|
2015-10-27 13:03:43 +01:00
|
|
|
|
2017-02-06 23:43:55 +01:00
|
|
|
ThreadPoolImpl(ThreadPoolImpl&&) = delete;
|
|
|
|
ThreadPoolImpl& operator=(ThreadPoolImpl&&) = delete;
|
|
|
|
|
|
|
|
// Implement ThreadPool interfaces
|
|
|
|
|
|
|
|
// Wait for all threads to finish.
|
2017-06-14 01:46:17 +02:00
|
|
|
// Discards all the jobs that did not
|
2017-02-06 23:43:55 +01:00
|
|
|
// start executing and waits for those running
|
|
|
|
// to complete
|
2016-08-26 19:41:35 +02:00
|
|
|
void JoinAllThreads() override;
|
2017-02-06 23:43:55 +01:00
|
|
|
|
|
|
|
// Set the number of background threads that will be executing the
|
|
|
|
// scheduled jobs.
|
|
|
|
void SetBackgroundThreads(int num) override;
|
2017-05-23 20:04:25 +02:00
|
|
|
int GetBackgroundThreads() override;
|
|
|
|
|
2017-02-06 23:43:55 +01:00
|
|
|
// 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;
|
|
|
|
|
2018-04-24 17:38:01 +02:00
|
|
|
// Make threads to run at a lower kernel IO priority
|
2017-02-06 23:43:55 +01:00
|
|
|
// Currently only has effect on Linux
|
2015-10-27 13:03:43 +01:00
|
|
|
void LowerIOPriority();
|
2017-02-06 23:43:55 +01:00
|
|
|
|
2018-04-24 17:38:01 +02:00
|
|
|
// Make threads to run at a lower kernel CPU priority
|
|
|
|
// Currently only has effect on Linux
|
|
|
|
void LowerCPUPriority();
|
|
|
|
|
2017-02-06 23:43:55 +01:00
|
|
|
// Ensure there is at aleast num threads in the pool
|
|
|
|
// but do not kill threads if there are more
|
2015-10-27 13:03:43 +01:00
|
|
|
void IncBackgroundThreadsIfNeeded(int num);
|
|
|
|
|
2017-02-06 23:43:55 +01:00
|
|
|
// Submit a fire and forget job
|
|
|
|
// These jobs can not be unscheduled
|
2015-10-27 13:03:43 +01:00
|
|
|
|
2017-02-06 23:43:55 +01:00
|
|
|
// 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;
|
2015-10-27 13:03:43 +01:00
|
|
|
|
2017-02-06 23:43:55 +01:00
|
|
|
// 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);
|
2015-10-27 13:03:43 +01:00
|
|
|
|
2017-02-06 23:43:55 +01:00
|
|
|
void SetHostEnv(Env* env);
|
2015-10-27 13:03:43 +01:00
|
|
|
|
2017-02-06 23:43:55 +01:00
|
|
|
Env* GetHostEnv() const;
|
2015-10-27 13:03:43 +01:00
|
|
|
|
|
|
|
// Return the thread priority.
|
|
|
|
// This would allow its member-thread to know its priority.
|
2017-02-06 23:43:55 +01:00
|
|
|
Env::Priority GetThreadPriority() const;
|
2015-10-27 13:03:43 +01:00
|
|
|
|
|
|
|
// Set the thread priority.
|
2017-02-06 23:43:55 +01:00
|
|
|
void SetThreadPriority(Env::Priority priority);
|
2015-10-27 13:03:43 +01:00
|
|
|
|
|
|
|
static void PthreadCall(const char* label, int result);
|
|
|
|
|
2017-02-06 23:43:55 +01:00
|
|
|
struct Impl;
|
|
|
|
|
2015-10-27 13:03:43 +01:00
|
|
|
private:
|
2017-02-06 23:43:55 +01:00
|
|
|
|
|
|
|
// 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_;
|
2015-10-27 13:03:43 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace rocksdb
|