summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/stream_pipe.cc6
-rw-r--r--src/stream_pipe.h2
2 files changed, 5 insertions, 3 deletions
diff --git a/src/stream_pipe.cc b/src/stream_pipe.cc
index b84c8f4c66..d405c4d5cb 100644
--- a/src/stream_pipe.cc
+++ b/src/stream_pipe.cc
@@ -42,7 +42,7 @@ StreamPipe::StreamPipe(StreamBase* source,
}
StreamPipe::~StreamPipe() {
- Unpipe();
+ Unpipe(true);
}
StreamBase* StreamPipe::source() {
@@ -53,7 +53,7 @@ StreamBase* StreamPipe::sink() {
return static_cast<StreamBase*>(writable_listener_.stream());
}
-void StreamPipe::Unpipe() {
+void StreamPipe::Unpipe(bool is_in_deletion) {
if (is_closed_)
return;
@@ -68,6 +68,8 @@ void StreamPipe::Unpipe() {
source()->RemoveStreamListener(&readable_listener_);
sink()->RemoveStreamListener(&writable_listener_);
+ if (is_in_deletion) return;
+
// Delay the JS-facing part with SetImmediate, because this might be from
// inside the garbage collector, so we can’t run JS here.
HandleScope handle_scope(env()->isolate());
diff --git a/src/stream_pipe.h b/src/stream_pipe.h
index 061ad9842e..0e15500610 100644
--- a/src/stream_pipe.h
+++ b/src/stream_pipe.h
@@ -12,7 +12,7 @@ class StreamPipe : public AsyncWrap {
StreamPipe(StreamBase* source, StreamBase* sink, v8::Local<v8::Object> obj);
~StreamPipe() override;
- void Unpipe();
+ void Unpipe(bool is_in_deletion = false);
static void New(const v8::FunctionCallbackInfo<v8::Value>& args);
static void Start(const v8::FunctionCallbackInfo<v8::Value>& args);