libcamera: log: Add a LogFatal log level

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 <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
Laurent Pinchart 2019-01-04 17:46:35 +02:00
parent e256a58bf0
commit 99a3e7bcfb
2 changed files with 17 additions and 4 deletions

View file

@ -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()

View file

@ -6,6 +6,7 @@
*/
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <iomanip>
#include <string.h>
@ -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",
" INFO",
" WARN",
" ERR",
"FATAL",
};
if (static_cast<unsigned int>(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();
}
/**