aboutsummaryrefslogtreecommitdiff
path: root/src/zenutil/workerpools.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2024-08-22 16:03:01 +0200
committerGitHub Enterprise <[email protected]>2024-08-22 16:03:01 +0200
commit203d3f03f0d0ef51f414b5344462bde0a8fcaf1b (patch)
tree2d0cbe07dbf6b2d81a91e15c823ea0209205b39c /src/zenutil/workerpools.cpp
parentsafer calls to IsProcessRunning (#131) (diff)
downloadzen-203d3f03f0d0ef51f414b5344462bde0a8fcaf1b.tar.xz
zen-203d3f03f0d0ef51f414b5344462bde0a8fcaf1b.zip
separate worker pools into burst/background to avoid background jobs blocking client requests (#134)
Diffstat (limited to 'src/zenutil/workerpools.cpp')
-rw-r--r--src/zenutil/workerpools.cpp118
1 files changed, 48 insertions, 70 deletions
diff --git a/src/zenutil/workerpools.cpp b/src/zenutil/workerpools.cpp
index 144ef6817..e3165e838 100644
--- a/src/zenutil/workerpools.cpp
+++ b/src/zenutil/workerpools.cpp
@@ -19,90 +19,65 @@ namespace {
RwLock PoolLock;
- std::unique_ptr<WorkerThreadPool> LargeWorkerPool;
- std::unique_ptr<WorkerThreadPool> MediumWorkerPool;
- std::unique_ptr<WorkerThreadPool> SmallWorkerPool;
- std::unique_ptr<WorkerThreadPool> SyncWorkerPool;
-} // namespace
+ struct WorkerPool
+ {
+ std::unique_ptr<WorkerThreadPool> Pool;
+ const int TreadCount;
+ const std::string_view Name;
+ };
-WorkerThreadPool&
-GetLargeWorkerPool()
-{
+ WorkerPool BurstLargeWorkerPool = {.TreadCount = LargeWorkerThreadPoolTreadCount, .Name = "LargeThreadPool(burst)"};
+ WorkerPool BackgroundLargeWorkerPool = {.TreadCount = LargeWorkerThreadPoolTreadCount, .Name = "LargeThreadPool(bkg)"};
+
+ WorkerPool BurstMediumWorkerPool = {.TreadCount = MediumWorkerThreadPoolTreadCount, .Name = "MediumThreadPool(burst)"};
+ WorkerPool BackgroundMediumWorkerPool = {.TreadCount = MediumWorkerThreadPoolTreadCount, .Name = "MediumThreadPool(bkg)"};
+
+ WorkerPool BurstSmallWorkerPool = {.TreadCount = SmallWorkerThreadPoolTreadCount, .Name = "SmallThreadPool(burst)"};
+ WorkerPool BackgroundSmallWorkerPool = {.TreadCount = SmallWorkerThreadPoolTreadCount, .Name = "SmallThreadPool(bkg)"};
+
+ WorkerPool SyncWorkerPool = {.TreadCount = 0, .Name = "SyncThreadPool"};
+
+ WorkerThreadPool& EnsurePoolPtr(WorkerPool& Pool)
{
- RwLock::SharedLockScope _(PoolLock);
- if (LargeWorkerPool)
{
- return *LargeWorkerPool;
+ RwLock::SharedLockScope _(PoolLock);
+ if (Pool.Pool)
+ {
+ return *Pool.Pool;
+ }
}
+ RwLock::ExclusiveLockScope _(PoolLock);
+ ZEN_ASSERT(!IsShutDown);
+ if (!Pool.Pool)
+ {
+ Pool.Pool.reset(new WorkerThreadPool(Pool.TreadCount, Pool.Name));
+ }
+ return *Pool.Pool;
}
- RwLock::ExclusiveLockScope _(PoolLock);
- ZEN_ASSERT(!IsShutDown);
- if (LargeWorkerPool)
- {
- return *LargeWorkerPool;
- }
- LargeWorkerPool.reset(new WorkerThreadPool(LargeWorkerThreadPoolTreadCount, "LargeThreadPool"));
- return *LargeWorkerPool;
+} // namespace
+
+WorkerThreadPool&
+GetLargeWorkerPool(EWorkloadType WorkloadType)
+{
+ return EnsurePoolPtr(WorkloadType == EWorkloadType::Burst ? BurstLargeWorkerPool : BackgroundLargeWorkerPool);
}
WorkerThreadPool&
-GetMediumWorkerPool()
+GetMediumWorkerPool(EWorkloadType WorkloadType)
{
- {
- 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;
+ return EnsurePoolPtr(WorkloadType == EWorkloadType::Burst ? BurstMediumWorkerPool : BackgroundMediumWorkerPool);
}
WorkerThreadPool&
-GetSmallWorkerPool()
+GetSmallWorkerPool(EWorkloadType WorkloadType)
{
- {
- RwLock::SharedLockScope _(PoolLock);
- if (SmallWorkerPool)
- {
- return *SmallWorkerPool;
- }
- }
- RwLock::ExclusiveLockScope _(PoolLock);
- ZEN_ASSERT(!IsShutDown);
- if (SmallWorkerPool)
- {
- return *SmallWorkerPool;
- }
- SmallWorkerPool.reset(new WorkerThreadPool(SmallWorkerThreadPoolTreadCount, "SmallThreadPool"));
- return *SmallWorkerPool;
+ return EnsurePoolPtr(WorkloadType == EWorkloadType::Burst ? BurstSmallWorkerPool : BackgroundSmallWorkerPool);
}
WorkerThreadPool&
GetSyncWorkerPool()
{
- {
- RwLock::SharedLockScope _(PoolLock);
- if (SyncWorkerPool)
- {
- return *SyncWorkerPool;
- }
- }
- RwLock::ExclusiveLockScope _(PoolLock);
- ZEN_ASSERT(!IsShutDown);
- if (SyncWorkerPool)
- {
- return *SyncWorkerPool;
- }
- SyncWorkerPool.reset(new WorkerThreadPool(0, "SyncThreadPool"));
- return *SyncWorkerPool;
+ return EnsurePoolPtr(SyncWorkerPool);
}
void
@@ -110,9 +85,12 @@ ShutdownWorkerPools()
{
RwLock::ExclusiveLockScope _(PoolLock);
IsShutDown = true;
- LargeWorkerPool.reset();
- MediumWorkerPool.reset();
- SmallWorkerPool.reset();
- SyncWorkerPool.reset();
+ BurstLargeWorkerPool.Pool.reset();
+ BackgroundLargeWorkerPool.Pool.reset();
+ BurstMediumWorkerPool.Pool.reset();
+ BackgroundMediumWorkerPool.Pool.reset();
+ BurstSmallWorkerPool.Pool.reset();
+ BackgroundSmallWorkerPool.Pool.reset();
+ SyncWorkerPool.Pool.reset();
}
} // namespace zen