diff options
| author | Brian Anderson <banderson@mozilla.com> | 2011-07-19 14:00:15 -0700 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2011-07-19 14:01:21 -0700 |
| commit | a14e5e70462fed497ce8e12e52c1ef099678a8de (patch) | |
| tree | 82aa6b0e51c649b7ae7b5b97265d807aca7f0165 /src | |
| parent | a33bc56e43adbdfce78c63337c175053038f3362 (diff) | |
| download | rust-a14e5e70462fed497ce8e12e52c1ef099678a8de.tar.gz rust-a14e5e70462fed497ce8e12e52c1ef099678a8de.zip | |
Avoid double-closing pipes in std::run::start_program
Linux and mac seem fine with it, Windows does not
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/run_program.rs | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/src/lib/run_program.rs b/src/lib/run_program.rs index 39d72eb8d29..20da4289b22 100644 --- a/src/lib/run_program.rs +++ b/src/lib/run_program.rs @@ -50,7 +50,7 @@ fn start_program(str prog, vec[str] args) -> @program { os::libc::close(pipe_input._0); os::libc::close(pipe_output._1); obj new_program(int pid, - int in_fd, + mutable int in_fd, os::libc::FILE out_file, mutable bool finished) { fn get_id() -> int { ret pid; } @@ -60,14 +60,23 @@ fn start_program(str prog, vec[str] args) -> @program { fn output() -> io::reader { 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 { if (finished) { ret 0; } finished = true; - os::libc::close(in_fd); + self.close_input(); ret os::waitpid(pid); }drop { - if (!finished) { os::libc::close(in_fd); os::waitpid(pid); } + self.close_input(); + if (!finished) { + os::waitpid(pid); + } os::libc::fclose(out_file); } } |
