From e19c5ddec0b293978881f6ba0e5b564b96dceb07 Mon Sep 17 00:00:00 2001 From: Jeremiah Senkpiel Date: Tue, 3 May 2016 10:47:10 -0400 Subject: [PATCH 1/2] Revert "handle_wrap: IsRefed -> Unrefed, no isAlive check" This reverts commit 9bb5a5e2a127010807f5b8a8bf4cf34109271c55. Refs: https://github.com/nodejs/node/pull/6395 Refs: https://github.com/nodejs/node/pull/6204 Refs: https://github.com/nodejs/node/pull/6401 Refs: https://github.com/nodejs/node/pull/6382 Fixes: https://github.com/nodejs/node/pull/6381 Conflicts: src/handle_wrap.cc test/parallel/test-handle-wrap-isrefed-tty.js test/parallel/test-handle-wrap-isrefed.js --- src/handle_wrap.cc | 4 +- src/handle_wrap.h | 2 +- src/pipe_wrap.cc | 2 +- src/process_wrap.cc | 2 +- src/signal_wrap.cc | 2 +- src/tcp_wrap.cc | 2 +- src/timer_wrap.cc | 2 +- src/tty_wrap.cc | 2 +- src/udp_wrap.cc | 2 +- test/parallel/test-handle-wrap-isrefed-tty.js | 13 ++- test/parallel/test-handle-wrap-isrefed.js | 80 ++++++++----------- 11 files changed, 50 insertions(+), 63 deletions(-) diff --git a/src/handle_wrap.cc b/src/handle_wrap.cc index b82449989dd46e..d28b6959c82150 100644 --- a/src/handle_wrap.cc +++ b/src/handle_wrap.cc @@ -33,9 +33,9 @@ void HandleWrap::Unref(const FunctionCallbackInfo& args) { } -void HandleWrap::Unrefed(const FunctionCallbackInfo& args) { +void HandleWrap::IsRefed(const FunctionCallbackInfo& args) { HandleWrap* wrap = Unwrap(args.Holder()); - args.GetReturnValue().Set(!HasRef(wrap)); + args.GetReturnValue().Set(HasRef(wrap)); } diff --git a/src/handle_wrap.h b/src/handle_wrap.h index ef37cf9e3413d7..506358c14056ef 100644 --- a/src/handle_wrap.h +++ b/src/handle_wrap.h @@ -35,7 +35,7 @@ class HandleWrap : public AsyncWrap { static void Close(const v8::FunctionCallbackInfo& args); static void Ref(const v8::FunctionCallbackInfo& args); static void Unref(const v8::FunctionCallbackInfo& args); - static void Unrefed(const v8::FunctionCallbackInfo& args); + static void IsRefed(const v8::FunctionCallbackInfo& args); static inline bool IsAlive(const HandleWrap* wrap) { return wrap != nullptr && wrap->state_ != kClosed; diff --git a/src/pipe_wrap.cc b/src/pipe_wrap.cc index 43df5cb7158b41..25080041c276d8 100644 --- a/src/pipe_wrap.cc +++ b/src/pipe_wrap.cc @@ -80,7 +80,7 @@ void PipeWrap::Initialize(Local target, env->SetProtoMethod(t, "close", HandleWrap::Close); env->SetProtoMethod(t, "unref", HandleWrap::Unref); env->SetProtoMethod(t, "ref", HandleWrap::Ref); - env->SetProtoMethod(t, "unrefed", HandleWrap::Unrefed); + env->SetProtoMethod(t, "isRefed", HandleWrap::IsRefed); StreamWrap::AddMethods(env, t); diff --git a/src/process_wrap.cc b/src/process_wrap.cc index b804d9f35e47f1..0b7ad41b61a5ae 100644 --- a/src/process_wrap.cc +++ b/src/process_wrap.cc @@ -40,7 +40,7 @@ class ProcessWrap : public HandleWrap { env->SetProtoMethod(constructor, "ref", HandleWrap::Ref); env->SetProtoMethod(constructor, "unref", HandleWrap::Unref); - env->SetProtoMethod(constructor, "unrefed", HandleWrap::Unrefed); + env->SetProtoMethod(constructor, "isRefed", HandleWrap::IsRefed); target->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "Process"), constructor->GetFunction()); diff --git a/src/signal_wrap.cc b/src/signal_wrap.cc index a008b083f0ab53..ca5201d81a4b14 100644 --- a/src/signal_wrap.cc +++ b/src/signal_wrap.cc @@ -32,7 +32,7 @@ class SignalWrap : public HandleWrap { env->SetProtoMethod(constructor, "close", HandleWrap::Close); env->SetProtoMethod(constructor, "ref", HandleWrap::Ref); env->SetProtoMethod(constructor, "unref", HandleWrap::Unref); - env->SetProtoMethod(constructor, "unrefed", HandleWrap::Unrefed); + env->SetProtoMethod(constructor, "isRefed", HandleWrap::IsRefed); env->SetProtoMethod(constructor, "start", Start); env->SetProtoMethod(constructor, "stop", Stop); diff --git a/src/tcp_wrap.cc b/src/tcp_wrap.cc index d1cc99e756e124..4e8617af2d0c18 100644 --- a/src/tcp_wrap.cc +++ b/src/tcp_wrap.cc @@ -87,7 +87,7 @@ void TCPWrap::Initialize(Local target, env->SetProtoMethod(t, "ref", HandleWrap::Ref); env->SetProtoMethod(t, "unref", HandleWrap::Unref); - env->SetProtoMethod(t, "unrefed", HandleWrap::Unrefed); + env->SetProtoMethod(t, "isRefed", HandleWrap::IsRefed); StreamWrap::AddMethods(env, t, StreamBase::kFlagHasWritev); diff --git a/src/timer_wrap.cc b/src/timer_wrap.cc index b2c41ebf73a51e..4a1cd3716a9030 100644 --- a/src/timer_wrap.cc +++ b/src/timer_wrap.cc @@ -39,7 +39,7 @@ class TimerWrap : public HandleWrap { env->SetProtoMethod(constructor, "close", HandleWrap::Close); env->SetProtoMethod(constructor, "ref", HandleWrap::Ref); env->SetProtoMethod(constructor, "unref", HandleWrap::Unref); - env->SetProtoMethod(constructor, "unrefed", HandleWrap::Unrefed); + env->SetProtoMethod(constructor, "isRefed", HandleWrap::IsRefed); env->SetProtoMethod(constructor, "start", Start); env->SetProtoMethod(constructor, "stop", Stop); diff --git a/src/tty_wrap.cc b/src/tty_wrap.cc index e7acedd27a1745..5a1d333c3d2bf1 100644 --- a/src/tty_wrap.cc +++ b/src/tty_wrap.cc @@ -36,7 +36,7 @@ void TTYWrap::Initialize(Local target, env->SetProtoMethod(t, "close", HandleWrap::Close); env->SetProtoMethod(t, "unref", HandleWrap::Unref); - env->SetProtoMethod(t, "unrefed", HandleWrap::Unrefed); + env->SetProtoMethod(t, "isRefed", HandleWrap::IsRefed); StreamWrap::AddMethods(env, t, StreamBase::kFlagNoShutdown); diff --git a/src/udp_wrap.cc b/src/udp_wrap.cc index b5f3a3cf540f05..ac087f395aced7 100644 --- a/src/udp_wrap.cc +++ b/src/udp_wrap.cc @@ -108,7 +108,7 @@ void UDPWrap::Initialize(Local target, env->SetProtoMethod(t, "ref", HandleWrap::Ref); env->SetProtoMethod(t, "unref", HandleWrap::Unref); - env->SetProtoMethod(t, "unrefed", HandleWrap::Unrefed); + env->SetProtoMethod(t, "isRefed", HandleWrap::IsRefed); target->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "UDP"), t->GetFunction()); env->set_udp_constructor_function(t->GetFunction()); diff --git a/test/parallel/test-handle-wrap-isrefed-tty.js b/test/parallel/test-handle-wrap-isrefed-tty.js index 3eca28e18a8d29..972b34e0dc0722 100644 --- a/test/parallel/test-handle-wrap-isrefed-tty.js +++ b/test/parallel/test-handle-wrap-isrefed-tty.js @@ -9,19 +9,18 @@ function makeAssert(message) { strictEqual(actual, expected, message); }; } -const assert = makeAssert('unrefed() not working on tty_wrap'); +const assert = makeAssert('isRefed() not working on tty_wrap'); if (process.argv[2] === 'child') { // Test tty_wrap in piped child to guarentee stdin being a TTY. const ReadStream = require('tty').ReadStream; const tty = new ReadStream(0); - assert(Object.getPrototypeOf(tty._handle).hasOwnProperty('unrefed'), true); - assert(tty._handle.unrefed(), false); + assert(Object.getPrototypeOf(tty._handle).hasOwnProperty('isRefed'), true); + assert(tty._handle.isRefed(), true); tty.unref(); - assert(tty._handle.unrefed(), true); - tty._handle.close(common.mustCall(() => assert(tty._handle.unrefed(), true))); - tty._handle.close(common.fail); - assert(tty._handle.unrefed(), true); + assert(tty._handle.isRefed(), false); + tty._handle.close( + common.mustCall(() => assert(tty._handle.isRefed(), false))); return; } diff --git a/test/parallel/test-handle-wrap-isrefed.js b/test/parallel/test-handle-wrap-isrefed.js index 544729c2210955..e4036e75f6b99c 100644 --- a/test/parallel/test-handle-wrap-isrefed.js +++ b/test/parallel/test-handle-wrap-isrefed.js @@ -12,102 +12,90 @@ function makeAssert(message) { // child_process { - const assert = makeAssert('unrefed() not working on process_wrap'); + const assert = makeAssert('isRefed() not working on process_wrap'); const spawn = require('child_process').spawn; const cmd = common.isWindows ? 'rundll32' : 'ls'; const cp = spawn(cmd); - assert(Object.getPrototypeOf(cp._handle).hasOwnProperty('unrefed'), true); - assert(cp._handle.unrefed(), false); + assert(Object.getPrototypeOf(cp._handle).hasOwnProperty('isRefed'), true); + assert(cp._handle.isRefed(), true); cp.unref(); - assert(cp._handle.unrefed(), true); + assert(cp._handle.isRefed(), false); cp.ref(); - assert(cp._handle.unrefed(), false); - cp._handle.close(common.mustCall(() => assert(cp._handle.unrefed(), true))); - cp._handle.close(common.fail); - assert(cp._handle.unrefed(), false); + assert(cp._handle.isRefed(), true); + cp._handle.close(common.mustCall(() => assert(cp._handle.isRefed(), false))); } // dgram { - const assert = makeAssert('unrefed() not working on udp_wrap'); + const assert = makeAssert('isRefed() not working on udp_wrap'); const dgram = require('dgram'); const sock4 = dgram.createSocket('udp4'); - assert(Object.getPrototypeOf(sock4._handle).hasOwnProperty('unrefed'), true); - assert(sock4._handle.unrefed(), false); + assert(Object.getPrototypeOf(sock4._handle).hasOwnProperty('isRefed'), true); + assert(sock4._handle.isRefed(), true); sock4.unref(); - assert(sock4._handle.unrefed(), true); + assert(sock4._handle.isRefed(), false); sock4.ref(); - assert(sock4._handle.unrefed(), false); + assert(sock4._handle.isRefed(), true); sock4._handle.close( - common.mustCall(() => assert(sock4._handle.unrefed(), true))); - sock4._handle.close(common.fail); - assert(sock4._handle.unrefed(), false); + common.mustCall(() => assert(sock4._handle.isRefed(), false))); const sock6 = dgram.createSocket('udp6'); - assert(Object.getPrototypeOf(sock6._handle).hasOwnProperty('unrefed'), true); - assert(sock6._handle.unrefed(), false); + assert(Object.getPrototypeOf(sock6._handle).hasOwnProperty('isRefed'), true); + assert(sock6._handle.isRefed(), true); sock6.unref(); - assert(sock6._handle.unrefed(), true); + assert(sock6._handle.isRefed(), false); sock6.ref(); - assert(sock6._handle.unrefed(), false); + assert(sock6._handle.isRefed(), true); sock6._handle.close( - common.mustCall(() => assert(sock6._handle.unrefed(), true))); - sock6._handle.close(common.fail); - assert(sock6._handle.unrefed(), false); + common.mustCall(() => assert(sock6._handle.isRefed(), false))); } // pipe { - const assert = makeAssert('unrefed() not working on pipe_wrap'); + const assert = makeAssert('isRefed() not working on pipe_wrap'); const Pipe = process.binding('pipe_wrap').Pipe; const handle = new Pipe(); - assert(Object.getPrototypeOf(handle).hasOwnProperty('unrefed'), true); - assert(handle.unrefed(), false); + assert(Object.getPrototypeOf(handle).hasOwnProperty('isRefed'), true); + assert(handle.isRefed(), true); handle.unref(); - assert(handle.unrefed(), true); + assert(handle.isRefed(), false); handle.ref(); - assert(handle.unrefed(), false); - handle.close(common.mustCall(() => assert(handle.unrefed(), true))); - handle.close(common.fail); - assert(handle.unrefed(), false); + assert(handle.isRefed(), true); + handle.close(common.mustCall(() => assert(handle.isRefed(), false))); } // tcp { - const assert = makeAssert('unrefed() not working on tcp_wrap'); + const assert = makeAssert('isRefed() not working on tcp_wrap'); const net = require('net'); const server = net.createServer(() => {}).listen(common.PORT); - assert(Object.getPrototypeOf(server._handle).hasOwnProperty('unrefed'), true); - assert(server._handle.unrefed(), false); + assert(Object.getPrototypeOf(server._handle).hasOwnProperty('isRefed'), true); + assert(server._handle.isRefed(), true); assert(server._unref, false); server.unref(); - assert(server._handle.unrefed(), true); + assert(server._handle.isRefed(), false); assert(server._unref, true); server.ref(); - assert(server._handle.unrefed(), false); + assert(server._handle.isRefed(), true); assert(server._unref, false); server._handle.close( - common.mustCall(() => assert(server._handle.unrefed(), true))); - server._handle.close(common.fail); - assert(server._handle.unrefed(), false); + common.mustCall(() => assert(server._handle.isRefed(), false))); } // timers { - const assert = makeAssert('unrefed() not working on timer_wrap'); + const assert = makeAssert('isRefed() not working on timer_wrap'); const timer = setTimeout(() => {}, 500); timer.unref(); - assert(Object.getPrototypeOf(timer._handle).hasOwnProperty('unrefed'), true); - assert(timer._handle.unrefed(), true); + assert(Object.getPrototypeOf(timer._handle).hasOwnProperty('isRefed'), true); + assert(timer._handle.isRefed(), false); timer.ref(); - assert(timer._handle.unrefed(), false); + assert(timer._handle.isRefed(), true); timer._handle.close( - common.mustCall(() => assert(timer._handle.unrefed(), true))); - timer._handle.close(common.fail); - assert(timer._handle.unrefed(), false); + common.mustCall(() => assert(timer._handle.isRefed(), false))); } From 9b62ab026f7633fab46aaf3afa1de8b839f46a15 Mon Sep 17 00:00:00 2001 From: Jeremiah Senkpiel Date: Mon, 25 Apr 2016 19:29:47 -0400 Subject: [PATCH 2/2] timers: use HandleWrap::Unrefed --- lib/timers.js | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/lib/timers.js b/lib/timers.js index dc2506e01e09a4..c909261383e45f 100644 --- a/lib/timers.js +++ b/lib/timers.js @@ -133,8 +133,6 @@ function insert(item, unrefed) { list = new TimersList(msecs, unrefed); L.init(list); list._timer._list = list; - - if (unrefed === true) list._timer.unref(); list._timer.start(msecs, 0); lists[msecs] = list; @@ -149,7 +147,7 @@ function TimersList(msecs, unrefed) { this._idleNext = null; // Create the list with the linkedlist properties to this._idlePrev = null; // prevent any unnecessary hidden class changes. this._timer = new TimerWrap(); - this._unrefed = unrefed; + if (unrefed === true) this._timer.unref(); this.msecs = msecs; } @@ -206,12 +204,12 @@ function listOnTimeout() { // As such, we can remove the list and clean up the TimerWrap C++ handle. debug('%d list empty', msecs); assert(L.isEmpty(list)); - this.close(); - if (list._unrefed === true) { - delete unrefedLists[msecs]; - } else { + if (list._timer.isRefed() === true) { delete refedLists[msecs]; + } else { + delete unrefedLists[msecs]; } + this.close(); }