aboutsummaryrefslogtreecommitdiff
path: root/src/zenutil/workerpools.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/zenutil/workerpools.cpp')
-rw-r--r--src/zenutil/workerpools.cpp89
1 files changed, 89 insertions, 0 deletions
diff --git a/src/zenutil/workerpools.cpp b/src/zenutil/workerpools.cpp
new file mode 100644
index 000000000..b511b0c5c
--- /dev/null
+++ b/src/zenutil/workerpools.cpp
@@ -0,0 +1,89 @@
+// Copyright Epic Games, Inc. All Rights Reserved.
+
+#include "zenutil/workerpools.h"
+
+#include <zencore/intmath.h>
+#include <zencore/thread.h>
+
+ZEN_THIRD_PARTY_INCLUDES_START
+#include <gsl/gsl-lite.hpp>
+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));
+
+ RwLock PoolLock;
+
+ std::unique_ptr<WorkerThreadPool> LargeWorkerPool;
+ std::unique_ptr<WorkerThreadPool> SmallWorkerPool;
+ std::unique_ptr<WorkerThreadPool> SyncWorkerPool;
+} // namespace
+
+WorkerThreadPool&
+GetLargeWorkerPool()
+{
+ {
+ RwLock::SharedLockScope _(PoolLock);
+ if (LargeWorkerPool)
+ {
+ return *LargeWorkerPool;
+ }
+ }
+ RwLock::ExclusiveLockScope _(PoolLock);
+ if (LargeWorkerPool)
+ {
+ return *LargeWorkerPool;
+ }
+ LargeWorkerPool.reset(new WorkerThreadPool(LargeWorkerThreadPoolTreadCount, "LargeThreadPool"));
+ return *LargeWorkerPool;
+}
+
+WorkerThreadPool&
+GetSmallWorkerPool()
+{
+ {
+ RwLock::SharedLockScope _(PoolLock);
+ if (SmallWorkerPool)
+ {
+ return *SmallWorkerPool;
+ }
+ }
+ RwLock::ExclusiveLockScope _(PoolLock);
+ if (SmallWorkerPool)
+ {
+ return *SmallWorkerPool;
+ }
+ SmallWorkerPool.reset(new WorkerThreadPool(SmallWorkerThreadPoolTreadCount, "SmallThreadPool"));
+ return *SmallWorkerPool;
+}
+
+WorkerThreadPool&
+GetSyncWorkerPool()
+{
+ {
+ RwLock::SharedLockScope _(PoolLock);
+ if (SyncWorkerPool)
+ {
+ return *SyncWorkerPool;
+ }
+ }
+ RwLock::ExclusiveLockScope _(PoolLock);
+ if (SyncWorkerPool)
+ {
+ return *SyncWorkerPool;
+ }
+ SyncWorkerPool.reset(new WorkerThreadPool(0, "SyncThreadPool"));
+ return *SyncWorkerPool;
+}
+
+void
+ShutdownWorkerPools()
+{
+ RwLock::ExclusiveLockScope _(PoolLock);
+ LargeWorkerPool.reset();
+ SmallWorkerPool.reset();
+ SyncWorkerPool.reset();
+}
+} // namespace zen