Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nodejs/node.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnna Henningsen <anna@addaleax.net>2020-03-22 21:04:57 +0300
committerAnna Henningsen <anna@addaleax.net>2020-04-10 18:47:14 +0300
commit6f9f546406820dc9e233380e061081c9bcd1de0b (patch)
tree7140f3b3469890956a326044e1f90da4153117e2 /src/inspector
parent32e3a6bb87f2f88b8f54ff9e9f216aa5f5f0a647 (diff)
src: use env->RequestInterrupt() for inspector MainThreadInterface
This simplifies the code significantly, and removes the dependency of the inspector code on the availability of a `MultiIsolatePlatform` (by removing the dependency on a platform altogether). It also fixes a memory leak that occurs when `RequestInterrupt()` is used, but the interrupt handler is never called before the Isolate is destroyed. One downside is that this leads to a slight change in timing, because inspector messages are not dispatched in a re-entrant way. This means having to harden one test to account for that possibility by making sure that the stack is always clear through a `setImmediate()`. This does not affect the assertion made by the test, which is that messages will not be delivered synchronously while other code is executing. https://github.com/nodejs/node/issues/32415 PR-URL: https://github.com/nodejs/node/pull/32523 Reviewed-By: Matheus Marchini <mat@mmarchini.me> Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'src/inspector')
-rw-r--r--src/inspector/main_thread_interface.cc41
-rw-r--r--src/inspector/main_thread_interface.h5
2 files changed, 9 insertions, 37 deletions
diff --git a/src/inspector/main_thread_interface.cc b/src/inspector/main_thread_interface.cc
index 48a964d564f..a15cd52d239 100644
--- a/src/inspector/main_thread_interface.cc
+++ b/src/inspector/main_thread_interface.cc
@@ -1,5 +1,6 @@
#include "main_thread_interface.h"
+#include "env-inl.h"
#include "node_mutex.h"
#include "v8-inspector.h"
#include "util-inl.h"
@@ -85,19 +86,6 @@ class CallRequest : public Request {
Fn fn_;
};
-class DispatchMessagesTask : public v8::Task {
- public:
- explicit DispatchMessagesTask(std::weak_ptr<MainThreadInterface> thread)
- : thread_(thread) {}
-
- void Run() override {
- if (auto thread = thread_.lock()) thread->DispatchMessages();
- }
-
- private:
- std::weak_ptr<MainThreadInterface> thread_;
-};
-
template <typename T>
class AnotherThreadObjectReference {
public:
@@ -212,12 +200,7 @@ class ThreadSafeDelegate : public InspectorSessionDelegate {
} // namespace
-MainThreadInterface::MainThreadInterface(Agent* agent, uv_loop_t* loop,
- v8::Isolate* isolate,
- v8::Platform* platform)
- : agent_(agent), isolate_(isolate),
- platform_(platform) {
-}
+MainThreadInterface::MainThreadInterface(Agent* agent) : agent_(agent) {}
MainThreadInterface::~MainThreadInterface() {
if (handle_)
@@ -225,23 +208,15 @@ MainThreadInterface::~MainThreadInterface() {
}
void MainThreadInterface::Post(std::unique_ptr<Request> request) {
+ CHECK_NOT_NULL(agent_);
Mutex::ScopedLock scoped_lock(requests_lock_);
bool needs_notify = requests_.empty();
requests_.push_back(std::move(request));
if (needs_notify) {
- if (isolate_ != nullptr && platform_ != nullptr) {
- std::shared_ptr<v8::TaskRunner> taskrunner =
- 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));
- }
+ std::weak_ptr<MainThreadInterface> weak_self {shared_from_this()};
+ agent_->env()->RequestInterrupt([weak_self](Environment*) {
+ if (auto iface = weak_self.lock()) iface->DispatchMessages();
+ });
}
incoming_message_cond_.Broadcast(scoped_lock);
}
@@ -274,7 +249,7 @@ void MainThreadInterface::DispatchMessages() {
std::swap(dispatching_message_queue_.front(), task);
dispatching_message_queue_.pop_front();
- v8::SealHandleScope seal_handle_scope(isolate_);
+ v8::SealHandleScope seal_handle_scope(agent_->env()->isolate());
task->Call(this);
}
} while (had_messages);
diff --git a/src/inspector/main_thread_interface.h b/src/inspector/main_thread_interface.h
index 78337a25e43..3ec5b3db3e1 100644
--- a/src/inspector/main_thread_interface.h
+++ b/src/inspector/main_thread_interface.h
@@ -72,8 +72,7 @@ class MainThreadHandle : public std::enable_shared_from_this<MainThreadHandle> {
class MainThreadInterface :
public std::enable_shared_from_this<MainThreadInterface> {
public:
- MainThreadInterface(Agent* agent, uv_loop_t*, v8::Isolate* isolate,
- v8::Platform* platform);
+ explicit MainThreadInterface(Agent* agent);
~MainThreadInterface();
void DispatchMessages();
@@ -98,8 +97,6 @@ class MainThreadInterface :
ConditionVariable incoming_message_cond_;
// Used from any thread
Agent* const agent_;
- v8::Isolate* const isolate_;
- v8::Platform* const platform_;
std::shared_ptr<MainThreadHandle> handle_;
std::unordered_map<int, std::unique_ptr<Deletable>> managed_objects_;
};