diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/inspector/main_thread_interface.cc | 21 | ||||
-rw-r--r-- | src/inspector/main_thread_interface.h | 3 | ||||
-rw-r--r-- | src/inspector_agent.cc | 8 |
3 files changed, 19 insertions, 13 deletions
diff --git a/src/inspector/main_thread_interface.cc b/src/inspector/main_thread_interface.cc index ac4461baed..48a964d564 100644 --- a/src/inspector/main_thread_interface.cc +++ b/src/inspector/main_thread_interface.cc @@ -87,15 +87,15 @@ class CallRequest : public Request { class DispatchMessagesTask : public v8::Task { public: - explicit DispatchMessagesTask(MainThreadInterface* thread) + explicit DispatchMessagesTask(std::weak_ptr<MainThreadInterface> thread) : thread_(thread) {} void Run() override { - thread_->DispatchMessages(); + if (auto thread = thread_.lock()) thread->DispatchMessages(); } private: - MainThreadInterface* thread_; + std::weak_ptr<MainThreadInterface> thread_; }; template <typename T> @@ -231,11 +231,16 @@ void MainThreadInterface::Post(std::unique_ptr<Request> request) { if (needs_notify) { if (isolate_ != nullptr && platform_ != nullptr) { std::shared_ptr<v8::TaskRunner> taskrunner = - platform_->GetForegroundTaskRunner(isolate_); - taskrunner->PostTask(std::make_unique<DispatchMessagesTask>(this)); - isolate_->RequestInterrupt([](v8::Isolate* isolate, void* thread) { - static_cast<MainThreadInterface*>(thread)->DispatchMessages(); - }, this); + platform_->GetForegroundTaskRunner(isolate_); + std::weak_ptr<MainThreadInterface>* interface_ptr = + new std::weak_ptr<MainThreadInterface>(shared_from_this()); + taskrunner->PostTask( + std::make_unique<DispatchMessagesTask>(*interface_ptr)); + isolate_->RequestInterrupt([](v8::Isolate* isolate, void* opaque) { + std::unique_ptr<std::weak_ptr<MainThreadInterface>> interface_ptr { + static_cast<std::weak_ptr<MainThreadInterface>*>(opaque) }; + if (auto iface = interface_ptr->lock()) iface->DispatchMessages(); + }, static_cast<void*>(interface_ptr)); } } incoming_message_cond_.Broadcast(scoped_lock); diff --git a/src/inspector/main_thread_interface.h b/src/inspector/main_thread_interface.h index 9a48192cd3..bcea19f3f3 100644 --- a/src/inspector/main_thread_interface.h +++ b/src/inspector/main_thread_interface.h @@ -70,7 +70,8 @@ class MainThreadHandle : public std::enable_shared_from_this<MainThreadHandle> { friend class MainThreadInterface; }; -class MainThreadInterface { +class MainThreadInterface : + public std::enable_shared_from_this<MainThreadInterface> { public: MainThreadInterface(Agent* agent, uv_loop_t*, v8::Isolate* isolate, v8::Platform* platform); diff --git a/src/inspector_agent.cc b/src/inspector_agent.cc index 424b09d6e1..469e0b4f8f 100644 --- a/src/inspector_agent.cc +++ b/src/inspector_agent.cc @@ -665,10 +665,10 @@ class NodeInspectorClient : public V8InspectorClient { } std::shared_ptr<MainThreadHandle> getThreadHandle() { - if (interface_ == nullptr) { - interface_.reset(new MainThreadInterface( + if (!interface_) { + interface_ = std::make_shared<MainThreadInterface>( env_->inspector_agent(), env_->event_loop(), env_->isolate(), - env_->isolate_data()->platform())); + env_->isolate_data()->platform()); } return interface_->GetHandle(); } @@ -739,7 +739,7 @@ class NodeInspectorClient : public V8InspectorClient { bool waiting_for_frontend_ = false; bool waiting_for_sessions_disconnect_ = false; // Allows accessing Inspector from non-main threads - std::unique_ptr<MainThreadInterface> interface_; + std::shared_ptr<MainThreadInterface> interface_; std::shared_ptr<WorkerManager> worker_manager_; }; |