diff --git a/src/node.cc b/src/node.cc index 02df0d8a5b25c3..f85a608da82203 100644 --- a/src/node.cc +++ b/src/node.cc @@ -3824,21 +3824,21 @@ static void StartNodeInstance(void* arg) { bool more; do { - more = uv_run(env->event_loop(), UV_RUN_ONCE); + more = uv_run(env->event_loop(), UV_RUN_DEFAULT); if (more == false) { EmitBeforeExit(env); - // Emit `beforeExit` if the loop became alive either after emitting - // event, or after running some callbacks. - more = uv_loop_alive(env->event_loop()); - if (uv_run(env->event_loop(), UV_RUN_NOWAIT) != 0) - more = true; + more = env->event_loop()->active_handles || + (env->event_loop()->active_reqs[0] != + env->event_loop()->active_reqs[1]); } } while (more == true); int exit_code = EmitExit(env); if (instance_data->is_main()) instance_data->set_exit_code(exit_code); + // TODO(trevnorris): This will fail for certain beforeExit cases. + //assert(!uv_loop_alive(env->event_loop())); RunAtExit(env); env->Dispose(); diff --git a/test/parallel/test-beforeexit-event-hang.js b/test/parallel/test-beforeexit-event-hang.js new file mode 100644 index 00000000000000..c0555e40910fc8 --- /dev/null +++ b/test/parallel/test-beforeexit-event-hang.js @@ -0,0 +1,8 @@ +var assert = require('assert'); +var common = require('../common'); +var i = 0; + +process.on('beforeExit', function() { + assert.ok(++i <= 1); + setTimeout(function() { }, 100).unref(); +}); diff --git a/test/parallel/test-beforeexit-event.js b/test/parallel/test-beforeexit-event.js index 8bfdbe108eccb1..8aa7e13a19e6be 100644 --- a/test/parallel/test-beforeexit-event.js +++ b/test/parallel/test-beforeexit-event.js @@ -37,6 +37,6 @@ function tryListen() { } process.on('exit', function() { - assert.equal(4, deaths); + assert.equal(3, deaths); assert.equal(3, revivals); });