1
1
// Copyright (c) Microsoft Corporation.
2
2
// Licensed under the MIT license.
3
3
4
+ #include < stdexcept> // For std::runtime_error
4
5
#include < utility>
5
6
#include " dispatchQueue/dispatchQueue.h"
6
7
#include " queueService.h"
@@ -14,7 +15,7 @@ struct ThreadPoolWorkDeleter {
14
15
};
15
16
16
17
struct ThreadPoolSchedulerWin : Mso::UnknownObject<IDispatchQueueScheduler> {
17
- ThreadPoolSchedulerWin (uint32_t maxThreads) noexcept ;
18
+ ThreadPoolSchedulerWin (uint32_t maxThreads);
18
19
~ThreadPoolSchedulerWin () noexcept override ;
19
20
20
21
static void __stdcall WorkCallback (
@@ -93,9 +94,17 @@ std::mutex ThreadPoolSchedulerWin::s_threadPoolWorkMutex;
93
94
bool ThreadPoolSchedulerWin::s_enableThreadPoolWorkTracking{false };
94
95
std::vector<std::shared_ptr<TP_WORK>> ThreadPoolSchedulerWin::s_trackedThreadPoolWork;
95
96
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{});
99
108
TrackThreadPoolWork (m_threadPoolWork);
100
109
}
101
110
0 commit comments