From patchwork Thu Aug 14 14:43:13 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= X-Patchwork-Id: 24104 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 4AB70BEFBE for ; Thu, 14 Aug 2025 14:43:18 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 71CD26925B; Thu, 14 Aug 2025 16:43:17 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="vPtxeQGz"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 36E9C69247 for ; Thu, 14 Aug 2025 16:43:16 +0200 (CEST) Received: from pb-laptop.local (185.221.141.188.nat.pool.zt.hu [185.221.141.188]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id CE9387E6 for ; Thu, 14 Aug 2025 16:42:21 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1755182541; bh=i4no8/O2H9EszLgC4xM/J0GGLGIQ4Rz0OPOmskJAu90=; h=From:To:Subject:Date:From; b=vPtxeQGzMIAlTbywdFJDbdZKS3nGIG7Z2oEGugoRSeqzBKDoZUuGpe+dWh/bvjUUn kXptHHNCqDu/6U0Xi1EHjFc9yiCoI0QdtEAngcTK7kMbcLvc6V2rc2l/QiTZT7EjwS fBgJa/OvxM5yxxTbrk2w0/VN6aT/NZkJCd17xKJQ= From: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= To: libcamera-devel@lists.libcamera.org Subject: [PATCH v1] libcamera: base: thread: Use `std::unique_ptr` instead of raw pointer Date: Thu, 14 Aug 2025 16:43:13 +0200 Message-ID: <20250814144313.2114628-1-barnabas.pocze@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" An `std::unique_ptr` is safer and expresses the intent better, so use that. Signed-off-by: Barnabás Pőcze Reviewed-by: Laurent Pinchart --- Or the same can be achieved by porting `Thread` to inherit `Extensible`. --- include/libcamera/base/thread.h | 2 +- src/libcamera/base/thread.cpp | 18 ++++++++---------- 2 files changed, 9 insertions(+), 11 deletions(-) -- 2.50.1 diff --git a/include/libcamera/base/thread.h b/include/libcamera/base/thread.h index b9284c2c0..719d7eedb 100644 --- a/include/libcamera/base/thread.h +++ b/include/libcamera/base/thread.h @@ -75,7 +75,7 @@ private: ThreadData *targetData); std::thread thread_; - ThreadData *data_; + std::unique_ptr data_; }; } /* namespace libcamera */ diff --git a/src/libcamera/base/thread.cpp b/src/libcamera/base/thread.cpp index d8fe0d697..92a7a8f7d 100644 --- a/src/libcamera/base/thread.cpp +++ b/src/libcamera/base/thread.cpp @@ -105,8 +105,8 @@ public: class ThreadData { public: - ThreadData() - : thread_(nullptr), running_(false), dispatcher_(nullptr) + ThreadData(Thread *thread) + : thread_(thread), running_(false), dispatcher_(nullptr) { } @@ -167,7 +167,7 @@ ThreadData *ThreadData::current() * The main thread doesn't receive thread-local data when it is * started, set it here. */ - ThreadData *data = mainThread.data_; + ThreadData *data = mainThread.data_.get(); data->tid_ = syscall(SYS_gettid); currentThreadData = data; return data; @@ -231,15 +231,13 @@ ThreadData *ThreadData::current() * \brief Create a thread */ Thread::Thread() + : data_(std::make_unique(this)) { - data_ = new ThreadData; - data_->thread_ = this; } Thread::~Thread() { delete data_->dispatcher_.load(std::memory_order_relaxed); - delete data_; } /** @@ -284,7 +282,7 @@ void Thread::startThread() thread_local ThreadCleaner cleaner(this, &Thread::finishThread); data_->tid_ = syscall(SYS_gettid); - currentThreadData = data_; + currentThreadData = data_.get(); run(); } @@ -621,7 +619,7 @@ void Thread::removeMessages(Object *receiver) */ void Thread::dispatchMessages(Message::Type type, Object *receiver) { - ASSERT(data_ == ThreadData::current()); + ASSERT(data_.get() == ThreadData::current()); ++data_->messages_.recursion_; @@ -677,8 +675,8 @@ void Thread::dispatchMessages(Message::Type type, Object *receiver) */ void Thread::moveObject(Object *object) { - ThreadData *currentData = object->thread_->data_; - ThreadData *targetData = data_; + ThreadData *currentData = object->thread_->data_.get(); + ThreadData *targetData = data_.get(); MutexLocker lockerFrom(currentData->messages_.mutex_, std::defer_lock); MutexLocker lockerTo(targetData->messages_.mutex_, std::defer_lock);