Patch Detail
Show a patch.
GET /api/patches/16354/?format=api
{ "id": 16354, "url": "https://patchwork.libcamera.org/api/patches/16354/?format=api", "web_url": "https://patchwork.libcamera.org/patch/16354/", "project": { "id": 1, "url": "https://patchwork.libcamera.org/api/projects/1/?format=api", "name": "libcamera", "link_name": "libcamera", "list_id": "libcamera_core", "list_email": "libcamera-devel@lists.libcamera.org", "web_url": "", "scm_url": "", "webscm_url": "" }, "msgid": "<20220623232210.18742-10-laurent.pinchart@ideasonboard.com>", "date": "2022-06-23T23:22:06", "name": "[libcamera-devel,09/13] gstreamer: Use dedicated lock for request queues", "commit_ref": null, "pull_url": null, "state": "accepted", "archived": false, "hash": "bfe6f6070601b507a373c640d1610a8c6c56fdde", "submitter": { "id": 2, "url": "https://patchwork.libcamera.org/api/people/2/?format=api", "name": "Laurent Pinchart", "email": "laurent.pinchart@ideasonboard.com" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/16354/mbox/", "series": [ { "id": 3214, "url": "https://patchwork.libcamera.org/api/series/3214/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=3214", "date": "2022-06-23T23:21:57", "name": "gstreamer: Queue multiple requests", "version": 1, "mbox": "https://patchwork.libcamera.org/series/3214/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/16354/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/16354/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 4D6AFBD808\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 23 Jun 2022 23:22:43 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id C3D8265640;\n\tFri, 24 Jun 2022 01:22:42 +0200 (CEST)", "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 16DFD65636\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 24 Jun 2022 01:22:33 +0200 (CEST)", "from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 8D6F76BB;\n\tFri, 24 Jun 2022 01:22:32 +0200 (CEST)" ], "DKIM-Signature": [ "v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1656026562;\n\tbh=uQlVlGNXE+ZZ97peDXLIfggYGTn6X4KrYw0QTQHCbA8=;\n\th=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=LrXeexDuhs7LX0b8+4fyTJqVoAfP4lbfUB6fzh1h+pv3QvhLIf8LArTy69AuUO6+W\n\tJ96g4CXO610d1VcOlzJX93GvKkILle3V3bYn1vPmQADGyQuWgoRhLD6feV8ouycUVP\n\tVvNPeJv/aJtWOvI0d/ptVvPjmThUGa078n8kzVqyKumfkCLbQx6okiEbwLU0zS6W1K\n\tdKZVWQLaOU97CuO09n2o0mzExyEGBvOO8PjFa/67THKTF9mcvScUHEZXX+pBzsFS6L\n\tk/G/04ua63sGlMu8L42KHRmnYCzZBV0BK5Yi3Lqyo5rJ5xU4QexHZp2J1aGm0JyUbz\n\tC2l1HmyliyOCQ==", "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1656026552;\n\tbh=uQlVlGNXE+ZZ97peDXLIfggYGTn6X4KrYw0QTQHCbA8=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=iU3Jo7xnPqHRXK+uZCBGH+Ikdn5LB3zHiPxFK0UVvL0YxpuYjjxj3FWD0TrV0+lnL\n\tC47OYGo0VvecvHLrCtw1j+6mKtv+mE99VqwRA8vGNX3019Xb3BLd0rNuJ0rSuLkPXP\n\t3vG6O4XcjswZ7xfLt2KtD2dJHI8TnaAmLg+VjaUk=" ], "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"iU3Jo7xn\"; dkim-atps=neutral", "To": "libcamera-devel@lists.libcamera.org", "Date": "Fri, 24 Jun 2022 02:22:06 +0300", "Message-Id": "<20220623232210.18742-10-laurent.pinchart@ideasonboard.com>", "X-Mailer": "git-send-email 2.35.1", "In-Reply-To": "<20220623232210.18742-1-laurent.pinchart@ideasonboard.com>", "References": "<20220623232210.18742-1-laurent.pinchart@ideasonboard.com>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "Subject": "[libcamera-devel] [PATCH 09/13] gstreamer: Use dedicated lock for\n\trequest queues", "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>", "From": "Laurent Pinchart via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>", "Reply-To": "Laurent Pinchart <laurent.pinchart@ideasonboard.com>", "Cc": "Nicolas Dufresne <nicolas.dufresne@collabora.com>,\n\tVedant Paranjape <vedantparanjape160201@gmail.com>", "Errors-To": "libcamera-devel-bounces@lists.libcamera.org", "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>" }, "content": "Add a new lock to the GstLibcameraSrcState class to protect the queued\nand completed requests queues. This replaces the GstObject lock, and\nminimizes the lock contention between the request completion handler and\nthe task run handler as the former must run as fast as possible.\n\nSigned-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n---\n src/gstreamer/gstlibcamerasrc.cpp | 39 ++++++++++++++++++++++---------\n 1 file changed, 28 insertions(+), 11 deletions(-)", "diff": "diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp\nindex e30d45fa2223..b85ba39fb808 100644\n--- a/src/gstreamer/gstlibcamerasrc.cpp\n+++ b/src/gstreamer/gstlibcamerasrc.cpp\n@@ -32,6 +32,8 @@\n #include <queue>\n #include <vector>\n \n+#include <libcamera/base/mutex.h>\n+\n #include <libcamera/camera.h>\n #include <libcamera/camera_manager.h>\n #include <libcamera/control_ids.h>\n@@ -111,8 +113,13 @@ struct GstLibcameraSrcState {\n \tstd::shared_ptr<Camera> cam_;\n \tstd::unique_ptr<CameraConfiguration> config_;\n \tstd::vector<GstPad *> srcpads_;\n-\tstd::queue<std::unique_ptr<RequestWrap>> queuedRequests_;\n-\tstd::queue<std::unique_ptr<RequestWrap>> completedRequests_;\n+\n+\tMutex lock_;\n+\tstd::queue<std::unique_ptr<RequestWrap>> queuedRequests_\n+\t\tLIBCAMERA_TSA_GUARDED_BY(lock_);\n+\tstd::queue<std::unique_ptr<RequestWrap>> completedRequests_\n+\t\tLIBCAMERA_TSA_GUARDED_BY(lock_);\n+\n \tguint group_id_;\n \n \tvoid requestCompleted(Request *request);\n@@ -155,12 +162,15 @@ GstStaticPadTemplate request_src_template = {\n void\n GstLibcameraSrcState::requestCompleted(Request *request)\n {\n-\tGLibLocker lock(GST_OBJECT(src_));\n-\n \tGST_DEBUG_OBJECT(src_, \"buffers are ready\");\n \n-\tstd::unique_ptr<RequestWrap> wrap = std::move(queuedRequests_.front());\n-\tqueuedRequests_.pop();\n+\tstd::unique_ptr<RequestWrap> wrap;\n+\n+\t{\n+\t\tMutexLocker locker(lock_);\n+\t\twrap = std::move(queuedRequests_.front());\n+\t\tqueuedRequests_.pop();\n+\t}\n \n \tg_return_if_fail(wrap->request_.get() == request);\n \n@@ -183,7 +193,10 @@ GstLibcameraSrcState::requestCompleted(Request *request)\n \t\twrap->latency_ = sys_now - timestamp;\n \t}\n \n-\tcompletedRequests_.push(std::move(wrap));\n+\t{\n+\t\tMutexLocker locker(lock_);\n+\t\tcompletedRequests_.push(std::move(wrap));\n+\t}\n \n \tgst_task_resume(src_->task);\n }\n@@ -289,16 +302,17 @@ gst_libcamera_src_task_run(gpointer user_data)\n \t}\n \n \tif (wrap) {\n-\t\tGLibLocker lock(GST_OBJECT(self));\n \t\tGST_TRACE_OBJECT(self, \"Requesting buffers\");\n \t\tstate->cam_->queueRequest(wrap->request_.get());\n+\n+\t\tMutexLocker locker(state->lock_);\n \t\tstate->queuedRequests_.push(std::move(wrap));\n \n \t\t/* The RequestWrap will be deleted in the completion handler. */\n \t}\n \n \t{\n-\t\tGLibLocker lock(GST_OBJECT(self));\n+\t\tMutexLocker locker(state->lock_);\n \n \t\tif (!state->completedRequests_.empty()) {\n \t\t\twrap = std::move(state->completedRequests_.front());\n@@ -358,7 +372,7 @@ gst_libcamera_src_task_run(gpointer user_data)\n \t\tbool do_pause;\n \n \t\t{\n-\t\t\tGLibLocker lock(GST_OBJECT(self));\n+\t\t\tMutexLocker locker(state->lock_);\n \t\t\tdo_pause = state->completedRequests_.empty();\n \t\t}\n \n@@ -513,7 +527,10 @@ gst_libcamera_src_task_leave([[maybe_unused]] GstTask *task,\n \n \tstate->cam_->stop();\n \n-\tstate->completedRequests_ = {};\n+\t{\n+\t\tMutexLocker locker(state->lock_);\n+\t\tstate->completedRequests_ = {};\n+\t}\n \n \tfor (GstPad *srcpad : state->srcpads_)\n \t\tgst_libcamera_pad_set_pool(srcpad, nullptr);\n", "prefixes": [ "libcamera-devel", "09/13" ] }