diff options
author | 2022-11-28 23:47:25 -0800 | |
---|---|---|
committer | 2022-11-28 23:48:04 -0800 | |
commit | d28247573cd8e019b835452bbec191dadc38d86d (patch) | |
tree | dcea9b322f510561becf5e480053d964abcc1a56 | |
parent | 56884b5f1dd60a2673ef765a5556bd37d00c1292 (diff) | |
download | bun-d28247573cd8e019b835452bbec191dadc38d86d.tar.gz bun-d28247573cd8e019b835452bbec191dadc38d86d.tar.zst bun-d28247573cd8e019b835452bbec191dadc38d86d.zip |
Handle when the process already exited immediately
-rw-r--r-- | src/bun.js/api/bun/subprocess.zig | 2 | ||||
-rw-r--r-- | src/bun.js/base.zig | 11 | ||||
-rw-r--r-- | test/bun.js/spawn.test.ts | 72 |
3 files changed, 47 insertions, 38 deletions
diff --git a/src/bun.js/api/bun/subprocess.zig b/src/bun.js/api/bun/subprocess.zig index d803704f3..d4fc06e2d 100644 --- a/src/bun.js/api/bun/subprocess.zig +++ b/src/bun.js/api/bun/subprocess.zig @@ -1320,7 +1320,7 @@ pub const Subprocess = struct { )) { .result => {}, .err => |err| { - if (err.getErrno() == .SRCH) { + if (err.getErrno() != .SRCH) { @panic("This shouldn't happen"); } diff --git a/src/bun.js/base.zig b/src/bun.js/base.zig index dc0b98e61..87ace2c54 100644 --- a/src/bun.js/base.zig +++ b/src/bun.js/base.zig @@ -3656,7 +3656,9 @@ pub const FilePoll = struct { 1, // The same array may be used for the changelist and eventlist. &changelist, - 1, + // we set 0 here so that if we get an error on + // registration, it becomes errno + 0, KEVENT_FLAG_ERROR_EVENTS, &timeout, ); @@ -3679,10 +3681,9 @@ pub const FilePoll = struct { const errno = std.c.getErrno(rc); if (errno != .SUCCESS) { - switch (rc) { - std.math.minInt(@TypeOf(rc))...-1 => return JSC.Maybe(void).errnoSys(@enumToInt(errno), .kevent).?, - else => unreachable, - } + return JSC.Maybe(void){ + .err = JSC.Node.Syscall.Error.fromCode(errno, .kqueue), + }; } } else { @compileError("TODO: Pollable"); diff --git a/test/bun.js/spawn.test.ts b/test/bun.js/spawn.test.ts index 7c6c7e35d..fafabcd7b 100644 --- a/test/bun.js/spawn.test.ts +++ b/test/bun.js/spawn.test.ts @@ -130,38 +130,46 @@ for (let [gcTick, label] of [ gcTick(); }); - // it("check exit code from onExit", async () => { - // for (let i = 0; i < 1000; i++) { - // var exitCode1, exitCode2; - // await new Promise<void>((resolve) => { - // var counter = 0; - // spawn({ - // cmd: ["ls"], - // onExit(code) { - // exitCode1 = code; - // counter++; - // if (counter === 2) { - // resolve(); - // } - // }, - // }); - - // spawn({ - // cmd: ["false"], - // onExit(code) { - // exitCode2 = code; - // counter++; - // if (counter === 2) { - // resolve(); - // } - // }, - // }); - // }); - - // expect(exitCode1).toBe(0); - // expect(exitCode2).toBe(1); - // } - // }); + it("check exit code from onExit", async () => { + for (let i = 0; i < 1000; i++) { + var exitCode1, exitCode2; + await new Promise<void>((resolve) => { + var counter = 0; + spawn({ + cmd: ["ls"], + stdin: "ignore", + stdout: "ignore", + stderr: "ignore", + onExit(code) { + console.log("first"); + exitCode1 = code; + counter++; + if (counter === 2) { + resolve(); + } + }, + }); + + spawn({ + cmd: ["false"], + stdin: "ignore", + stdout: "ignore", + stderr: "ignore", + onExit(code) { + console.log("second"); + exitCode2 = code; + counter++; + if (counter === 2) { + resolve(); + } + }, + }); + }); + + expect(exitCode1).toBe(0); + expect(exitCode2).toBe(1); + } + }); it("Blob works as stdin", async () => { rmSync("/tmp/out.123.txt", { force: true }); |