From 5bde1d359f0a0ce1d5ed46c3a9bb0ba33882f7b6 Mon Sep 17 00:00:00 2001 From: Chris Emmons Date: Thu, 1 Dec 2011 00:15:25 -0800 Subject: Output: Add hierarchical output support and cleanup existing codebase. --HG-- extra : rebase_source : 3301137733cdf5fdb471d56ef7990e7a3a865442 --- src/base/output.hh | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 118 insertions(+), 3 deletions(-) (limited to 'src/base/output.hh') diff --git a/src/base/output.hh b/src/base/output.hh index 38c63714c..b86e68856 100644 --- a/src/base/output.hh +++ b/src/base/output.hh @@ -26,6 +26,7 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Authors: Nathan Binkert + * Chris Emmons */ #ifndef __BASE_OUTPUT_HH__ @@ -35,33 +36,147 @@ #include #include +/** Interface for creating files in a gem5 output directory. */ class OutputDirectory { private: + /** File names and associated stream handles */ typedef std::map map_t; + /** Open file streams within this directory */ map_t files; + + /** Name of this directory */ std::string dir; + /** System-specific path separator character */ + static const char PATH_SEPARATOR = '/'; + + /** + * Returns relative file names prepended with name of this directory. + * Returns absolute file names unaltered. + * + * @param name file name to prepend with directory name + * @return file name prepended with base directory name or unaltered + * absolute file name + */ std::string resolve(const std::string &name) const; protected: + /** + * Determines whether given file name corresponds to standard output + * streams. + * + * @param name name of file to check + * @return output stream for standard output or error stream if name + * corresponds to one or the other; NULL otherwise + */ std::ostream *checkForStdio(const std::string &name) const; + + /** Opens a file (optionally compressed). + * + * Will open a file as a compressed stream if filename ends in .gz. + * + * @param filename file to open + * @param mode attributes to open file with + * @return stream pointer to opened file; will cause sim fail on error + */ std::ostream *openFile(const std::string &filename, - std::ios_base::openmode mode = std::ios::trunc) const; + std::ios_base::openmode mode = std::ios::trunc); public: + /** Constructor. */ OutputDirectory(); + + /** Destructor. */ ~OutputDirectory(); + /** + * Sets name of this directory. + * @param dir name of this directory + */ void setDirectory(const std::string &dir); + + /** + * Gets name of this directory. + * @return name of this directory + */ const std::string &directory() const; + /** + * Creates a file in this directory (optionally compressed). + * + * Will open a file as a compressed stream if filename ends in .gz. + * + * @param name name of file to create (without this directory's name + * leading it) + * @param binary true to create a binary file; false otherwise + * @return stream to the opened file + */ std::ostream *create(const std::string &name, bool binary = false); - std::ostream *find(const std::string &name); + /** + * Closes a file stream. + * + * Stream must have been opened through this interface, or sim will fail. + * + * @param openStream open stream to close + */ + void close(std::ostream *openStream); + + /** + * Finds stream associated with a file. + * @param name of file + * @return stream to specified file or NULL if file does not exist + */ + std::ostream *find(const std::string &name) const; + + /** + * Returns true if stream is open and not standard output or error. + * @param os output stream to evaluate + * @return true if os is non-NULL and not cout or cerr + */ static bool isFile(const std::ostream *os); - static inline bool isFile(const std::ostream &os) { return isFile(&os); } + + /** + * Determines whether a file name corresponds to a file in this directory. + * @param name name of file to evaluate + * @return true iff file has been opened in this directory or exists on the + * file system within this directory + */ + bool isFile(const std::string &name) const; + + /** + * Returns true if stream is open and not standard output or error. + * @param os output stream to evaluate + * @return true if os is non-NULL and not cout or cerr + */ + static inline bool isFile(const std::ostream &os) { + return isFile(&os); + } + + /** + * Creates a subdirectory within this directory. + * @param name name of subdirectory + * @return the new subdirectory's name suffixed with a path separator + */ + std::string createSubdirectory(const std::string &name) const; + + /** + * Removes a specified file or subdirectory. + * + * Will cause sim to fail for most errors. However, it will only warn the + * user if a directory could not be removed. This is in place to + * accommodate slow file systems where file deletions within a subdirectory + * may not be recognized quickly enough thereby causing the subsequent call + * to remove the directory to fail (seemingly unempty directory). + * + * @param name name of file or subdirectory to remove; name should not + * be prepended with the name of this directory object + * @param recursive set to true to attempt to recursively delete a + * subdirectory and its contents + */ + void remove(const std::string &name, bool recursive=false); }; extern OutputDirectory simout; -- cgit v1.2.3