15#ifndef THREAD_FIBER_THREAD_POOL_H_ 
   16#define THREAD_FIBER_THREAD_POOL_H_ 
   21#include <boost/context/pooled_fixedsize_stack.hpp> 
   22#include <boost/context/posix/protected_fixedsize_stack.hpp> 
   24#include "thread/boost_primitives.h" 
   27template <
typename Algo, 
typename... Args>
 
   28static void EnsureThreadHasScheduler(Args&&... args) {
 
   29  thread_local bool kThreadHasScheduler = 
false;
 
   30  if (kThreadHasScheduler) {
 
   34  boost::fibers::use_scheduling_algorithm<Algo>(std::forward<Args>(args)...);
 
   35  kThreadHasScheduler = 
true;
 
   38class WorkerThreadPool {
 
   40  explicit WorkerThreadPool() = 
default;
 
   42  void Start(
size_t num_threads = std::thread::hardware_concurrency());
 
   44  void Schedule(boost::fibers::context* ctx);
 
   46  static WorkerThreadPool& Instance();
 
   48  boost::context::protected_fixedsize_stack& Allocator() { 
return alloc; }
 
   55  static constexpr bool kScheduleOnSelf = 
true;
 
   57  boost::context::protected_fixedsize_stack alloc;
 
   59  act::concurrency::impl::Mutex mu_{};
 
   60  std::atomic<size_t> worker_idx_{0};
 
   61  absl::InlinedVector<Worker, 16> workers_{};
 
   62  absl::InlinedVector<boost::fibers::scheduler*, 16> schedulers_{};
 
   65void EnsureWorkerThreadPool();