From 79b6e6f1af684809ad1ee9c5a62e564f1648c8d1 Mon Sep 17 00:00:00 2001 From: "trop[bot]" Date: Sat, 15 Dec 2018 14:14:59 -0800 Subject: [PATCH] fix: allow 2 threads for CreateIoCompletionPort on single-core to prevent busy looping (backport: 3-0-x) (#16082) --- atom/common/node_bindings_win.cc | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/atom/common/node_bindings_win.cc b/atom/common/node_bindings_win.cc index 4a5ff5c51406..0f592a3f5f68 100644 --- a/atom/common/node_bindings_win.cc +++ b/atom/common/node_bindings_win.cc @@ -7,6 +7,7 @@ #include #include "base/logging.h" +#include "base/sys_info.h" extern "C" { #include "vendor/node/deps/uv/src/win/internal.h" @@ -15,7 +16,20 @@ extern "C" { namespace atom { NodeBindingsWin::NodeBindingsWin(BrowserEnvironment browser_env) - : NodeBindings(browser_env) {} + : NodeBindings(browser_env) { + // on single-core the io comp port NumberOfConcurrentThreads needs to be 2 + // to avoid cpu pegging likely caused by a busy loop in PollEvents + if (base::SysInfo::NumberOfProcessors() == 1) { + // the expectation is the uv_loop_ has just been initialized + // which makes iocp replacement safe + CHECK_EQ(0u, uv_loop_->active_handles); + CHECK_EQ(0u, uv_loop_->active_reqs.count); + + if (uv_loop_->iocp && uv_loop_->iocp != INVALID_HANDLE_VALUE) + CloseHandle(uv_loop_->iocp); + uv_loop_->iocp = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 2); + } +} NodeBindingsWin::~NodeBindingsWin() {}