rocksdb/util/threadpool_imp.h
Dmitri Smirnov 0a4cdde50a Windows thread
Summary:
introduce new methods into a public threadpool interface,
- allow submission of std::functions as they allow greater flexibility.
- add Joining methods to the implementation to join scheduled and submitted jobs with
  an option to cancel jobs that did not start executing.
- Remove ugly `#ifdefs` between pthread and std implementation, make it uniform.
- introduce pimpl for a drop in replacement of the implementation
- Introduce rocksdb::port::Thread typedef which is a replacement for std::thread.  On Posix Thread defaults as before std::thread.
- Implement WindowsThread that allocates memory in a more controllable manner than windows std::thread with a replaceable implementation.
- should be no functionality changes.
Closes https://github.com/facebook/rocksdb/pull/1823

Differential Revision: D4492902

Pulled By: siying

fbshipit-source-id: c74cb11
2017-02-06 14:54:18 -08:00

108 lines
3.5 KiB
C++

// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
// This source code is licensed under the BSD-style license found in the
// LICENSE file in the root directory of this source tree. An additional grant
// of patent rights can be found in the PATENTS file in the same 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 {
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 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;
// 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 priority
// Currently only has effect on Linux
void LowerIOPriority();
// 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