Skip to content

Commit

Permalink
process: use owner_symbol for _getActive*
Browse files Browse the repository at this point in the history
This makes it easier to provide public APIs in the return types
of `process._getActiveHandles()` and `process._getActiveRequests()`.

PR-URL: #22002
Backport-PR-URL: #22507
Reviewed-By: Michaël Zasso <[email protected]>
  • Loading branch information
addaleax authored and targos committed Sep 3, 2018
1 parent 46fbc23 commit 5af6a89
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 9 deletions.
21 changes: 21 additions & 0 deletions src/async_wrap.cc
Original file line number Diff line number Diff line change
Expand Up @@ -736,6 +736,27 @@ std::string AsyncWrap::diagnostic_name() const {
std::to_string(static_cast<int64_t>(async_id_)) + ")";
}

Local<Object> AsyncWrap::GetOwner() {
return GetOwner(env(), object());
}

Local<Object> AsyncWrap::GetOwner(Environment* env, Local<Object> obj) {
v8::EscapableHandleScope handle_scope(env->isolate());
CHECK(!obj.IsEmpty());

v8::TryCatch ignore_exceptions(env->isolate());
while (true) {
Local<Value> owner;
if (!obj->Get(env->context(),
env->owner_symbol()).ToLocal(&owner) ||
!owner->IsObject()) {
return handle_scope.Escape(obj);
}

obj = owner.As<Object>();
}
}

} // namespace node

NODE_BUILTIN_MODULE_CONTEXT_AWARE(async_wrap, node::AsyncWrap::Initialize)
6 changes: 6 additions & 0 deletions src/async_wrap.h
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,12 @@ class AsyncWrap : public BaseObject {

static void WeakCallback(const v8::WeakCallbackInfo<DestroyParam> &info);

// Returns the object that 'owns' an async wrap. For example, for a
// TCP connection handle, this is the corresponding net.Socket.
v8::Local<v8::Object> GetOwner();
static v8::Local<v8::Object> GetOwner(Environment* env,
v8::Local<v8::Object> obj);

// This is a simplified version of InternalCallbackScope that only runs
// the `before` and `after` hooks. Only use it when not actually calling
// back into JS; otherwise, use InternalCallbackScope.
Expand Down
12 changes: 3 additions & 9 deletions src/node.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1143,7 +1143,7 @@ static void GetActiveRequests(const FunctionCallbackInfo<Value>& args) {
for (auto w : *env->req_wrap_queue()) {
if (w->persistent().IsEmpty())
continue;
argv[idx] = w->object();
argv[idx] = w->GetOwner();
if (++idx >= arraysize(argv)) {
fn->Call(ctx, ary, idx, argv).ToLocalChecked();
idx = 0;
Expand All @@ -1169,16 +1169,10 @@ void GetActiveHandles(const FunctionCallbackInfo<Value>& args) {
Local<Value> argv[NODE_PUSH_VAL_TO_ARRAY_MAX];
size_t idx = 0;

Local<String> owner_sym = env->owner_string();

for (auto w : *env->handle_wrap_queue()) {
if (w->persistent().IsEmpty() || !HandleWrap::HasRef(w))
if (!HandleWrap::HasRef(w))
continue;
Local<Object> object = w->object();
Local<Value> owner = object->Get(owner_sym);
if (owner->IsUndefined())
owner = object;
argv[idx] = owner;
argv[idx] = w->GetOwner();
if (++idx >= arraysize(argv)) {
fn->Call(ctx, ary, idx, argv).ToLocalChecked();
idx = 0;
Expand Down

0 comments on commit 5af6a89

Please sign in to comment.