Avoid double-closing pipes in std::run::start_program

Linux and mac seem fine with it, Windows does not
This commit is contained in:
Brian Anderson 2011-07-19 14:00:15 -07:00
parent a33bc56e43
commit a14e5e7046

View file

@ -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);
} }
} }