aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/async-wrap.cc41
-rw-r--r--src/async-wrap.h3
-rw-r--r--src/env.h1
3 files changed, 45 insertions, 0 deletions
diff --git a/src/async-wrap.cc b/src/async-wrap.cc
index c53929d11b..75af5c1a08 100644
--- a/src/async-wrap.cc
+++ b/src/async-wrap.cc
@@ -427,6 +427,46 @@ static void DisablePromiseHook(const FunctionCallbackInfo<Value>& args) {
}
+class DestroyParam {
+ public:
+ double asyncId;
+ v8::Persistent<Object> target;
+ v8::Persistent<Object> propBag;
+};
+
+
+void AsyncWrap::WeakCallback(const v8::WeakCallbackInfo<DestroyParam>& info) {
+ HandleScope scope(info.GetIsolate());
+
+ Environment* env = Environment::GetCurrent(info.GetIsolate());
+ DestroyParam* p = info.GetParameter();
+ Local<Object> prop_bag = PersistentToLocal(info.GetIsolate(), p->propBag);
+
+ Local<Value> val = prop_bag->Get(env->destroyed_string());
+ if (val->IsFalse()) {
+ AsyncWrap::EmitDestroy(env, p->asyncId);
+ }
+ p->target.Reset();
+ p->propBag.Reset();
+ delete p;
+}
+
+
+static void RegisterDestroyHook(const FunctionCallbackInfo<Value>& args) {
+ CHECK(args[0]->IsObject());
+ CHECK(args[1]->IsNumber());
+ CHECK(args[2]->IsObject());
+
+ Isolate* isolate = args.GetIsolate();
+ DestroyParam* p = new DestroyParam();
+ p->asyncId = args[1].As<Number>()->Value();
+ p->target.Reset(isolate, args[0].As<Object>());
+ p->propBag.Reset(isolate, args[2].As<Object>());
+ p->target.SetWeak(
+ p, AsyncWrap::WeakCallback, v8::WeakCallbackType::kParameter);
+}
+
+
void AsyncWrap::GetAsyncId(const FunctionCallbackInfo<Value>& args) {
AsyncWrap* wrap;
args.GetReturnValue().Set(-1);
@@ -502,6 +542,7 @@ void AsyncWrap::Initialize(Local<Object> target,
env->SetMethod(target, "queueDestroyAsyncId", QueueDestroyAsyncId);
env->SetMethod(target, "enablePromiseHook", EnablePromiseHook);
env->SetMethod(target, "disablePromiseHook", DisablePromiseHook);
+ env->SetMethod(target, "registerDestroyHook", RegisterDestroyHook);
v8::PropertyAttribute ReadOnlyDontDelete =
static_cast<v8::PropertyAttribute>(v8::ReadOnly | v8::DontDelete);
diff --git a/src/async-wrap.h b/src/async-wrap.h
index 39b6f287c9..222cda1fd7 100644
--- a/src/async-wrap.h
+++ b/src/async-wrap.h
@@ -84,6 +84,7 @@ namespace node {
NODE_ASYNC_INSPECTOR_PROVIDER_TYPES(V)
class Environment;
+class DestroyParam;
class AsyncWrap : public BaseObject {
public:
@@ -163,6 +164,8 @@ class AsyncWrap : public BaseObject {
virtual size_t self_size() const = 0;
+ static void WeakCallback(const v8::WeakCallbackInfo<DestroyParam> &info);
+
private:
friend class PromiseWrap;
diff --git a/src/env.h b/src/env.h
index e37dcf17ae..75bc210cfb 100644
--- a/src/env.h
+++ b/src/env.h
@@ -120,6 +120,7 @@ class ModuleWrap;
V(cwd_string, "cwd") \
V(dest_string, "dest") \
V(destroy_string, "destroy") \
+ V(destroyed_string, "destroyed") \
V(detached_string, "detached") \
V(dns_a_string, "A") \
V(dns_aaaa_string, "AAAA") \