diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/async-wrap.cc | 41 | ||||
-rw-r--r-- | src/async-wrap.h | 3 | ||||
-rw-r--r-- | src/env.h | 1 |
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; @@ -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") \ |