diff options
Diffstat (limited to 'src/base/output.hh')
-rw-r--r-- | src/base/output.hh | 199 |
1 files changed, 159 insertions, 40 deletions
diff --git a/src/base/output.hh b/src/base/output.hh index 67e6ecb18..a0b1d0124 100644 --- a/src/base/output.hh +++ b/src/base/output.hh @@ -1,4 +1,17 @@ /* + * Copyright (c) 2015 ARM Limited + * All rights reserved + * + * The license below extends only to copyright in the software and shall + * not be construed as granting a license to any other intellectual + * property including but not limited to intellectual property relating + * to a hardware implementation of the functionality of the software + * licensed hereunder. You may use the software subject to the license + * terms below provided that you ensure that this notice is replicated + * unmodified and in its entirety in all distributions of the software, + * modified or unmodified, in source code or in binary form. + * + * Copyright (c) 2013 Andreas Sandberg * Copyright (c) 2005 The Regents of The University of Michigan * All rights reserved. * @@ -27,6 +40,8 @@ * * Authors: Nathan Binkert * Chris Emmons + * Andreas Sandberg + * Sascha Bischoff */ #ifndef __BASE_OUTPUT_HH__ @@ -36,15 +51,105 @@ #include <map> #include <string> +#include "base/compiler.hh" + +class OutputDirectory; + +class OutputStream +{ + public: + virtual ~OutputStream(); + + /** Get the output underlying output stream */ + std::ostream *stream() const { return _stream; }; + + /** + * Can the file be recreated if the output directory is moved? + * + * @return true if the file will be created in the new location, + * false otherwise. + */ + virtual bool recreateable() const { return false; } + + /** Get the file name in the output directory */ + const std::string &name() const { return _name; } + + protected: + friend class OutputDirectory; + + /** Wrap an existing stream */ + OutputStream(const std::string &name, + std::ostream *stream); + + /* Prevent copying */ + OutputStream(const OutputStream &f); + + /** Re-create the in a new location if recreateable. */ + virtual void relocate(const OutputDirectory &dir); + + /** Name in output directory */ + const std::string _name; + + /** Underlying output stream */ + std::ostream *const _stream; +}; + +template<class StreamType> +class OutputFile + : public OutputStream +{ + public: + typedef StreamType stream_type_t; + + virtual ~OutputFile(); + + /** + * Can the file be recreated if the output directory is moved? + * + * @return true if the file will be created in the new location, + * false otherwise. + */ + bool recreateable() const override { return _recreateable; } + + protected: + friend class OutputDirectory; + + OutputFile(const OutputDirectory &dir, + const std::string &name, + std::ios_base::openmode mode, + bool recreateable); + + /* Prevent copying */ + OutputFile(const OutputFile<StreamType> &f); + + /** Re-create the file in a new location if it is relocatable. */ + void relocate(const OutputDirectory &dir) override; + + /** File mode when opened */ + const std::ios_base::openmode _mode; + + /** Can the file be recreated in a new location? */ + const bool _recreateable; + + /** Pointer to the file stream */ + stream_type_t *const _fstream; +}; + /** Interface for creating files in a gem5 output directory. */ class OutputDirectory { private: /** File names and associated stream handles */ - typedef std::map<std::string, std::ostream *> map_t; + typedef std::map<std::string, OutputStream *> file_map_t; + + /** Output subdirectories */ + typedef std::map<std::string, OutputDirectory *> dir_map_t; /** Open file streams within this directory */ - map_t files; + file_map_t files; + + /** Output sub-directories */ + dir_map_t dirs; /** Name of this directory */ std::string dir; @@ -52,6 +157,9 @@ class OutputDirectory /** System-specific path separator character */ static const char PATH_SEPARATOR = '/'; + static OutputStream stdout; + static OutputStream stderr; + protected: /** * Determines whether given file name corresponds to standard output @@ -61,12 +169,15 @@ class OutputDirectory * @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; + static OutputStream *checkForStdio(const std::string &name); public: /** Constructor. */ OutputDirectory(); + /** Constructor. */ + OutputDirectory(const std::string &name); + /** Destructor. */ ~OutputDirectory(); @@ -80,20 +191,6 @@ class OutputDirectory */ std::string resolve(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 - * @param no_gz true to disable opening the file as a gzip compressed output - * stream; false otherwise - * @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, - bool no_gz = false); - /** * Sets name of this directory. * @param dir name of this directory @@ -109,40 +206,64 @@ class OutputDirectory /** * Creates a file in this directory (optionally compressed). * - * Will open a file as a compressed stream if filename ends in .gz. + * Will open a file as a compressed stream if filename ends in .gz, unless + * explicitly disabled. + * + * Relative output paths will result in the creation of a + * recreateable (see OutputFile) output file in the current output + * directory. Files created with an absolute path will not be + * recreateable. * * @param name name of file to create (without this directory's name * leading it) * @param binary true to create a binary file; false otherwise - * @param no_gz true to disable creating a gzip compressed output stream; - * false otherwise - * @return stream to the opened file + * @param no_gz true to disable opening the file as a gzip compressed output + * stream; false otherwise + * @return OutputStream instance representing the created file */ - std::ostream *create(const std::string &name, bool binary = false, + OutputStream *create(const std::string &name, + bool binary = false, bool no_gz = false); /** - * Closes a file stream. + * Open a file in this directory (optionally compressed). + * + * Will open a file as a compressed stream if filename ends in .gz, unless + * explicitly disabled. + * + * @param filename file to open + * @param mode attributes to open file with + * @param recreateable Set to true if the file can be recreated in a new + * location. + * @param no_gz true to disable opening the file as a gzip compressed output + * stream; false otherwise + * @return OutputStream instance representing the opened file + */ + OutputStream *open(const std::string &name, + std::ios_base::openmode mode, + bool recreateable = true, + bool no_gz = false); + + /** + * Closes an output file and free the corresponding OutputFile. * - * Stream must have been opened through this interface, or sim will fail. + * The output file must have been opened by the same + * OutputDirectory instance as the one closing it, or sim will + * fail. * - * @param openStream open stream to close + * @param file OutputStream instance in this OutputDirectory. */ - void close(std::ostream *openStream); + void close(OutputStream *file); /** - * Finds stream associated with a file. + * Finds stream associated with an open file or stdout/stderr. + * * @param name of file * @return stream to specified file or NULL if file does not exist */ - std::ostream *find(const std::string &name) const; + OutputStream *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); + OutputStream *findOrCreate(const std::string &name, bool binary = false); /** * Determines whether a file name corresponds to a file in this directory. @@ -153,12 +274,10 @@ class OutputDirectory 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 + * Test if a path is absolute. */ - static inline bool isFile(const std::ostream &os) { - return isFile(&os); + static inline bool isAbsolute(const std::string &name) { + return name[0] == PATH_SEPARATOR; } /** @@ -166,7 +285,7 @@ class OutputDirectory * @param name name of subdirectory * @return the new subdirectory's name suffixed with a path separator */ - std::string createSubdirectory(const std::string &name) const; + OutputDirectory *createSubdirectory(const std::string &name); /** * Removes a specified file or subdirectory. |