about summary refs log tree commit diff
path: root/src/lib/run_program.rs
diff options
context:
space:
mode:
authorMarijn Haverbeke <marijnh@gmail.com>2011-07-29 13:31:44 +0200
committerMarijn Haverbeke <marijnh@gmail.com>2011-07-29 14:03:24 +0200
commit30d2e358be6104adeabba5a7acb6d93f39b30d4b (patch)
treeba54cc6506d9bf85e28c84922bbcc64af87eda34 /src/lib/run_program.rs
parentae46c154f09deb57018579bb00fa3fcac9a93770 (diff)
downloadrust-30d2e358be6104adeabba5a7acb6d93f39b30d4b.tar.gz
rust-30d2e358be6104adeabba5a7acb6d93f39b30d4b.zip
Replace obj dtors with resources in stdlib and rustc
Diffstat (limited to 'src/lib/run_program.rs')
-rw-r--r--src/lib/run_program.rs36
1 files changed, 20 insertions, 16 deletions
diff --git a/src/lib/run_program.rs b/src/lib/run_program.rs
index da5c1409e22..f2dd1280059 100644
--- a/src/lib/run_program.rs
+++ b/src/lib/run_program.rs
@@ -35,15 +35,20 @@ fn run_program(prog: str, args: vec[str]) -> int {
 
 type program =
     obj {
-        fn get_id() -> int ;
-        fn input() -> io::writer ;
-        fn output() -> io::reader ;
-        fn err() -> io::reader ;
-        fn close_input() ;
-        fn finish() -> int ;
+        fn get_id() -> int;
+        fn input() -> io::writer;
+        fn output() -> io::reader;
+        fn err() -> io::reader;
+        fn close_input();
+        fn finish() -> int;
+        fn destroy();
     };
 
-fn start_program(prog: str, args: vec[str]) -> @program {
+resource program_res(p: program) {
+    p.destroy();
+}
+
+fn start_program(prog: str, args: vec[str]) -> @program_res {
     let pipe_input = os::pipe();
     let pipe_output = os::pipe();
     let pipe_err = os::pipe();
@@ -61,7 +66,7 @@ fn start_program(prog: str, args: vec[str]) -> @program {
                     mutable finished: bool) {
         fn get_id() -> int { ret pid; }
         fn input() -> io::writer {
-            ret io::new_writer(io::fd_buf_writer(in_fd, false));
+            ret io::new_writer(io::fd_buf_writer(in_fd, option::none));
         }
         fn output() -> io::reader {
             ret io::new_reader(io::FILE_buf_reader(out_file, option::none));
@@ -82,18 +87,17 @@ fn start_program(prog: str, args: vec[str]) -> @program {
             self.close_input();
             ret os::waitpid(pid);
         }
-        drop {
-            self.close_input();
-            if !finished { os::waitpid(pid); }
+        fn destroy() {
+            self.finish();
             os::libc::fclose(out_file);
             os::libc::fclose(err_file);
         }
     }
-    ret @new_program(pid,
-                     pipe_input.out,
-                     os::fd_FILE(pipe_output.in),
-                     os::fd_FILE(pipe_err.in),
-                     false);
+    ret @program_res(new_program(pid,
+                                 pipe_input.out,
+                                 os::fd_FILE(pipe_output.in),
+                                 os::fd_FILE(pipe_err.in),
+                                 false));
 }
 
 fn read_all(rd: &io::reader) -> str {