node: invoke `beforeExit` again if loop was active
authorFedor Indutny <fedor.indutny@gmail.com>
Fri, 28 Feb 2014 13:25:28 +0000 (17:25 +0400)
committerFedor Indutny <fedor.indutny@gmail.com>
Sat, 1 Mar 2014 17:30:17 +0000 (21:30 +0400)
When `setImmediate(cb)` is called in `beforeExit` event handler the
consequent `uv_run(..., UV_RUN_NOWAIT)` may return `0`, even if there
was some active handles at start.

Fixes simple/test-beforeexit-event.js.

src/node.cc

index 0a9a0cd..6accd4b 100644 (file)
@@ -3536,7 +3536,12 @@ int Start(int argc, char** argv) {
       more = uv_run(env->event_loop(), UV_RUN_ONCE);
       if (more == false) {
         EmitBeforeExit(env);
-        more = uv_run(env->event_loop(), UV_RUN_NOWAIT);
+
+        // 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;
       }
     } while (more == true);
     code = EmitExit(env);