From patchwork Thu Mar 25 13:42:27 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kieran Bingham X-Patchwork-Id: 11717 X-Patchwork-Delegate: kieran.bingham@ideasonboard.com 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 C9C97C32E9 for ; Thu, 25 Mar 2021 13:42:48 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 84A9F68D79; Thu, 25 Mar 2021 14:42:48 +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="kTUJlEUP"; 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 5675368D6D for ; Thu, 25 Mar 2021 14:42:38 +0100 (CET) Received: from Q.local (cpc89244-aztw30-2-0-cust3082.18-1.cable.virginm.net [86.31.172.11]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id F177F8C9; Thu, 25 Mar 2021 14:42:37 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1616679758; bh=Bo5mxA6szGRlwnU8mKkgLU3L3+ybPx3+GNMM9XEOCac=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=kTUJlEUPaii7Lwa9vLYXBklFY988p1DgXWhfpwNcNTFqeWKW+vlqqiS2cUwfQxjCJ lIWqvknEKPpn7KRCtIt3cSa5qRBJ5DR4sN4BC3hSPShKZcxR7BfHuxC7/EWfxEz9Vt cntArSsrmxgdJ1KQa+TDKjeNcKR17q9vyI1M7PoE= From: Kieran Bingham To: libcamera devel Date: Thu, 25 Mar 2021 13:42:27 +0000 Message-Id: <20210325134231.1400051-10-kieran.bingham@ideasonboard.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210325134231.1400051-1-kieran.bingham@ideasonboard.com> References: <20210325134231.1400051-1-kieran.bingham@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 07/11] libcamera: camera: Report function which fails access control 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" The camera object has a state machine to ensure calls are only made when in the correct state. It isn't easy to identify where things happen when assertions fail so add extra information to make this clearer. Signed-off-by: Kieran Bingham Reviewed-by: Laurent Pinchart --- src/libcamera/camera.cpp | 51 +++++++++++++++++++++++----------------- 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp index b86bff4745b2..336ab8695ab3 100644 --- a/src/libcamera/camera.cpp +++ b/src/libcamera/camera.cpp @@ -346,8 +346,9 @@ public: const std::set &streams); ~Private(); - int isAccessAllowed(State state, bool allowDisconnected = false) const; - int isAccessAllowed(State low, State high, + int isAccessAllowed(const char *from, State state, + bool allowDisconnected = false) const; + int isAccessAllowed(const char *from, State low, State high, bool allowDisconnected = false) const; void disconnect(); @@ -384,7 +385,8 @@ static const char *const camera_state_names[] = { "Running", }; -int Camera::Private::isAccessAllowed(State state, bool allowDisconnected) const +int Camera::Private::isAccessAllowed(const char *from, State state, + bool allowDisconnected) const { if (!allowDisconnected && disconnected_) return -ENODEV; @@ -395,14 +397,16 @@ int Camera::Private::isAccessAllowed(State state, bool allowDisconnected) const ASSERT(static_cast(state) < std::size(camera_state_names)); - LOG(Camera, Debug) << "Camera in " << camera_state_names[currentState] - << " state trying operation requiring state " - << camera_state_names[state]; + LOG(Camera, Warning) << "Camera in " << camera_state_names[currentState] + << " state trying operation [" + << from << "] requiring state " + << camera_state_names[state]; return -EACCES; } -int Camera::Private::isAccessAllowed(State low, State high, +int Camera::Private::isAccessAllowed(const char *from, + State low, State high, bool allowDisconnected) const { if (!allowDisconnected && disconnected_) @@ -415,10 +419,11 @@ int Camera::Private::isAccessAllowed(State low, State high, ASSERT(static_cast(low) < std::size(camera_state_names) && static_cast(high) < std::size(camera_state_names)); - LOG(Camera, Debug) << "Camera in " << camera_state_names[currentState] - << " state trying operation requiring state between " - << camera_state_names[low] << " and " - << camera_state_names[high]; + LOG(Camera, Warning) << "Camera in " << camera_state_names[currentState] + << " state trying operation [" << from + << "] requiring state between " + << camera_state_names[low] << " and " + << camera_state_names[high]; return -EACCES; } @@ -646,7 +651,7 @@ int Camera::exportFrameBuffers(Stream *stream, { Private *const d = LIBCAMERA_D_PTR(); - int ret = d->isAccessAllowed(Private::CameraConfigured); + int ret = d->isAccessAllowed(__FUNCTION__, Private::CameraConfigured); if (ret < 0) return ret; @@ -693,7 +698,7 @@ int Camera::acquire() * No manual locking is required as PipelineHandler::lock() is * thread-safe. */ - int ret = d->isAccessAllowed(Private::CameraAvailable); + int ret = d->isAccessAllowed(__FUNCTION__, Private::CameraAvailable); if (ret < 0) return ret == -EACCES ? -EBUSY : ret; @@ -726,7 +731,8 @@ int Camera::release() { Private *const d = LIBCAMERA_D_PTR(); - int ret = d->isAccessAllowed(Private::CameraAvailable, + int ret = d->isAccessAllowed(__FUNCTION__, + Private::CameraAvailable, Private::CameraConfigured, true); if (ret < 0) return ret == -EACCES ? -EBUSY : ret; @@ -805,7 +811,8 @@ std::unique_ptr Camera::generateConfiguration(const StreamR { Private *const d = LIBCAMERA_D_PTR(); - int ret = d->isAccessAllowed(Private::CameraAvailable, + int ret = d->isAccessAllowed(__FUNCTION__, + Private::CameraAvailable, Private::CameraRunning); if (ret < 0) return nullptr; @@ -866,7 +873,8 @@ int Camera::configure(CameraConfiguration *config) { Private *const d = LIBCAMERA_D_PTR(); - int ret = d->isAccessAllowed(Private::CameraAcquired, + int ret = d->isAccessAllowed(__FUNCTION__, + Private::CameraAcquired, Private::CameraConfigured); if (ret < 0) return ret; @@ -938,7 +946,8 @@ std::unique_ptr Camera::createRequest(uint64_t cookie) { Private *const d = LIBCAMERA_D_PTR(); - int ret = d->isAccessAllowed(Private::CameraConfigured, + int ret = d->isAccessAllowed(__FUNCTION__, + Private::CameraConfigured, Private::CameraRunning); if (ret < 0) return nullptr; @@ -972,7 +981,7 @@ int Camera::queueRequest(Request *request) { Private *const d = LIBCAMERA_D_PTR(); - int ret = d->isAccessAllowed(Private::CameraRunning); + int ret = d->isAccessAllowed(__FUNCTION__, Private::CameraRunning); if (ret < 0) return ret; @@ -1022,7 +1031,7 @@ int Camera::start(const ControlList *controls) { Private *const d = LIBCAMERA_D_PTR(); - int ret = d->isAccessAllowed(Private::CameraConfigured); + int ret = d->isAccessAllowed(__FUNCTION__, Private::CameraConfigured); if (ret < 0) return ret; @@ -1056,7 +1065,7 @@ int Camera::stop() { Private *const d = LIBCAMERA_D_PTR(); - int ret = d->isAccessAllowed(Private::CameraRunning); + int ret = d->isAccessAllowed(__FUNCTION__, Private::CameraRunning); if (ret < 0) return ret; @@ -1082,7 +1091,7 @@ void Camera::requestComplete(Request *request) Private *const d = LIBCAMERA_D_PTR(); /* Disconnected cameras are still able to complete requests. */ - int ret = d->isAccessAllowed(Private::CameraRunning); + int ret = d->isAccessAllowed(__FUNCTION__, Private::CameraRunning); if (ret < 0 && ret != -ENODEV) LOG(Camera, Fatal) << "Trying to complete a request when stopped";