From patchwork Tue Nov 4 18:50:02 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kieran Bingham X-Patchwork-Id: 24977 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 32F1DC3241 for ; Tue, 4 Nov 2025 18:50:11 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 65A7F60A80; Tue, 4 Nov 2025 19:50:10 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="HzkybGYg"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 21A4E6069A for ; Tue, 4 Nov 2025 19:50:09 +0100 (CET) Received: from Monstersaurus.hippo-penny.ts.net (cpc89244-aztw30-2-0-cust6594.18-1.cable.virginm.net [86.31.185.195]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id DF4839FC; Tue, 4 Nov 2025 19:48:14 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1762282095; bh=/BmuBCsgZEBMBKWC0hFLy/04zKQKgjfXkWN3pFbWRm0=; h=From:To:Cc:Subject:Date:From; b=HzkybGYg5VgLO3OYyWgbHTEflfI+CcTUAe5Bn1Qs7//vsMI7JQIiR2c16l3wYceeI WwCGfTUnSjCv+1G6ROWxEQJw1Ntqy8qB/6RShOarB9Zc9Sy4X7CgoHRERTB1f5Prq/ lqoKHzY/9tNMumoP84Erqh/CrKY9CASY+hApK9GU= From: Kieran Bingham To: libcamera devel Cc: "Schulz, Andreas" , Kieran Bingham Subject: [PATCH v2] Thread: Add name parameter Date: Tue, 4 Nov 2025 18:50:02 +0000 Message-ID: <20251104185002.2337556-1-kieran.bingham@ideasonboard.com> X-Mailer: git-send-email 2.50.1 MIME-Version: 1.0 X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" From: "Schulz, Andreas" For debugging purposes, threads can be assigned a name, which eases distinguishing between them in e.g. htop or gdb. This uses a Linux-specific API for now which is limited to 15 characters (+ null terminator), so truncation is done and names for existing thread instantiations were chosen to be consise. [Kieran: Apply checkstyle suggestions, rebase on proxy rework] Signed-off-by: Schulz, Andreas Signed-off-by: Kieran Bingham --- v2: - Simplify default name initialiser - Wrap dmaHeap_ - Add in the VirtualCamera thread Testing on RKISP1: root@debix-som:~# cam -c1 -C^C root@debix-som:~# ps -T -p `pidof cam` PID SPID TTY TIME CMD 332 332 pts/0 00:00:00 cam 332 333 pts/0 00:00:00 CameraManager 332 334 pts/0 00:00:00 IPAProxyRkISP1 Signed-off-by: Kieran Bingham --- include/libcamera/base/thread.h | 4 +++- src/libcamera/base/thread.cpp | 11 +++++++++-- src/libcamera/camera_manager.cpp | 2 +- src/libcamera/pipeline/virtual/virtual.cpp | 2 +- src/libcamera/software_isp/software_isp.cpp | 3 ++- .../libcamera_templates/module_ipa_proxy.cpp.tmpl | 2 +- 6 files changed, 17 insertions(+), 7 deletions(-) diff --git a/include/libcamera/base/thread.h b/include/libcamera/base/thread.h index dc1aca275e23..6aa36fa1bfb0 100644 --- a/include/libcamera/base/thread.h +++ b/include/libcamera/base/thread.h @@ -8,6 +8,7 @@ #pragma once #include +#include #include #include @@ -30,7 +31,7 @@ class ThreadMain; class Thread { public: - Thread(); + Thread(std::string name = {}); virtual ~Thread(); void start(); @@ -74,6 +75,7 @@ private: void moveObject(Object *object, ThreadData *currentData, ThreadData *targetData); + std::string name_; std::thread thread_; std::unique_ptr data_; }; diff --git a/src/libcamera/base/thread.cpp b/src/libcamera/base/thread.cpp index 338cbcc260c8..39209ec8ad0d 100644 --- a/src/libcamera/base/thread.cpp +++ b/src/libcamera/base/thread.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -144,6 +145,7 @@ class ThreadMain : public Thread { public: ThreadMain() + : Thread("libcamera-main") { data_->running_ = true; } @@ -234,8 +236,9 @@ ThreadData *ThreadData::current() /** * \brief Create a thread */ -Thread::Thread() - : data_(std::make_unique(this)) +Thread::Thread(std::string name) + : name_(std::move(name)), + data_(std::make_unique(this)) { } @@ -288,6 +291,10 @@ void Thread::startThread() data_->tid_ = syscall(SYS_gettid); currentThreadData = data_.get(); + if (!name_.empty()) + pthread_setname_np(thread_.native_handle(), + name_.substr(0, 15).c_str()); + run(); } diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp index c203b08f7de3..83510e062fae 100644 --- a/src/libcamera/camera_manager.cpp +++ b/src/libcamera/camera_manager.cpp @@ -39,7 +39,7 @@ LOG_DEFINE_CATEGORY(Camera) #ifndef __DOXYGEN_PUBLIC__ CameraManager::Private::Private() - : initialized_(false) + : Thread("CameraManager"), initialized_(false) { ipaManager_ = std::make_unique(this->configuration()); } diff --git a/src/libcamera/pipeline/virtual/virtual.cpp b/src/libcamera/pipeline/virtual/virtual.cpp index 23eae852f79b..09e0afc956fd 100644 --- a/src/libcamera/pipeline/virtual/virtual.cpp +++ b/src/libcamera/pipeline/virtual/virtual.cpp @@ -115,7 +115,7 @@ private: VirtualCameraData::VirtualCameraData(PipelineHandler *pipe, const std::vector &supportedResolutions) - : Camera::Private(pipe) + : Camera::Private(pipe), Thread("VirtualCamera") { config_.resolutions = supportedResolutions; for (const auto &resolution : config_.resolutions) { diff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp index fdadf79e1966..341c0352cf0c 100644 --- a/src/libcamera/software_isp/software_isp.cpp +++ b/src/libcamera/software_isp/software_isp.cpp @@ -75,7 +75,8 @@ LOG_DEFINE_CATEGORY(SoftwareIsp) */ SoftwareIsp::SoftwareIsp(PipelineHandler *pipe, const CameraSensor *sensor, ControlInfoMap *ipaControls) - : dmaHeap_(DmaBufAllocator::DmaBufAllocatorFlag::CmaHeap | + : ispWorkerThread_("SWIspWorker"), + dmaHeap_(DmaBufAllocator::DmaBufAllocatorFlag::CmaHeap | DmaBufAllocator::DmaBufAllocatorFlag::SystemHeap | DmaBufAllocator::DmaBufAllocatorFlag::UDmaBuf) { diff --git a/utils/codegen/ipc/generators/libcamera_templates/module_ipa_proxy.cpp.tmpl b/utils/codegen/ipc/generators/libcamera_templates/module_ipa_proxy.cpp.tmpl index 0d03c1df0dd9..e6e19b3030b9 100644 --- a/utils/codegen/ipc/generators/libcamera_templates/module_ipa_proxy.cpp.tmpl +++ b/utils/codegen/ipc/generators/libcamera_templates/module_ipa_proxy.cpp.tmpl @@ -46,7 +46,7 @@ namespace {{ns}} { {%- endif %} {{proxy_name}}Threaded::{{proxy_name}}Threaded(IPAModule *ipam, const GlobalConfiguration &configuration) - : {{proxy_name}}(ipam, configuration) + : {{proxy_name}}(ipam, configuration), thread_("{{proxy_name}}") { LOG(IPAProxy, Debug) << "initializing {{module_name}} proxy in thread: loading IPA from "