From patchwork Tue Feb 20 16:43:12 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dan Scally X-Patchwork-Id: 19513 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 CBA05C3261 for ; Tue, 20 Feb 2024 16:43:29 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 0F84962820; Tue, 20 Feb 2024 17:43:27 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="YpeuKOCF"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 6425A61CAA for ; Tue, 20 Feb 2024 17:43:24 +0100 (CET) Received: from mail.ideasonboard.com (cpc141996-chfd3-2-0-cust928.12-3.cable.virginm.net [86.13.91.161]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 01EA913AC; Tue, 20 Feb 2024 17:43:16 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1708447397; bh=R4kXQda0HMfbVXX1PAGOXI0OdPf6pPixlt799u6rYJM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=YpeuKOCFXnr7EI81DYYV0TKc6ICSRGYfB1mzZvAgSGUlp6C09yZEMn/AS0LNt6mLx NWIB4kLVnW10JeDmU+/PI5J1AgbXWyZfyS4/neDrW0rF1VCKAqnyhwqxzD+5aVaHxu IogUxpoSfsmjm83dTOvbc9NOvHHEGYdnbXHB8zy0= From: Daniel Scally To: libcamera-devel@lists.libcamera.org Subject: [PATCH v2 2/7] libcamera: camera: Turn queuedRequests_ to a map Date: Tue, 20 Feb 2024 16:43:12 +0000 Message-Id: <20240220164317.998477-3-dan.scally@ideasonboard.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240220164317.998477-1-dan.scally@ideasonboard.com> References: <20240220164317.998477-1-dan.scally@ideasonboard.com> 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" To facilitate fetching Requests queued to a camera using their sequence number, transform the queuedRequests_ list to a map with the sequence as the key. Signed-off-by: Daniel Scally --- Changes in v2: - New patch include/libcamera/internal/camera.h | 4 ++-- src/libcamera/camera.cpp | 4 ++-- src/libcamera/pipeline_handler.cpp | 12 ++++++++---- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/include/libcamera/internal/camera.h b/include/libcamera/internal/camera.h index 38dd94ff..fff70ff6 100644 --- a/include/libcamera/internal/camera.h +++ b/include/libcamera/internal/camera.h @@ -8,7 +8,7 @@ #pragma once #include -#include +#include #include #include #include @@ -33,7 +33,7 @@ public: PipelineHandler *pipe() { return pipe_.get(); } - std::list queuedRequests_; + std::map queuedRequests_; ControlInfoMap controlInfo_; ControlList properties_; diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp index a71dc933..3aa051f9 100644 --- a/src/libcamera/camera.cpp +++ b/src/libcamera/camera.cpp @@ -601,9 +601,9 @@ Camera::Private::~Private() /** * \var Camera::Private::queuedRequests_ - * \brief The list of queued and not yet completed requests + * \brief The map of queued and not yet completed requests * - * This list tracks requests queued in order to ensure completion of all + * This map tracks requests queued in order to ensure completion of all * requests when the pipeline handler is stopped. * * \sa PipelineHandler::queueRequest(), PipelineHandler::stop(), diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp index 343804e9..a8a67a7d 100644 --- a/src/libcamera/pipeline_handler.cpp +++ b/src/libcamera/pipeline_handler.cpp @@ -428,9 +428,9 @@ void PipelineHandler::doQueueRequest(Request *request) Camera *camera = request->_d()->camera(); Camera::Private *data = camera->_d(); - data->queuedRequests_.push_back(request); request->_d()->sequence_ = data->requestSequence_++; + data->queuedRequests_[request->sequence()] = request; if (request->_d()->cancelled_) { completeRequest(request); @@ -532,13 +532,17 @@ void PipelineHandler::completeRequest(Request *request) Camera::Private *data = camera->_d(); - while (!data->queuedRequests_.empty()) { - Request *req = data->queuedRequests_.front(); + for (auto it = data->queuedRequests_.begin(), it_next = it; + it != data->queuedRequests_.end(); it = it_next) { + uint32_t seq = it->first; + Request *req = it->second; + ++it_next; + if (req->status() == Request::RequestPending) break; ASSERT(!req->hasPendingBuffers()); - data->queuedRequests_.pop_front(); + data->queuedRequests_.erase(seq); camera->requestComplete(req); } }