diff options
author | David Shah <davey1576@gmail.com> | 2018-11-26 09:37:07 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-11-26 09:37:07 +0000 |
commit | 22ac41d6272e66cf68a7e282e7ffe065ab82c5b8 (patch) | |
tree | 576a835841aeb8e93639510248eccd9b472d88ef /common/log.cc | |
parent | 98858fe611a149e19e1d679db4a98fe88ff647bc (diff) | |
parent | b035cb9fcf3502c74c769560f02e29adcafe6fd8 (diff) | |
download | nextpnr-22ac41d6272e66cf68a7e282e7ffe065ab82c5b8.tar.gz nextpnr-22ac41d6272e66cf68a7e282e7ffe065ab82c5b8.tar.bz2 nextpnr-22ac41d6272e66cf68a7e282e7ffe065ab82c5b8.zip |
Merge pull request #138 from YosysHQ/refactor_log
Tidy up logging code, add log file support, make timing failures non-fatal errors
Diffstat (limited to 'common/log.cc')
-rw-r--r-- | common/log.cc | 123 |
1 files changed, 32 insertions, 91 deletions
diff --git a/common/log.cc b/common/log.cc index 6b2d6065..82e09fec 100644 --- a/common/log.cc +++ b/common/log.cc @@ -32,19 +32,14 @@ NEXTPNR_NAMESPACE_BEGIN NPNR_NORETURN void logv_error(const char *format, va_list ap) NPNR_ATTRIBUTE(noreturn); -std::vector<FILE *> log_files; -std::vector<std::ostream *> log_streams; -FILE *log_errfile = NULL; +std::vector<std::pair<std::ostream *, LogLevel>> log_streams; log_write_type log_write_function = nullptr; -bool log_error_stderr = false; -bool log_cmd_error_throw = false; -bool log_quiet_warnings = false; std::string log_last_error; void (*log_error_atexit)() = NULL; -// static bool next_print_log = false; static int log_newline_count = 0; +bool had_nonfatal_error = false; std::string stringf(const char *fmt, ...) { @@ -88,7 +83,7 @@ std::string vstringf(const char *fmt, va_list ap) return string; } -void logv(const char *format, va_list ap) +void logv(const char *format, va_list ap, LogLevel level = LogLevel::LOG) { // // Trim newlines from the beginning @@ -108,90 +103,50 @@ void logv(const char *format, va_list ap) else log_newline_count = str.size() - nnl_pos - 1; - for (auto f : log_files) - fputs(str.c_str(), f); - for (auto f : log_streams) - *f << str; + if (f.second <= level) + *f.first << str; if (log_write_function) log_write_function(str); } -void logv_info(const char *format, va_list ap) +void log_with_level(LogLevel level, const char *format, ...) { - std::string message = vstringf(format, ap); - - log_always("Info: %s", message.c_str()); - log_flush(); + va_list ap; + va_start(ap, format); + logv(format, ap, level); + va_end(ap); } -void logv_warning(const char *format, va_list ap) +void logv_prefixed(const char *prefix, const char *format, va_list ap, LogLevel level) { std::string message = vstringf(format, ap); - log_always("Warning: %s", message.c_str()); + log_with_level(level, "%s%s", prefix, message.c_str()); log_flush(); } -void logv_warning_noprefix(const char *format, va_list ap) -{ - std::string message = vstringf(format, ap); - - log_always("%s", message.c_str()); -} - -void logv_error(const char *format, va_list ap) -{ -#ifdef EMSCRIPTEN - auto backup_log_files = log_files; -#endif - - if (log_errfile != NULL) - log_files.push_back(log_errfile); - - if (log_error_stderr) - for (auto &f : log_files) - if (f == stdout) - f = stderr; - - log_last_error = vstringf(format, ap); - log_always("ERROR: %s", log_last_error.c_str()); - log_flush(); - - if (log_error_atexit) - log_error_atexit(); - -#ifdef EMSCRIPTEN - log_files = backup_log_files; -#endif - throw log_execution_error_exception(); -} - void log_always(const char *format, ...) { va_list ap; va_start(ap, format); - logv(format, ap); + logv(format, ap, LogLevel::ALWAYS); va_end(ap); } void log(const char *format, ...) { - if (log_quiet_warnings) - return; va_list ap; va_start(ap, format); - logv(format, ap); + logv(format, ap, LogLevel::LOG); va_end(ap); } void log_info(const char *format, ...) { - if (log_quiet_warnings) - return; va_list ap; va_start(ap, format); - logv_info(format, ap); + logv_prefixed("Info: ", format, ap, LogLevel::INFO); va_end(ap); } @@ -199,15 +154,7 @@ void log_warning(const char *format, ...) { va_list ap; va_start(ap, format); - logv_warning(format, ap); - va_end(ap); -} - -void log_warning_noprefix(const char *format, ...) -{ - va_list ap; - va_start(ap, format); - logv_warning_noprefix(format, ap); + logv_prefixed("Warning: ", format, ap, LogLevel::WARNING); va_end(ap); } @@ -215,41 +162,35 @@ void log_error(const char *format, ...) { va_list ap; va_start(ap, format); - logv_error(format, ap); -} - -void log_cmd_error(const char *format, ...) -{ - va_list ap; - va_start(ap, format); + logv_prefixed("ERROR: ", format, ap, LogLevel::ERROR); - if (log_cmd_error_throw) { - log_last_error = vstringf(format, ap); - log_always("ERROR: %s", log_last_error.c_str()); - log_flush(); - throw log_cmd_error_exception(); - } + if (log_error_atexit) + log_error_atexit(); - logv_error(format, ap); + throw log_execution_error_exception(); } void log_break() { - if (log_quiet_warnings) - return; if (log_newline_count < 2) - log_always("\n"); + log("\n"); if (log_newline_count < 2) - log_always("\n"); + log("\n"); } -void log_flush() +void log_nonfatal_error(const char *format, ...) { - for (auto f : log_files) - fflush(f); + va_list ap; + va_start(ap, format); + logv_prefixed("ERROR: ", format, ap, LogLevel::ERROR); + va_end(ap); + had_nonfatal_error = true; +} +void log_flush() +{ for (auto f : log_streams) - f->flush(); + f.first->flush(); } NEXTPNR_NAMESPACE_END |