Skip to content

Commit

Permalink
process, bugfix: process.wait not return while process is already exit.
Browse files Browse the repository at this point in the history
  • Loading branch information
xicilion committed Nov 14, 2017
1 parent 1973754 commit 89454b9
Show file tree
Hide file tree
Showing 14 changed files with 37 additions and 19 deletions.
6 changes: 6 additions & 0 deletions fibjs/src/io/AsyncIO_ev.cpp
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include <fcntl.h> #include <fcntl.h>
#include <exlib/include/thread.h> #include <exlib/include/thread.h>
#include "options.h" #include "options.h"
#include <sys/wait.h>


namespace fibjs { namespace fibjs {


Expand Down Expand Up @@ -669,6 +670,11 @@ result_t AsyncIO::waitpid(intptr_t pid, int32_t& retVal, AsyncEvent* ac)
{ {
ev_child_init(&cw, child_cb, m_pid, 0); ev_child_init(&cw, child_cb, m_pid, 0);
ev_child_start(s_loop, &cw); ev_child_start(s_loop, &cw);

cw.rstatus = 0;
pid_t pid1 = ::waitpid(m_pid, &cw.rstatus, WNOHANG);
if (pid1 == -1 || pid1 == m_pid)
child_cb(s_loop, &cw, 0);
} }


private: private:
Expand Down
4 changes: 2 additions & 2 deletions fibjs/src/process/SubProcess_posix.cpp
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -153,11 +153,11 @@ result_t SubProcess::create(exlib::string command, v8::Local<v8::Array> args, v8
#ifdef Linux #ifdef Linux
if (err == 0) { if (err == 0) {
int32_t status = 0; int32_t status = 0;
waitpid(pid, &status, WNOHANG); pid_t pid1 = waitpid(pid, &status, WNOHANG);
if (WIFEXITED(status)) if (WIFEXITED(status))
status = WEXITSTATUS(status); status = WEXITSTATUS(status);


if (status == 127) if (pid1 == -1 || status == 127)
err = 2; err = 2;
} }
#endif #endif
Expand Down
1 change: 1 addition & 0 deletions test/process/exec1.js
Original file line number Original file line Diff line number Diff line change
@@ -1 +1,2 @@
process.exitCode = 1;
console.log(console.readLine()); console.log(console.readLine());
5 changes: 3 additions & 2 deletions test/process/exec10.js
Original file line number Original file line Diff line number Diff line change
@@ -1,4 +1,5 @@
setInterval(function() { process.exitCode = 10;
setInterval(function () {
console.log(400); console.log(400);
this.clear(); this.clear();
}, 100); }, 100);
3 changes: 2 additions & 1 deletion test/process/exec11.js
Original file line number Original file line Diff line number Diff line change
@@ -1,3 +1,4 @@
process.exitCode = 11;
setImmediate(() => { setImmediate(() => {
console.log(500); console.log(500);
}); });
3 changes: 2 additions & 1 deletion test/process/exec12.js
Original file line number Original file line Diff line number Diff line change
@@ -1,7 +1,8 @@
var coroutine = require('coroutine') var coroutine = require('coroutine')


process.exitCode = 12;
setTimeout(() => { setTimeout(() => {
coroutine.start(() => { coroutine.start(() => {
console.log(600); console.log(600);
}); });
}, 10); }, 10);
3 changes: 2 additions & 1 deletion test/process/exec2.js
Original file line number Original file line Diff line number Diff line change
@@ -1,4 +1,5 @@
var process = require('process'); var process = require('process');
var json = require('json'); var json = require('json');


console.log(json.encode(process.argv)); console.log(json.encode(process.argv));
process.exitCode = 2;
3 changes: 2 additions & 1 deletion test/process/exec3.js
Original file line number Original file line Diff line number Diff line change
@@ -1,4 +1,5 @@
var process = require('process'); var process = require('process');
var json = require('json'); var json = require('json');


console.log(json.encode(process.execArgv)); console.log(json.encode(process.execArgv));
process.exitCode = 3;
3 changes: 2 additions & 1 deletion test/process/exec4.js
Original file line number Original file line Diff line number Diff line change
@@ -1,4 +1,5 @@
var process = require('process'); var process = require('process');
var json = require('json'); var json = require('json');


console.log(json.encode(process.env)); console.log(json.encode(process.env));
process.exitCode = 4;
3 changes: 2 additions & 1 deletion test/process/exec5.js
Original file line number Original file line Diff line number Diff line change
@@ -1,2 +1,3 @@
var coroutine = require("coroutine"); var coroutine = require("coroutine");
coroutine.sleep(10000); coroutine.sleep(10000);
process.exitCode = 5;
4 changes: 3 additions & 1 deletion test/process/exec7.js
Original file line number Original file line Diff line number Diff line change
@@ -1,6 +1,8 @@
var coroutine = require('coroutine'); var coroutine = require('coroutine');


process.exitCode = 7;

coroutine.start(() => { coroutine.start(() => {
coroutine.sleep(100); coroutine.sleep(100);
console.log(100); console.log(100);
}); });
3 changes: 2 additions & 1 deletion test/process/exec8.js
Original file line number Original file line Diff line number Diff line change
@@ -1,5 +1,6 @@
var coroutine = require('coroutine'); var coroutine = require('coroutine');


process.exitCode = 8;
coroutine.sleep(100, () => { coroutine.sleep(100, () => {
console.log(200); console.log(200);
}); });
3 changes: 2 additions & 1 deletion test/process/exec9.js
Original file line number Original file line Diff line number Diff line change
@@ -1,3 +1,4 @@
process.exitCode = 9;
setTimeout(() => { setTimeout(() => {
console.log(300); console.log(300);
}, 100); }, 100);
12 changes: 6 additions & 6 deletions test/process_test.js
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -74,37 +74,37 @@ describe('process', () => {
it("multi fiber", () => { it("multi fiber", () => {
var p = process.open(cmd, [path.join(__dirname, 'process', 'exec7.js')]); var p = process.open(cmd, [path.join(__dirname, 'process', 'exec7.js')]);
assert.equal(p.readLine(), "100"); assert.equal(p.readLine(), "100");
assert.equal(p.wait(), 0); assert.equal(p.wait(), 7);
}); });


it("pendding async", () => { it("pendding async", () => {
var p = process.open(cmd, [path.join(__dirname, 'process', 'exec8.js')]); var p = process.open(cmd, [path.join(__dirname, 'process', 'exec8.js')]);
assert.equal(p.readLine(), "200"); assert.equal(p.readLine(), "200");
assert.equal(p.wait(), 0); assert.equal(p.wait(), 8);
}); });


it("setTimeout", () => { it("setTimeout", () => {
var p = process.open(cmd, [path.join(__dirname, 'process', 'exec9.js')]); var p = process.open(cmd, [path.join(__dirname, 'process', 'exec9.js')]);
assert.equal(p.readLine(), "300"); assert.equal(p.readLine(), "300");
assert.equal(p.wait(), 0); assert.equal(p.wait(), 9);
}); });


it("setInterval", () => { it("setInterval", () => {
var p = process.open(cmd, [path.join(__dirname, 'process', 'exec10.js')]); var p = process.open(cmd, [path.join(__dirname, 'process', 'exec10.js')]);
assert.equal(p.readLine(), "400"); assert.equal(p.readLine(), "400");
assert.equal(p.wait(), 0); assert.equal(p.wait(), 10);
}); });


it("setImmediate", () => { it("setImmediate", () => {
var p = process.open(cmd, [path.join(__dirname, 'process', 'exec11.js')]); var p = process.open(cmd, [path.join(__dirname, 'process', 'exec11.js')]);
assert.equal(p.readLine(), "500"); assert.equal(p.readLine(), "500");
assert.equal(p.wait(), 0); assert.equal(p.wait(), 11);
}); });


it("bugfix: multi fiber async", () => { it("bugfix: multi fiber async", () => {
var p = process.open(cmd, [path.join(__dirname, 'process', 'exec12.js')]); var p = process.open(cmd, [path.join(__dirname, 'process', 'exec12.js')]);
assert.equal(p.readLine(), "600"); assert.equal(p.readLine(), "600");
assert.equal(p.wait(), 0); assert.equal(p.wait(), 12);
}); });


it("start", () => { it("start", () => {
Expand Down

0 comments on commit 89454b9

Please sign in to comment.