aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-11-28 23:47:25 -0800
committerGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-11-28 23:48:04 -0800
commitd28247573cd8e019b835452bbec191dadc38d86d (patch)
treedcea9b322f510561becf5e480053d964abcc1a56
parent56884b5f1dd60a2673ef765a5556bd37d00c1292 (diff)
downloadbun-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.zig2
-rw-r--r--src/bun.js/base.zig11
-rw-r--r--test/bun.js/spawn.test.ts72
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 });