11// Copyright (c) Microsoft Corporation.
22// Licensed under the MIT license.
33
4+ #include < stdexcept> // For std::runtime_error
45#include < utility>
56#include " dispatchQueue/dispatchQueue.h"
67#include " queueService.h"
@@ -14,7 +15,7 @@ struct ThreadPoolWorkDeleter {
1415};
1516
1617struct ThreadPoolSchedulerWin : Mso::UnknownObject<IDispatchQueueScheduler> {
17- ThreadPoolSchedulerWin (uint32_t maxThreads) noexcept ;
18+ ThreadPoolSchedulerWin (uint32_t maxThreads);
1819 ~ThreadPoolSchedulerWin () noexcept override ;
1920
2021 static void __stdcall WorkCallback (
@@ -93,9 +94,17 @@ std::mutex ThreadPoolSchedulerWin::s_threadPoolWorkMutex;
9394bool ThreadPoolSchedulerWin::s_enableThreadPoolWorkTracking{false };
9495std::vector<std::shared_ptr<TP_WORK>> ThreadPoolSchedulerWin::s_trackedThreadPoolWork;
9596
96- ThreadPoolSchedulerWin::ThreadPoolSchedulerWin (uint32_t maxThreads) noexcept
97- : m_threadPoolWork{::CreateThreadpoolWork (WorkCallback, this , nullptr ), ThreadPoolWorkDeleter{}},
98- m_maxThreads{maxThreads == 0 ? MaxConcurrentThreads : maxThreads} {
97+ ThreadPoolSchedulerWin::ThreadPoolSchedulerWin (uint32_t maxThreads)
98+ : m_maxThreads{maxThreads == 0 ? MaxConcurrentThreads : maxThreads} {
99+ // Create thread pool work
100+ TP_WORK *tpWork = ::CreateThreadpoolWork (WorkCallback, this , nullptr );
101+
102+ // Throw immediately if creation failed
103+ if (!tpWork) {
104+ throw std::runtime_error (" Failed to create thread pool work" );
105+ }
106+
107+ m_threadPoolWork = std::shared_ptr<TP_WORK>(tpWork, ThreadPoolWorkDeleter{});
99108 TrackThreadPoolWork (m_threadPoolWork);
100109}
101110
0 commit comments