Avoid double-closing pipes in std::run::start_program
Linux and mac seem fine with it, Windows does not
This commit is contained in:
parent
a33bc56e43
commit
a14e5e7046
1 changed files with 13 additions and 4 deletions
|
@ -50,7 +50,7 @@ fn start_program(str prog, vec[str] args) -> @program {
|
||||||
os::libc::close(pipe_input._0);
|
os::libc::close(pipe_input._0);
|
||||||
os::libc::close(pipe_output._1);
|
os::libc::close(pipe_output._1);
|
||||||
obj new_program(int pid,
|
obj new_program(int pid,
|
||||||
int in_fd,
|
mutable int in_fd,
|
||||||
os::libc::FILE out_file,
|
os::libc::FILE out_file,
|
||||||
mutable bool finished) {
|
mutable bool finished) {
|
||||||
fn get_id() -> int { ret pid; }
|
fn get_id() -> int { ret pid; }
|
||||||
|
@ -60,14 +60,23 @@ fn start_program(str prog, vec[str] args) -> @program {
|
||||||
fn output() -> io::reader {
|
fn output() -> io::reader {
|
||||||
ret io::new_reader(io::FILE_buf_reader(out_file, false));
|
ret io::new_reader(io::FILE_buf_reader(out_file, false));
|
||||||
}
|
}
|
||||||
fn close_input() { os::libc::close(in_fd); }
|
fn close_input() {
|
||||||
|
auto invalid_fd = -1;
|
||||||
|
if (in_fd != invalid_fd) {
|
||||||
|
os::libc::close(in_fd);
|
||||||
|
in_fd = invalid_fd;
|
||||||
|
}
|
||||||
|
}
|
||||||
fn finish() -> int {
|
fn finish() -> int {
|
||||||
if (finished) { ret 0; }
|
if (finished) { ret 0; }
|
||||||
finished = true;
|
finished = true;
|
||||||
os::libc::close(in_fd);
|
self.close_input();
|
||||||
ret os::waitpid(pid);
|
ret os::waitpid(pid);
|
||||||
}drop {
|
}drop {
|
||||||
if (!finished) { os::libc::close(in_fd); os::waitpid(pid); }
|
self.close_input();
|
||||||
|
if (!finished) {
|
||||||
|
os::waitpid(pid);
|
||||||
|
}
|
||||||
os::libc::fclose(out_file);
|
os::libc::fclose(out_file);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue