diff --git a/src/node.js b/src/node.js index 6b67d3406de..761f53609de 100644 --- a/src/node.js +++ b/src/node.js @@ -229,20 +229,31 @@ // Note stdout._type is used for test-module-load-list.js if (binding.isatty(fd)) { - binding.unref(); var tty = NativeModule.require('tty'); stdout = new tty.WriteStream(fd); stdout._type = "tty"; + + // FIXME Hack to have stdout not keep the event loop alive. + // See https://github.com/joyent/node/issues/1726 + binding.unref(); + stdout.on('close', function() { + binding.ref(); + }); } else if (binding.isStdoutBlocking()) { var fs = NativeModule.require('fs'); stdout = new fs.WriteStream(null, {fd: fd}); stdout._type = "fs"; } else { - binding.unref(); - var net = NativeModule.require('net'); stdout = new net.Stream(fd); + // FIXME Hack to have stdout not keep the event loop alive. + // See https://github.com/joyent/node/issues/1726 + binding.unref(); + stdout.on('close', function() { + binding.ref(); + }); + // FIXME Should probably have an option in net.Stream to create a // stream from an existing fd which is writable only. But for now // we'll just add this hack and set the `readable` member to false. diff --git a/src/node_stdio.cc b/src/node_stdio.cc index 41a63cd6995..78f3afbf0b7 100644 --- a/src/node_stdio.cc +++ b/src/node_stdio.cc @@ -209,6 +209,17 @@ static Handle Unref(const Arguments& args) { } +static Handle Ref(const Arguments& args) { + HandleScope scope; + + assert(unref_called == true); + + uv_ref(uv_default_loop()); + + return Null(); +} + + static Handle OpenStdin(const Arguments& args) { HandleScope scope; @@ -337,6 +348,7 @@ void Stdio::Initialize(v8::Handle target) { NODE_SET_METHOD(target, "openpty", OpenPTY); NODE_SET_METHOD(target, "unref", Unref); + NODE_SET_METHOD(target, "ref", Ref); struct sigaction sa; memset(&sa, 0, sizeof(sa));