diff options
author | John Wiegley <johnw@newartisans.com> | 2009-02-01 01:47:06 -0400 |
---|---|---|
committer | John Wiegley <johnw@newartisans.com> | 2009-02-01 01:47:06 -0400 |
commit | 559a76ac2bb744fcef92fdc602bce7ba21cd52be (patch) | |
tree | 2298d9ae4a3e1b839f062c07dcd8e0ede2014652 | |
parent | 9d267fa1331a570e2b4c978f0b35a107a47b51c1 (diff) | |
download | fork-ledger-559a76ac2bb744fcef92fdc602bce7ba21cd52be.tar.gz fork-ledger-559a76ac2bb744fcef92fdc602bce7ba21cd52be.tar.bz2 fork-ledger-559a76ac2bb744fcef92fdc602bce7ba21cd52be.zip |
Fixed the way the pager process was being handled.
-rw-r--r-- | src/main.cc | 3 | ||||
-rw-r--r-- | src/stream.cc | 15 | ||||
-rw-r--r-- | src/stream.h | 12 |
3 files changed, 21 insertions, 9 deletions
diff --git a/src/main.cc b/src/main.cc index 7d43849b..b3dcd16f 100644 --- a/src/main.cc +++ b/src/main.cc @@ -139,6 +139,9 @@ int main(int argc, char * argv[], char * envp[]) status = _status; } + // Close the output stream, waiting on the pager process if need be + session->report->output_stream.close(); + // If memory verification is being performed (which can be very slow), clean // up everything by closing the session and deleting the session object, and // then shutting down the memory tracing subsystem. Otherwise, let it all diff --git a/src/stream.cc b/src/stream.cc index 3031f329..535a25a5 100644 --- a/src/stream.cc +++ b/src/stream.cc @@ -98,7 +98,7 @@ namespace { (char *)0); // We should never, ever reach here - perror("execl"); + perror((std::string("execl: ") + pager_path.string()).c_str()); exit(1); } else { // parent @@ -114,21 +114,22 @@ void output_stream_t::initialize(const optional<path>& output_file, { if (output_file) os = new ofstream(*output_file); - else if (pager_path && exists(*pager_path)) + else if (pager_path) pipe_to_pager_fd = do_fork(&os, *pager_path); else os = &std::cout; } -output_stream_t::~output_stream_t() +void output_stream_t::close() { - TRACE_DTOR(output_stream_t); - - if (os && os != &std::cout) + if (os != &std::cout) { checked_delete(os); + os = &std::cout; + } if (pipe_to_pager_fd != -1) { - close(pipe_to_pager_fd); + ::close(pipe_to_pager_fd); + pipe_to_pager_fd = -1; int status; wait(&status); diff --git a/src/stream.h b/src/stream.h index 4c4dd366..919c801d 100644 --- a/src/stream.h +++ b/src/stream.h @@ -76,7 +76,7 @@ public: /** * Construct a new output_stream_t. */ - output_stream_t() : pipe_to_pager_fd(-1), os(NULL) { + output_stream_t() : pipe_to_pager_fd(-1), os(&std::cout) { TRACE_CTOR(output_stream_t, ""); } @@ -85,7 +85,10 @@ public: * allocated ostream, if necessary. It also closes output file * descriptor, if necessary. */ - ~output_stream_t(); + ~output_stream_t() { + TRACE_DTOR(output_stream_t); + close(); + } /** * Initialize the output stream object. @@ -113,6 +116,11 @@ public: void flush() { os->flush(); } + + /** + * Close the output stream, waiting on the pager process if necessary. + */ + void close(); }; } // namespace ledger |