diff options
Diffstat (limited to 'src/zenutil/workerpools.cpp')
| -rw-r--r-- | src/zenutil/workerpools.cpp | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/src/zenutil/workerpools.cpp b/src/zenutil/workerpools.cpp index 3ae302064..939f3a1c4 100644 --- a/src/zenutil/workerpools.cpp +++ b/src/zenutil/workerpools.cpp @@ -11,14 +11,16 @@ ZEN_THIRD_PARTY_INCLUDES_END namespace zen { namespace { - const int LargeWorkerThreadPoolTreadCount = gsl::narrow<int>(std::thread::hardware_concurrency()); - const int SmallWorkerThreadPoolTreadCount = gsl::narrow<int>(Max((std::thread::hardware_concurrency() / 4u), 1u)); + const int LargeWorkerThreadPoolTreadCount = gsl::narrow<int>(std::thread::hardware_concurrency()); + const int MediumWorkerThreadPoolTreadCount = gsl::narrow<int>(Max((std::thread::hardware_concurrency() / 4u), 1u)); + const int SmallWorkerThreadPoolTreadCount = gsl::narrow<int>(Max((std::thread::hardware_concurrency() / 8u), 1u)); static bool IsShutDown = false; RwLock PoolLock; std::unique_ptr<WorkerThreadPool> LargeWorkerPool; + std::unique_ptr<WorkerThreadPool> MediumWorkerPool; std::unique_ptr<WorkerThreadPool> SmallWorkerPool; std::unique_ptr<WorkerThreadPool> SyncWorkerPool; } // namespace @@ -44,6 +46,26 @@ GetLargeWorkerPool() } WorkerThreadPool& +GetMediumWorkerPool() +{ + { + RwLock::SharedLockScope _(PoolLock); + if (MediumWorkerPool) + { + return *MediumWorkerPool; + } + } + RwLock::ExclusiveLockScope _(PoolLock); + ZEN_ASSERT(!IsShutDown); + if (MediumWorkerPool) + { + return *MediumWorkerPool; + } + MediumWorkerPool.reset(new WorkerThreadPool(MediumWorkerThreadPoolTreadCount, "MediumThreadPool")); + return *MediumWorkerPool; +} + +WorkerThreadPool& GetSmallWorkerPool() { { @@ -89,6 +111,7 @@ ShutdownWorkerPools() RwLock::ExclusiveLockScope _(PoolLock); IsShutDown = true; LargeWorkerPool.reset(); + MediumWorkerPool.reset(); SmallWorkerPool.reset(); SyncWorkerPool.reset(); } |