diff options
| author | Dan Engelbrecht <[email protected]> | 2022-03-22 13:50:08 +0100 |
|---|---|---|
| committer | GitHub <[email protected]> | 2022-03-22 13:50:08 +0100 |
| commit | 8667509907b8829b5148ee856dce675001051b01 (patch) | |
| tree | 0252caa7cd01c533809b1b17dfa41721a0cccb82 /zencore/workthreadpool.cpp | |
| parent | Remove unused TotalAttachmentsSize (Mac warning) (diff) | |
| download | zen-8667509907b8829b5148ee856dce675001051b01.tar.xz zen-8667509907b8829b5148ee856dce675001051b01.zip | |
move workthreadpool to zencore (#63)
Diffstat (limited to 'zencore/workthreadpool.cpp')
| -rw-r--r-- | zencore/workthreadpool.cpp | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/zencore/workthreadpool.cpp b/zencore/workthreadpool.cpp new file mode 100644 index 000000000..3fd1d11a6 --- /dev/null +++ b/zencore/workthreadpool.cpp @@ -0,0 +1,77 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#include <zencore/workthreadpool.h> + +#include <zencore/logging.h> + +namespace zen { + +namespace detail { + struct LambdaWork : IWork + { + LambdaWork(auto Work) : WorkFunction(Work) {} + virtual void Execute() override { WorkFunction(); } + + std::function<void()> WorkFunction; + }; +} // namespace detail + +WorkerThreadPool::WorkerThreadPool(int InThreadCount) +{ + for (int i = 0; i < InThreadCount; ++i) + { + m_WorkerThreads.emplace_back(&WorkerThreadPool::WorkerThreadFunction, this); + } +} + +WorkerThreadPool::~WorkerThreadPool() +{ + m_WorkQueue.CompleteAdding(); + + for (std::thread& Thread : m_WorkerThreads) + { + Thread.join(); + } + + m_WorkerThreads.clear(); +} + +void +WorkerThreadPool::ScheduleWork(Ref<IWork> Work) +{ + m_WorkQueue.Enqueue(std::move(Work)); +} + +void +WorkerThreadPool::ScheduleWork(std::function<void()>&& Work) +{ + m_WorkQueue.Enqueue(new detail::LambdaWork(Work)); +} + +void +WorkerThreadPool::WorkerThreadFunction() +{ + do + { + Ref<IWork> Work; + if (m_WorkQueue.WaitAndDequeue(Work)) + { + try + { + Work->Execute(); + } + catch (std::exception& e) + { + Work->m_Exception = std::current_exception(); + + ZEN_WARN("Caught exception in worker thread: {}", e.what()); + } + } + else + { + return; + } + } while (true); +} + +} // namespace zen
\ No newline at end of file |