diff options
| author | Marijn Haverbeke <marijnh@gmail.com> | 2011-07-29 13:31:44 +0200 |
|---|---|---|
| committer | Marijn Haverbeke <marijnh@gmail.com> | 2011-07-29 14:03:24 +0200 |
| commit | 30d2e358be6104adeabba5a7acb6d93f39b30d4b (patch) | |
| tree | ba54cc6506d9bf85e28c84922bbcc64af87eda34 /src/lib/run_program.rs | |
| parent | ae46c154f09deb57018579bb00fa3fcac9a93770 (diff) | |
| download | rust-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.rs | 36 |
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 { |
