[{"id":38777,"web_url":"https://patchwork.libcamera.org/comment/38777/","msgid":"<20260507140514.GI1938994@killaraus.ideasonboard.com>","date":"2026-05-07T14:05:14","subject":"Re: [PATCH v1 2/2] libcamera: base: log: Move abort logic into\n\tseparate type","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"On Thu, May 07, 2026 at 03:50:19PM +0200, Barnabás Pőcze wrote:\n> Add a `LogMessageAbortGuard` type that is templated on the severity of\n> the log message. If it is not fatal, the type is empty and does nothing.\n> However, if it is `LogFatal`, then its destructor will print the backtrace\n> and abort. This type is instantiated for each log message and takes care\n> of aborting the processing if necessary.\n> \n> This allows the removal of the abort logic from `~LogMessage()` and also\n> makes it visible to static analysis tools that execution will not proceed\n> beyond a `Fatal` message.\n> \n> Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n> ---\n>  include/libcamera/base/log.h | 16 +++++++++++++++-\n>  src/libcamera/base/log.cpp   | 16 +++++++++++-----\n>  2 files changed, 26 insertions(+), 6 deletions(-)\n> \n> diff --git a/include/libcamera/base/log.h b/include/libcamera/base/log.h\n> index 5cb14311e..7bd43a423 100644\n> --- a/include/libcamera/base/log.h\n> +++ b/include/libcamera/base/log.h\n> @@ -88,6 +88,19 @@ private:\n>  \tstd::string prefix_;\n>  };\n>  \n> +#ifndef __DOXYGEN__\n> +template<LogSeverity>\n> +struct LogMessageAbortGuard {\n> +};\n> +\n> +template<>\n> +struct LogMessageAbortGuard<LogFatal> {\n> +\tLogMessageAbortGuard() = default;\n> +\tLIBCAMERA_DISABLE_COPY_AND_MOVE(LogMessageAbortGuard)\n> +\t[[noreturn]] ~LogMessageAbortGuard();\n> +};\n> +#endif\n> +\n>  class Loggable\n>  {\n>  public:\n> @@ -124,7 +137,8 @@ constexpr int isLogSeverityEnabled(const LogCategory &category)\n>  \tswitch (const auto &_logCategory = (cat);             \\\n>  \t\tisLogSeverityEnabled<Log##sev>(_logCategory)) \\\n>  \tcase 1:                                               \\\n> -\t\t_log(_logCategory, Log##sev).stream()\n> +\t\t(LogMessageAbortGuard<Log##sev>(),            \\\n> +\t\t _log(_logCategory, Log##sev).stream())\n>  \n>  #define _LOG1(severity) \\\n>  \t_LOG(LogCategory::defaultCategory(), severity)\n> diff --git a/src/libcamera/base/log.cpp b/src/libcamera/base/log.cpp\n> index 0921e5485..3404471fc 100644\n> --- a/src/libcamera/base/log.cpp\n> +++ b/src/libcamera/base/log.cpp\n> @@ -869,11 +869,6 @@ LogMessage::~LogMessage()\n>  \tmsgStream_ << std::endl;\n>  \n>  \tlogger->write(*this);\n> -\n> -\tif (severity_ == LogSeverity::LogFatal) {\n> -\t\tlogger->backtrace();\n> -\t\tstd::abort();\n> -\t}\n>  }\n>  \n>  /**\n> @@ -922,6 +917,17 @@ LogMessage::~LogMessage()\n>   * \\return The message text of the message, as a string\n>   */\n>  \n> +#ifndef __DOXYGEN__\n> +LogMessageAbortGuard<LogFatal>::~LogMessageAbortGuard()\n> +{\n> +\tLogger *logger = Logger::instance();\n> +\tif (logger)\n> +\t\tlogger->backtrace();\n> +\n> +\tstd::abort();\n> +}\n> +#endif\n> +\n>  /**\n>   * \\class Loggable\n>   * \\brief Base class to support log message extensions","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 0BBE1BE173\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu,  7 May 2026 14:05:19 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id C873463020;\n\tThu,  7 May 2026 16:05:17 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 6882562010\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu,  7 May 2026 16:05:16 +0200 (CEST)","from killaraus.ideasonboard.com\n\t(2001-14ba-70f3-e800--a06.rev.dnainternet.fi\n\t[IPv6:2001:14ba:70f3:e800::a06])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 2898B664;\n\tThu,  7 May 2026 16:05:12 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"BDRj9pMg\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1778162712;\n\tbh=bOrudfetofM0YA8xsffmg8yMzTS/KgHwcWa00rObrko=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=BDRj9pMgfo9i9QGt/oudhgPrtA52YvBsCsBJ4g0hi5zGaiJ/xUWcpqOVzCy3PggX3\n\tG+FT0SxuOrFufclSscRKwmqX9JDUevRm8ySGl4C8Xhz2tKq/3N/glGisRJD8qyJSYe\n\tDzmq8rXdD4yvxPO4Z3QRPoXW2lStPK83yWUKlksg=","Date":"Thu, 7 May 2026 17:05:14 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH v1 2/2] libcamera: base: log: Move abort logic into\n\tseparate type","Message-ID":"<20260507140514.GI1938994@killaraus.ideasonboard.com>","References":"<20260507135019.231615-1-barnabas.pocze@ideasonboard.com>\n\t<20260507135019.231615-2-barnabas.pocze@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20260507135019.231615-2-barnabas.pocze@ideasonboard.com>","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":39026,"web_url":"https://patchwork.libcamera.org/comment/39026/","msgid":"<178112648664.2116781.17214707102423315657@ping.linuxembedded.co.uk>","date":"2026-06-10T21:21:26","subject":"Re: [PATCH v1 2/2] libcamera: base: log: Move abort logic into\n\tseparate type","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Quoting Laurent Pinchart (2026-05-07 15:05:14)\n> On Thu, May 07, 2026 at 03:50:19PM +0200, Barnabás Pőcze wrote:\n> > Add a `LogMessageAbortGuard` type that is templated on the severity of\n> > the log message. If it is not fatal, the type is empty and does nothing.\n> > However, if it is `LogFatal`, then its destructor will print the backtrace\n> > and abort. This type is instantiated for each log message and takes care\n> > of aborting the processing if necessary.\n> > \n> > This allows the removal of the abort logic from `~LogMessage()` and also\n> > makes it visible to static analysis tools that execution will not proceed\n> > beyond a `Fatal` message.\n> > \n> > Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n> \n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> \n\nCool, magic but cool.\n\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n> > ---\n> >  include/libcamera/base/log.h | 16 +++++++++++++++-\n> >  src/libcamera/base/log.cpp   | 16 +++++++++++-----\n> >  2 files changed, 26 insertions(+), 6 deletions(-)\n> > \n> > diff --git a/include/libcamera/base/log.h b/include/libcamera/base/log.h\n> > index 5cb14311e..7bd43a423 100644\n> > --- a/include/libcamera/base/log.h\n> > +++ b/include/libcamera/base/log.h\n> > @@ -88,6 +88,19 @@ private:\n> >       std::string prefix_;\n> >  };\n> >  \n> > +#ifndef __DOXYGEN__\n> > +template<LogSeverity>\n> > +struct LogMessageAbortGuard {\n> > +};\n> > +\n> > +template<>\n> > +struct LogMessageAbortGuard<LogFatal> {\n> > +     LogMessageAbortGuard() = default;\n> > +     LIBCAMERA_DISABLE_COPY_AND_MOVE(LogMessageAbortGuard)\n> > +     [[noreturn]] ~LogMessageAbortGuard();\n> > +};\n> > +#endif\n> > +\n> >  class Loggable\n> >  {\n> >  public:\n> > @@ -124,7 +137,8 @@ constexpr int isLogSeverityEnabled(const LogCategory &category)\n> >       switch (const auto &_logCategory = (cat);             \\\n> >               isLogSeverityEnabled<Log##sev>(_logCategory)) \\\n> >       case 1:                                               \\\n> > -             _log(_logCategory, Log##sev).stream()\n> > +             (LogMessageAbortGuard<Log##sev>(),            \\\n> > +              _log(_logCategory, Log##sev).stream())\n> >  \n> >  #define _LOG1(severity) \\\n> >       _LOG(LogCategory::defaultCategory(), severity)\n> > diff --git a/src/libcamera/base/log.cpp b/src/libcamera/base/log.cpp\n> > index 0921e5485..3404471fc 100644\n> > --- a/src/libcamera/base/log.cpp\n> > +++ b/src/libcamera/base/log.cpp\n> > @@ -869,11 +869,6 @@ LogMessage::~LogMessage()\n> >       msgStream_ << std::endl;\n> >  \n> >       logger->write(*this);\n> > -\n> > -     if (severity_ == LogSeverity::LogFatal) {\n> > -             logger->backtrace();\n> > -             std::abort();\n> > -     }\n> >  }\n> >  \n> >  /**\n> > @@ -922,6 +917,17 @@ LogMessage::~LogMessage()\n> >   * \\return The message text of the message, as a string\n> >   */\n> >  \n> > +#ifndef __DOXYGEN__\n> > +LogMessageAbortGuard<LogFatal>::~LogMessageAbortGuard()\n> > +{\n> > +     Logger *logger = Logger::instance();\n> > +     if (logger)\n> > +             logger->backtrace();\n> > +\n> > +     std::abort();\n> > +}\n> > +#endif\n> > +\n> >  /**\n> >   * \\class Loggable\n> >   * \\brief Base class to support log message extensions\n> \n> -- \n> Regards,\n> \n> Laurent Pinchart","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 3FC21C324C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 10 Jun 2026 21:21:32 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 4AA9D61F01;\n\tWed, 10 Jun 2026 23:21:31 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 1514861754\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 10 Jun 2026 23:21:30 +0200 (CEST)","from monstersaurus.ideasonboard.com\n\t(cpc89244-aztw30-2-0-cust6594.18-1.cable.virginm.net [86.31.185.195])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 8AEAB6DF;\n\tWed, 10 Jun 2026 23:21:00 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"rWF/2mn8\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1781126460;\n\tbh=Yq/xUuu3xJ+u4m+tpmO7Tn3SZZeNp1XRHbeLMkTfNTA=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=rWF/2mn8cUkU1BziBUcaRkHF5YP9WUDJbw4gA6kHc+wK9ogfkCiWmN5LpcoUoaF7v\n\tbYfNASp0PVVVLi+pTX00Gh1YQ8bB42X9BusLxTvKE1AMMHHicJls+0DG/Y9WE5OS+t\n\t0/XfwuHCHRq1oZ8ErUFTDBu6dpR4jYCVnW5lQVNI=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20260507140514.GI1938994@killaraus.ideasonboard.com>","References":"<20260507135019.231615-1-barnabas.pocze@ideasonboard.com>\n\t<20260507135019.231615-2-barnabas.pocze@ideasonboard.com>\n\t<20260507140514.GI1938994@killaraus.ideasonboard.com>","Subject":"Re: [PATCH v1 2/2] libcamera: base: log: Move abort logic into\n\tseparate type","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>,\n\tLaurent Pinchart <laurent.pinchart@ideasonboard.com>","Date":"Wed, 10 Jun 2026 22:21:26 +0100","Message-ID":"<178112648664.2116781.17214707102423315657@ping.linuxembedded.co.uk>","User-Agent":"alot/0.9.1","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]