diff options
author | Gerhard Stoebich <18708370+Flarna@users.noreply.github.com> | 2019-05-05 21:29:32 +0200 |
---|---|---|
committer | Anna Henningsen <anna@addaleax.net> | 2019-05-19 23:17:06 +0200 |
commit | 3d9d1ade2a361f408b116c5bafb2fcd560310f9c (patch) | |
tree | 7d0eb2feb0652bc9cf4609df6b1a437ea824303a /src/async_wrap.cc | |
parent | ee59763ab3b67f8792ed53a4d098212a040994f9 (diff) | |
download | android-node-v8-3d9d1ade2a361f408b116c5bafb2fcd560310f9c.tar.gz android-node-v8-3d9d1ade2a361f408b116c5bafb2fcd560310f9c.tar.bz2 android-node-v8-3d9d1ade2a361f408b116c5bafb2fcd560310f9c.zip |
async_hooks: don't reuse resource in HttpAgent
As discussed in https://github.com/nodejs/diagnostics/issues/248,
https://github.com/nodejs/node/pull/21313 and
https://docs.google.com/document/d/1g8OrG5lMIUhRn1zbkutgY83MiTSMx-0NHDs8Bf-nXxM/preview
reusing the resource object is a blocker for landing a resource based
async hooks API and get rid of the promise destroy hook.
This PR ensures that HttpAgent uses the a new resource object in case
the socket handle gets reused.
PR-URL: https://github.com/nodejs/node/pull/27581
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Rich Trott <rtrott@gmail.com>
Diffstat (limited to 'src/async_wrap.cc')
-rw-r--r-- | src/async_wrap.cc | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/src/async_wrap.cc b/src/async_wrap.cc index 8cb30a6f6a..e11ce07681 100644 --- a/src/async_wrap.cc +++ b/src/async_wrap.cc @@ -410,13 +410,26 @@ void AsyncWrap::PopAsyncIds(const FunctionCallbackInfo<Value>& args) { void AsyncWrap::AsyncReset(const FunctionCallbackInfo<Value>& args) { + CHECK(args[0]->IsObject()); + AsyncWrap* wrap; ASSIGN_OR_RETURN_UNWRAP(&wrap, args.Holder()); + + Local<Object> resource = args[0].As<Object>(); double execution_async_id = - args[0]->IsNumber() ? args[0].As<Number>()->Value() : kInvalidAsyncId; - wrap->AsyncReset(execution_async_id); + args[1]->IsNumber() ? args[1].As<Number>()->Value() : kInvalidAsyncId; + wrap->AsyncReset(resource, execution_async_id); } + +void AsyncWrap::GetProviderType(const FunctionCallbackInfo<Value>& args) { + AsyncWrap* wrap; + args.GetReturnValue().Set(AsyncWrap::PROVIDER_NONE); + ASSIGN_OR_RETURN_UNWRAP(&wrap, args.Holder()); + args.GetReturnValue().Set(wrap->provider_type()); +} + + void AsyncWrap::EmitDestroy() { AsyncWrap::EmitDestroy(env(), async_id_); // Ensure no double destroy is emitted via AsyncReset(). @@ -437,6 +450,7 @@ Local<FunctionTemplate> AsyncWrap::GetConstructorTemplate(Environment* env) { tmpl->SetClassName(FIXED_ONE_BYTE_STRING(env->isolate(), "AsyncWrap")); env->SetProtoMethod(tmpl, "getAsyncId", AsyncWrap::GetAsyncId); env->SetProtoMethod(tmpl, "asyncReset", AsyncWrap::AsyncReset); + env->SetProtoMethod(tmpl, "getProviderType", AsyncWrap::GetProviderType); env->set_async_wrap_ctor_template(tmpl); } return tmpl; |