7#include <packager/file/thread_pool.h>
13#include <absl/log/check.h>
14#include <absl/log/log.h>
15#include <absl/synchronization/mutex.h>
16#include <absl/time/time.h>
22const absl::Duration kMaxThreadIdleTime = absl::Minutes(10);
27ThreadPool ThreadPool::instance;
29ThreadPool::ThreadPool() : num_idle_threads_(0), terminated_(false) {}
31ThreadPool::~ThreadPool() {
35void ThreadPool::PostTask(
const std::function<
void()>& task) {
36 absl::MutexLock lock(mutex_);
38 DCHECK(!terminated_) <<
"Should not call PostTask after Terminate!";
47 DLOG(ERROR) <<
"Should not post an empty task!";
51 tasks_.push(std::move(task));
53 if (num_idle_threads_ >= tasks_.size()) {
55 tasks_available_.SignalAll();
58 std::thread thread(std::bind(&ThreadPool::ThreadMain,
this));
63void ThreadPool::Terminate() {
65 absl::MutexLock lock(mutex_);
67 while (!tasks_.empty()) {
71 tasks_available_.SignalAll();
74ThreadPool::Task ThreadPool::WaitForTask() {
75 absl::MutexLock lock(mutex_);
84 tasks_available_.WaitWithTimeout(&mutex_, kMaxThreadIdleTime);
94 Task task = tasks_.front();
99void ThreadPool::ThreadMain() {
101 auto task = WaitForTask();
All the methods that are virtual are virtual for mocking.