From 99a3e7bcfb38fea95092dcfff99a6b84f42f456c Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Fri, 4 Jan 2019 17:46:35 +0200 Subject: libcamera: log: Add a LogFatal log level MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The LogFatal log level is similar to the LogError level, but additionally abort program execution. This is useful to implement assertion handlers. Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund Reviewed-by: Kieran Bingham --- src/libcamera/include/log.h | 2 ++ src/libcamera/log.cpp | 19 +++++++++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/libcamera/include/log.h b/src/libcamera/include/log.h index 74439848..03842be0 100644 --- a/src/libcamera/include/log.h +++ b/src/libcamera/include/log.h @@ -16,6 +16,7 @@ enum LogSeverity { LogInfo, LogWarning, LogError, + LogFatal, }; class LogMessage @@ -30,6 +31,7 @@ public: private: std::ostringstream msgStream; + LogSeverity severity_; }; #define LOG(severity) LogMessage(__FILE__, __LINE__, Log##severity).stream() diff --git a/src/libcamera/log.cpp b/src/libcamera/log.cpp index 44b3a5bb..a5823c64 100644 --- a/src/libcamera/log.cpp +++ b/src/libcamera/log.cpp @@ -6,6 +6,7 @@ */ #include +#include #include #include #include @@ -31,6 +32,8 @@ namespace libcamera { * Warning message, signals a potential issue * \var LogError * Error message, signals an unrecoverable issue + * \var LogFatal + * Fatal message, signals an unrecoverable issue and aborts execution */ /** @@ -40,15 +43,19 @@ namespace libcamera { * Return an std::ostream reference to which a message can be logged using the * iostream API. The \a severity controls whether the message is printed or * dropped, depending on the global log level. + * + * If the severity is set to Fatal, execution is aborted and the program + * terminates immediately after printing the message. */ static const char *log_severity_name(LogSeverity severity) { static const char * const names[] = { - " DBG", - "INFO", - "WARN", - " ERR", + " DBG", + " INFO", + " WARN", + " ERR", + "FATAL", }; if (static_cast(severity) < ARRAY_SIZE(names)) @@ -73,6 +80,7 @@ static const char *log_severity_name(LogSeverity severity) */ LogMessage::LogMessage(const char *fileName, unsigned int line, LogSeverity severity) + : severity_(severity) { /* Log the timestamp, severity and file information. */ struct timespec timestamp; @@ -93,6 +101,9 @@ LogMessage::~LogMessage() std::string msg(msgStream.str()); fwrite(msg.data(), msg.size(), 1, stderr); fflush(stderr); + + if (severity_ == LogSeverity::LogFatal) + std::abort(); } /** -- cgit v1.2.1