{"id":26676,"url":"https://patchwork.libcamera.org/api/patches/26676/?format=json","web_url":"https://patchwork.libcamera.org/patch/26676/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/projects/1/?format=json","name":"libcamera","link_name":"libcamera","list_id":"libcamera_core","list_email":"libcamera-devel@lists.libcamera.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20260507135019.231615-2-barnabas.pocze@ideasonboard.com>","date":"2026-05-07T13:50:19","name":"[v1,2/2] libcamera: base: log: Move abort logic into separate type","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"3c244c023e1f15bb8743342f2f5bc7277f0d28ed","submitter":{"id":216,"url":"https://patchwork.libcamera.org/api/people/216/?format=json","name":"Barnabás Pőcze","email":"barnabas.pocze@ideasonboard.com"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/26676/mbox/","series":[{"id":5918,"url":"https://patchwork.libcamera.org/api/series/5918/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=5918","date":"2026-05-07T13:50:18","name":"[v1,1/2] libcamera: base: log: Remove log level check for \"Fatal\" messages","version":1,"mbox":"https://patchwork.libcamera.org/series/5918/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/26676/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/26676/checks/","tags":{},"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 5A94DC32F6\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu,  7 May 2026 13:50:28 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id D6BFF63022;\n\tThu,  7 May 2026 15:50:25 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 48D0F62FE1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu,  7 May 2026 15:50:23 +0200 (CEST)","from pb-laptop.local (185.221.140.217.nat.pool.zt.hu\n\t[185.221.140.217])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 3381AB63\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu,  7 May 2026 15:50:19 +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=\"Rp++ssbl\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1778161819;\n\tbh=sGI/a0lFvnPtfKM87kQIP6yxhvAg5n9A8DchwYDg6GY=;\n\th=From:To:Subject:Date:In-Reply-To:References:From;\n\tb=Rp++ssblMngR/4Jnp+xIQT644CqlXVmTehvVuFwtlqWtAXQkaEyDjomt9sZlE7oHa\n\tTyLVKsXTyUVOmZHwS/HB3us5kUZhVxy42jLxhp8y9YXx0WyRqk+FfqoksTvX91NXOa\n\tkueA+E6KkODYHG7yZVzwIA+4BCDYB3po/SobpAig=","From":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","To":"libcamera-devel@lists.libcamera.org","Subject":"[PATCH v1 2/2] libcamera: base: log: Move abort logic into separate\n\ttype","Date":"Thu,  7 May 2026 15:50:19 +0200","Message-ID":"<20260507135019.231615-2-barnabas.pocze@ideasonboard.com>","X-Mailer":"git-send-email 2.54.0","In-Reply-To":"<20260507135019.231615-1-barnabas.pocze@ideasonboard.com>","References":"<20260507135019.231615-1-barnabas.pocze@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","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>"},"content":"Add a `LogMessageAbortGuard` type that is templated on the severity of\nthe log message. If it is not fatal, the type is empty and does nothing.\nHowever, if it is `LogFatal`, then its destructor will print the backtrace\nand abort. This type is instantiated for each log message and takes care\nof aborting the processing if necessary.\n\nThis allows the removal of the abort logic from `~LogMessage()` and also\nmakes it visible to static analysis tools that execution will not proceed\nbeyond a `Fatal` message.\n\nSigned-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n---\n include/libcamera/base/log.h | 16 +++++++++++++++-\n src/libcamera/base/log.cpp   | 16 +++++++++++-----\n 2 files changed, 26 insertions(+), 6 deletions(-)","diff":"diff --git a/include/libcamera/base/log.h b/include/libcamera/base/log.h\nindex 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)\ndiff --git a/src/libcamera/base/log.cpp b/src/libcamera/base/log.cpp\nindex 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\n","prefixes":["v1","2/2"]}