From patchwork Thu Jun 23 23:22:06 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 16354 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 4D6AFBD808 for ; Thu, 23 Jun 2022 23:22:43 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id C3D8265640; Fri, 24 Jun 2022 01:22:42 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1656026562; bh=uQlVlGNXE+ZZ97peDXLIfggYGTn6X4KrYw0QTQHCbA8=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=LrXeexDuhs7LX0b8+4fyTJqVoAfP4lbfUB6fzh1h+pv3QvhLIf8LArTy69AuUO6+W J96g4CXO610d1VcOlzJX93GvKkILle3V3bYn1vPmQADGyQuWgoRhLD6feV8ouycUVP VvNPeJv/aJtWOvI0d/ptVvPjmThUGa078n8kzVqyKumfkCLbQx6okiEbwLU0zS6W1K dKZVWQLaOU97CuO09n2o0mzExyEGBvOO8PjFa/67THKTF9mcvScUHEZXX+pBzsFS6L k/G/04ua63sGlMu8L42KHRmnYCzZBV0BK5Yi3Lqyo5rJ5xU4QexHZp2J1aGm0JyUbz C2l1HmyliyOCQ== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 16DFD65636 for ; Fri, 24 Jun 2022 01:22:33 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="iU3Jo7xn"; dkim-atps=neutral Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 8D6F76BB; Fri, 24 Jun 2022 01:22:32 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1656026552; bh=uQlVlGNXE+ZZ97peDXLIfggYGTn6X4KrYw0QTQHCbA8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=iU3Jo7xnPqHRXK+uZCBGH+Ikdn5LB3zHiPxFK0UVvL0YxpuYjjxj3FWD0TrV0+lnL C47OYGo0VvecvHLrCtw1j+6mKtv+mE99VqwRA8vGNX3019Xb3BLd0rNuJ0rSuLkPXP 3vG6O4XcjswZ7xfLt2KtD2dJHI8TnaAmLg+VjaUk= 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 Subject: [libcamera-devel] [PATCH 09/13] gstreamer: Use dedicated lock for request queues 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: , X-Patchwork-Original-From: Laurent Pinchart via libcamera-devel From: Laurent Pinchart Reply-To: Laurent Pinchart Cc: Nicolas Dufresne , Vedant Paranjape Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Add a new lock to the GstLibcameraSrcState class to protect the queued and completed requests queues. This replaces the GstObject lock, and minimizes the lock contention between the request completion handler and the task run handler as the former must run as fast as possible. Signed-off-by: Laurent Pinchart Reviewed-by: Nicolas Dufresne --- src/gstreamer/gstlibcamerasrc.cpp | 39 ++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp index e30d45fa2223..b85ba39fb808 100644 --- a/src/gstreamer/gstlibcamerasrc.cpp +++ b/src/gstreamer/gstlibcamerasrc.cpp @@ -32,6 +32,8 @@ #include #include +#include + #include #include #include @@ -111,8 +113,13 @@ struct GstLibcameraSrcState { std::shared_ptr cam_; std::unique_ptr config_; std::vector srcpads_; - std::queue> queuedRequests_; - std::queue> completedRequests_; + + Mutex lock_; + std::queue> queuedRequests_ + LIBCAMERA_TSA_GUARDED_BY(lock_); + std::queue> completedRequests_ + LIBCAMERA_TSA_GUARDED_BY(lock_); + guint group_id_; void requestCompleted(Request *request); @@ -155,12 +162,15 @@ GstStaticPadTemplate request_src_template = { void GstLibcameraSrcState::requestCompleted(Request *request) { - GLibLocker lock(GST_OBJECT(src_)); - GST_DEBUG_OBJECT(src_, "buffers are ready"); - std::unique_ptr wrap = std::move(queuedRequests_.front()); - queuedRequests_.pop(); + std::unique_ptr wrap; + + { + MutexLocker locker(lock_); + wrap = std::move(queuedRequests_.front()); + queuedRequests_.pop(); + } g_return_if_fail(wrap->request_.get() == request); @@ -183,7 +193,10 @@ GstLibcameraSrcState::requestCompleted(Request *request) wrap->latency_ = sys_now - timestamp; } - completedRequests_.push(std::move(wrap)); + { + MutexLocker locker(lock_); + completedRequests_.push(std::move(wrap)); + } gst_task_resume(src_->task); } @@ -289,16 +302,17 @@ gst_libcamera_src_task_run(gpointer user_data) } if (wrap) { - GLibLocker lock(GST_OBJECT(self)); GST_TRACE_OBJECT(self, "Requesting buffers"); state->cam_->queueRequest(wrap->request_.get()); + + MutexLocker locker(state->lock_); state->queuedRequests_.push(std::move(wrap)); /* The RequestWrap will be deleted in the completion handler. */ } { - GLibLocker lock(GST_OBJECT(self)); + MutexLocker locker(state->lock_); if (!state->completedRequests_.empty()) { wrap = std::move(state->completedRequests_.front()); @@ -358,7 +372,7 @@ gst_libcamera_src_task_run(gpointer user_data) bool do_pause; { - GLibLocker lock(GST_OBJECT(self)); + MutexLocker locker(state->lock_); do_pause = state->completedRequests_.empty(); } @@ -513,7 +527,10 @@ gst_libcamera_src_task_leave([[maybe_unused]] GstTask *task, state->cam_->stop(); - state->completedRequests_ = {}; + { + MutexLocker locker(state->lock_); + state->completedRequests_ = {}; + } for (GstPad *srcpad : state->srcpads_) gst_libcamera_pad_set_pool(srcpad, nullptr);