kill process if there was an error during reading to not leave a zombie

This commit is contained in:
Laytan Laats
2024-10-04 10:38:47 +02:00
parent 5d556fe277
commit 77b033cf96
+41 -38
View File
@@ -395,54 +395,57 @@ process_exec :: proc(
process = process_start(desc) or_return process = process_start(desc) or_return
} }
stdout_builder := strings.builder_make(allocator) or_return {
stderr_builder := strings.builder_make(allocator) or_return defer if err != nil { _ = process_kill(process) }
has_stdout, has_stderr: bool stdout_builder := strings.builder_make(allocator) or_return
read_data: for !has_stdout || !has_stderr { stderr_builder := strings.builder_make(allocator) or_return
buf: [1024]u8 = ---
n: int
has_data: bool
if !has_stdout { has_stdout, has_stderr: bool
has_data, err = pipe_has_data(stdout_r) read_data: for !has_stdout || !has_stderr {
if has_data { buf: [1024]u8 = ---
n, err = read(stdout_r, buf[:]) n: int
if strings.write_bytes(&stdout_builder, buf[:n]) != n { has_data: bool
err = .Out_Of_Memory
if !has_stdout {
has_data, err = pipe_has_data(stdout_r)
if has_data {
n, err = read(stdout_r, buf[:])
if strings.write_bytes(&stdout_builder, buf[:n]) != n {
err = .Out_Of_Memory
}
}
switch err {
case nil: // nothing
case .EOF, .Broken_Pipe:
stdout = stdout_builder.buf[:]
has_stdout = true
case:
return
} }
} }
switch err {
case nil: // nothing
case .EOF, .Broken_Pipe:
stdout = stdout_builder.buf[:]
has_stdout = true
case:
return
}
}
if !has_stderr { if !has_stderr {
has_data, err = pipe_has_data(stderr_r) has_data, err = pipe_has_data(stderr_r)
if has_data { if has_data {
n, err = read(stderr_r, buf[:]) n, err = read(stderr_r, buf[:])
if strings.write_bytes(&stderr_builder, buf[:n]) != n { if strings.write_bytes(&stderr_builder, buf[:n]) != n {
err = .Out_Of_Memory err = .Out_Of_Memory
}
}
switch err {
case nil: // nothing
case .EOF, .Broken_Pipe:
stderr = stderr_builder.buf[:]
has_stderr = true
case:
return
} }
}
switch err {
case nil: // nothing
case .EOF, .Broken_Pipe:
stderr = stderr_builder.buf[:]
has_stderr = true
case:
return
} }
} }
} }
err = nil state, err = process_wait(process)
state = process_wait(process) or_return
return return
} }