diff options
Diffstat (limited to 'src/inspector/main_thread_interface.cc')
-rw-r--r-- | src/inspector/main_thread_interface.cc | 21 |
1 files changed, 13 insertions, 8 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); |