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:
parent
e256a58bf0
commit
99a3e7bcfb
2 changed files with 17 additions and 4 deletions
|
@ -16,6 +16,7 @@ enum LogSeverity {
|
||||||
LogInfo,
|
LogInfo,
|
||||||
LogWarning,
|
LogWarning,
|
||||||
LogError,
|
LogError,
|
||||||
|
LogFatal,
|
||||||
};
|
};
|
||||||
|
|
||||||
class LogMessage
|
class LogMessage
|
||||||
|
@ -30,6 +31,7 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::ostringstream msgStream;
|
std::ostringstream msgStream;
|
||||||
|
LogSeverity severity_;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define LOG(severity) LogMessage(__FILE__, __LINE__, Log##severity).stream()
|
#define LOG(severity) LogMessage(__FILE__, __LINE__, Log##severity).stream()
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
|
#include <cstdlib>
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
@ -31,6 +32,8 @@ namespace libcamera {
|
||||||
* Warning message, signals a potential issue
|
* Warning message, signals a potential issue
|
||||||
* \var LogError
|
* \var LogError
|
||||||
* Error message, signals an unrecoverable issue
|
* 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
|
* 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
|
* iostream API. The \a severity controls whether the message is printed or
|
||||||
* dropped, depending on the global log level.
|
* 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 *log_severity_name(LogSeverity severity)
|
||||||
{
|
{
|
||||||
static const char * const names[] = {
|
static const char * const names[] = {
|
||||||
" DBG",
|
" DBG",
|
||||||
"INFO",
|
" INFO",
|
||||||
"WARN",
|
" WARN",
|
||||||
" ERR",
|
" ERR",
|
||||||
|
"FATAL",
|
||||||
};
|
};
|
||||||
|
|
||||||
if (static_cast<unsigned int>(severity) < ARRAY_SIZE(names))
|
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,
|
LogMessage::LogMessage(const char *fileName, unsigned int line,
|
||||||
LogSeverity severity)
|
LogSeverity severity)
|
||||||
|
: severity_(severity)
|
||||||
{
|
{
|
||||||
/* Log the timestamp, severity and file information. */
|
/* Log the timestamp, severity and file information. */
|
||||||
struct timespec timestamp;
|
struct timespec timestamp;
|
||||||
|
@ -93,6 +101,9 @@ LogMessage::~LogMessage()
|
||||||
std::string msg(msgStream.str());
|
std::string msg(msgStream.str());
|
||||||
fwrite(msg.data(), msg.size(), 1, stderr);
|
fwrite(msg.data(), msg.size(), 1, stderr);
|
||||||
fflush(stderr);
|
fflush(stderr);
|
||||||
|
|
||||||
|
if (severity_ == LogSeverity::LogFatal)
|
||||||
|
std::abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue