Browse Source

Fix stdout flush issue

http://github.com/ry/node/issues#issue/53
v0.7.4-release
Ryan Dahl 15 years ago
parent
commit
ae1fc497bb
  1. 2
      src/node.cc
  2. 13
      src/node_stdio.cc
  3. 1
      src/node_stdio.h
  4. 2
      test/mjsunit/fixtures/print-chars.js
  5. 36
      test/mjsunit/test-stdout-flush.js

2
src/node.cc

@ -1160,6 +1160,8 @@ int main(int argc, char *argv[]) {
// so your next reading stop should be node::Load()! // so your next reading stop should be node::Load()!
node::Load(argc, argv); node::Load(argc, argv);
node::Stdio::Flush();
#ifndef NDEBUG #ifndef NDEBUG
// Clean up. // Clean up.
context.Dispose(); context.Dispose();

13
src/node_stdio.cc

@ -197,6 +197,19 @@ Close (const Arguments& args)
return Undefined(); return Undefined();
} }
void Stdio::Flush() {
if (stdout_fd >= 0) {
close(stdout_fd);
stdout_fd = -1;
}
if (stdout_coupling) {
coupling_join(stdout_coupling);
coupling_destroy(stdout_coupling);
stdout_coupling = NULL;
}
}
void void
Stdio::Initialize (v8::Handle<v8::Object> target) Stdio::Initialize (v8::Handle<v8::Object> target)
{ {

1
src/node_stdio.h

@ -11,6 +11,7 @@ namespace node {
class Stdio { class Stdio {
public: public:
static void Initialize (v8::Handle<v8::Object> target); static void Initialize (v8::Handle<v8::Object> target);
static void Flush ();
}; };
} // namespace node } // namespace node

2
test/mjsunit/fixtures/print-chars.js

@ -8,5 +8,3 @@ for (var i = 0; i < n-1; i++) {
} }
puts(s); // \n is the nth char. puts(s); // \n is the nth char.
process.exit(0);

36
test/mjsunit/test-stdout-flush.js

@ -2,43 +2,27 @@ process.mixin(require("./common"));
var sub = path.join(fixturesDir, 'print-chars.js'); var sub = path.join(fixturesDir, 'print-chars.js');
completedTests = 0; n = 100000;
function test (n, cb) { var child = process.createChildProcess(process.argv[0], [sub, n]);
var child = process.createChildProcess(process.argv[0], [sub, n]);
var count = 0; var count = 0;
child.addListener("error", function (data){ child.addListener("error", function (data){
if (data) { if (data) {
puts("parent stderr: " + data); puts("parent stderr: " + data);
assert.ok(false); assert.ok(false);
} }
}); });
child.addListener("output", function (data){ child.addListener("output", function (data){
if (data) { if (data) {
count += data.length; count += data.length;
puts(count);
} }
});
child.addListener("exit", function (data) {
assert.equal(n, count);
puts(n + " okay");
completedTests++;
if (cb) cb();
});
}
test(5000, function () {
test(50000, function () {
test(500000);
});
}); });
child.addListener("exit", function (data) {
process.addListener('exit', function () { assert.equal(n, count);
assert.equal(3, completedTests); puts("okay");
}); });

Loading…
Cancel
Save