#ifndef GRPC_INTERNAL_CPP_THREAD_MANAGER_H
#define GRPC_INTERNAL_CPP_THREAD_MANAGER_H
#include <condition_variable>
#include <list>
#include <memory>
#include <mutex>
#include <grpcpp/support/config.h>
#include "src/core/lib/gprpp/thd.h"
#include "src/core/lib/iomgr/resource_quota.h"
namespace grpc {
class ThreadManager {
public:
explicit ThreadManager(const char* name, grpc_resource_quota* resource_quota,
int min_pollers, int max_pollers);
virtual ~ThreadManager();
void Initialize();
enum WorkStatus { WORK_FOUND, SHUTDOWN, TIMEOUT };
virtual WorkStatus PollForWork(void** tag, bool* ok) = 0;
virtual void DoWork(void* tag, bool ok, bool resources) = 0;
virtual void Shutdown();
bool IsShutdown();
virtual void Wait();
int GetMaxActiveThreadsSoFar();
private:
class WorkerThread {
public:
WorkerThread(ThreadManager* thd_mgr);
~WorkerThread();
private:
void Run();
ThreadManager* const thd_mgr_;
grpc_core::Thread thd_;
};
void MainWorkLoop();
void MarkAsCompleted(WorkerThread* thd);
void CleanupCompletedThreads();
std::mutex mu_;
bool shutdown_;
std::condition_variable shutdown_cv_;
grpc_resource_user* resource_user_;
int num_pollers_;
int min_pollers_;
int max_pollers_;
int num_threads_;
int max_active_threads_sofar_;
std::mutex list_mu_;
std::list<WorkerThread*> completed_threads_;
};
}
#endif