From c068285ff8f2c0faa8a5ec204767a3a7143606f7 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Fri, 10 Mar 2017 17:07:51 +0900 Subject: [PATCH] AtomBindings should not use default uv loop --- atom/browser/atom_browser_main_parts.cc | 2 +- atom/common/api/atom_bindings.cc | 4 ++-- atom/common/api/atom_bindings.h | 2 +- atom/common/node_bindings.cc | 4 ++++ atom/common/node_bindings.h | 6 ++++-- atom/renderer/atom_renderer_client.cc | 2 +- atom/renderer/web_worker_observer.cc | 4 +--- 7 files changed, 14 insertions(+), 10 deletions(-) diff --git a/atom/browser/atom_browser_main_parts.cc b/atom/browser/atom_browser_main_parts.cc index 095bcbc13892..c175b3d2e58e 100644 --- a/atom/browser/atom_browser_main_parts.cc +++ b/atom/browser/atom_browser_main_parts.cc @@ -61,7 +61,7 @@ AtomBrowserMainParts::AtomBrowserMainParts() exit_code_(nullptr), browser_(new Browser), node_bindings_(NodeBindings::Create(NodeBindings::BROWSER)), - atom_bindings_(new AtomBindings), + atom_bindings_(new AtomBindings(uv_default_loop())), gc_timer_(true, true) { DCHECK(!self_) << "Cannot have two AtomBrowserMainParts"; self_ = this; diff --git a/atom/common/api/atom_bindings.cc b/atom/common/api/atom_bindings.cc index f1b56c675936..c82589d6b19c 100644 --- a/atom/common/api/atom_bindings.cc +++ b/atom/common/api/atom_bindings.cc @@ -78,8 +78,8 @@ void FatalErrorCallback(const char* location, const char* message) { } // namespace -AtomBindings::AtomBindings() { - uv_async_init(uv_default_loop(), &call_next_tick_async_, OnCallNextTick); +AtomBindings::AtomBindings(uv_loop_t* loop) { + uv_async_init(loop, &call_next_tick_async_, OnCallNextTick); call_next_tick_async_.data = this; } diff --git a/atom/common/api/atom_bindings.h b/atom/common/api/atom_bindings.h index 3fd43cc8a145..815741715034 100644 --- a/atom/common/api/atom_bindings.h +++ b/atom/common/api/atom_bindings.h @@ -20,7 +20,7 @@ namespace atom { class AtomBindings { public: - AtomBindings(); + explicit AtomBindings(uv_loop_t* loop); virtual ~AtomBindings(); // Add process.atomBinding function, which behaves like process.binding but diff --git a/atom/common/node_bindings.cc b/atom/common/node_bindings.cc index 7c1342359b2e..314a7b9c0330 100644 --- a/atom/common/node_bindings.cc +++ b/atom/common/node_bindings.cc @@ -116,6 +116,10 @@ NodeBindings::~NodeBindings() { // Clear uv. uv_sem_destroy(&embed_sem_); uv_close(reinterpret_cast(&dummy_uv_handle_), nullptr); + + // Destroy loop. + if (uv_loop_ != uv_default_loop()) + uv_loop_delete(uv_loop_); } void NodeBindings::Initialize() { diff --git a/atom/common/node_bindings.h b/atom/common/node_bindings.h index 5a77162b9275..5047a9afb236 100644 --- a/atom/common/node_bindings.h +++ b/atom/common/node_bindings.h @@ -52,6 +52,8 @@ class NodeBindings { void set_uv_env(node::Environment* env) { uv_env_ = env; } node::Environment* uv_env() const { return uv_env_; } + uv_loop_t* uv_loop() const { return uv_loop_; } + protected: explicit NodeBindings(BrowserEnvironment browser_env); @@ -70,10 +72,10 @@ class NodeBindings { // Which environment we are running. BrowserEnvironment browser_env_; - // Main thread's MessageLoop. + // Current thread's MessageLoop. scoped_refptr task_runner_; - // Main thread's libuv loop. + // Current thread's libuv loop. uv_loop_t* uv_loop_; private: diff --git a/atom/renderer/atom_renderer_client.cc b/atom/renderer/atom_renderer_client.cc index 14ca3b60ecbf..37a16ee56f4e 100644 --- a/atom/renderer/atom_renderer_client.cc +++ b/atom/renderer/atom_renderer_client.cc @@ -217,7 +217,7 @@ std::vector ParseSchemesCLISwitch(const char* switch_name) { AtomRendererClient::AtomRendererClient() : node_integration_initialized_(false), node_bindings_(NodeBindings::Create(NodeBindings::RENDERER)), - atom_bindings_(new AtomBindings) { + atom_bindings_(new AtomBindings(uv_default_loop())) { isolated_world_ = base::CommandLine::ForCurrentProcess()->HasSwitch( switches::kContextIsolation); // Parse --standard-schemes=scheme1,scheme2 diff --git a/atom/renderer/web_worker_observer.cc b/atom/renderer/web_worker_observer.cc index aa335a92d516..323c9be7f274 100644 --- a/atom/renderer/web_worker_observer.cc +++ b/atom/renderer/web_worker_observer.cc @@ -29,7 +29,7 @@ WebWorkerObserver* WebWorkerObserver::GetCurrent() { WebWorkerObserver::WebWorkerObserver() : node_bindings_(NodeBindings::Create(NodeBindings::WORKER)), - atom_bindings_(new AtomBindings) { + atom_bindings_(new AtomBindings(node_bindings_->uv_loop())) { lazy_tls.Pointer()->Set(this); } @@ -66,8 +66,6 @@ void WebWorkerObserver::ContextWillDestroy(v8::Local context) { // Destroy the node environment. node::FreeEnvironment(env); - atom_bindings_.reset(); - node_bindings_.reset(); delete this; }