Skip to content

Commit d1a9535

Browse files
Fix INVALID_PARAMETER crash in ThreadPoolSchedulerWin::Post by adding null handle checks (#15150)
* fix for watson * Change files --------- Co-authored-by: Harini Malothu <harinimalothu17@gmail.com>
1 parent cea4c3b commit d1a9535

File tree

2 files changed

+20
-4
lines changed

2 files changed

+20
-4
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"type": "prerelease",
3+
"comment": "fix for watson",
4+
"packageName": "react-native-windows",
5+
"email": "hmalothu@microsoft.com",
6+
"dependentChangeType": "patch"
7+
}

vnext/Mso/src/dispatchQueue/threadPoolScheduler_win.cpp

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
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

1617
struct 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;
9394
bool ThreadPoolSchedulerWin::s_enableThreadPoolWorkTracking{false};
9495
std::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

Comments
 (0)