about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2011-07-19 14:00:15 -0700
committerBrian Anderson <banderson@mozilla.com>2011-07-19 14:01:21 -0700
commita14e5e70462fed497ce8e12e52c1ef099678a8de (patch)
tree82aa6b0e51c649b7ae7b5b97265d807aca7f0165 /src
parenta33bc56e43adbdfce78c63337c175053038f3362 (diff)
downloadrust-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.rs17
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);
          }
     }