From patchwork Mon Mar 22 10:44:45 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 11640 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 53C5BBD80C for ; Mon, 22 Mar 2021 10:57:44 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 9E87B68D62; Mon, 22 Mar 2021 11:57:43 +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="irdHSsUl"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="rtx7Zqsi"; 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 54A1668D58 for ; Mon, 22 Mar 2021 11:57:42 +0100 (CET) Received: from pyrite.rasen.tech (unknown [IPv6:2400:4051:61:600:2c71:1b79:d06d:5032]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 0A344AD6 for ; Mon, 22 Mar 2021 11:57:40 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1616410662; bh=ai3IebQg9DIdRlRIFj1Mjii2x7wwEqScdm01UxNh+Ko=; h=Resent-From:Resent-Date:Resent-To:From:To:Cc:Subject:Date:From; b=irdHSsUlOiE+VOOyyBO/GpE0B7JH9/CcWvM4UX4HWnNPLw/g8BHWmnaxcwfYev7Mp YYCe1ZudBjX8Vph4IvGmta61hC0k/NhaJ27yfMz/zkxu7cGciDMVgYOoToTP67GPXB j7xvz2EWkGVyjURD/VPcPZo18b5F/GQPHPflpL+s= Resent-From: paul.elder@ideasonboard.com Resent-Date: Mon, 22 Mar 2021 19:57:35 +0900 Resent-Message-ID: <20210322105735.GG9888@pyrite.rasen.tech> Resent-To: libcamera-devel@lists.libcamera.org Received: from perceval.ideasonboard.com by perceval.ideasonboard.com with LMTP id QIiuKS11WGDQGwAA4E0KoQ (envelope-from ) for ; Mon, 22 Mar 2021 11:45:01 +0100 Received: from pyrite.rasen.tech (unknown [IPv6:2400:4051:61:600:2c71:1b79:d06d:5032]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 48F93AD6; Mon, 22 Mar 2021 11:44:58 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1616409900; bh=ai3IebQg9DIdRlRIFj1Mjii2x7wwEqScdm01UxNh+Ko=; h=From:To:Cc:Subject:Date:From; b=rtx7ZqsimcirPiKhxslkFNABUMsjobpdzmIr1n/v/MtfqImTZUhDR/lRxvbNUrYOp UytUZ8/BQpPcb0zPsnf9RgNv5XX8clTAI55fD7u9KOsfKrmuqd3t3WvUlQbOR7wLkM 3tg+tCMjXE8bEjIslYKQ7+MHokNccpqv2jK+/8ws= From: Paul Elder To: libcamera@lists.ideasonboard.com Date: Mon, 22 Mar 2021 19:44:45 +0900 Message-Id: <20210322104445.21528-1-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.27.0 MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2] android: Return -EUSERS when failed to open a Camera that's in use 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: , Cc: hiroh@google.com Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" The correct return value for the HAL for hal_dev_open() when trying to open a camera that's already opened is EUSERS. Make hal_dev_open() return -EUSERS, and plumb the logic for this through CameraHalManager::open(). Signed-off-by: Paul Elder --- I think the only discussion point that we have so far is whether -EUSERS should be returned only in HAL, or in libcamera as well, which currently returners -EBUSY. Changes in v2: - use structured binding when opening the camera in hal_dev_open() - expand the error message --- src/android/camera3_hal.cpp | 9 +++++++-- src/android/camera_hal_manager.cpp | 15 ++++++++------- src/android/camera_hal_manager.h | 4 +++- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/android/camera3_hal.cpp b/src/android/camera3_hal.cpp index d6e04af2..7b5f3898 100644 --- a/src/android/camera3_hal.cpp +++ b/src/android/camera3_hal.cpp @@ -77,8 +77,13 @@ static int hal_dev_open(const hw_module_t *module, const char *name, LOG(HAL, Debug) << "Open camera " << name; int id = atoi(name); - CameraDevice *camera = cameraManager.open(id, module); - if (!camera) { + auto [camera, ret] = cameraManager.open(id, module); + if (ret == -EBUSY) { + LOG(HAL, Error) + << "Failed to open camera module '" << id + << "', as it is in use"; + return -EUSERS; + } else if (!camera) { LOG(HAL, Error) << "Failed to open camera module '" << id << "'"; return -ENODEV; diff --git a/src/android/camera_hal_manager.cpp b/src/android/camera_hal_manager.cpp index 189eda2b..aeff14bd 100644 --- a/src/android/camera_hal_manager.cpp +++ b/src/android/camera_hal_manager.cpp @@ -65,28 +65,29 @@ int CameraHalManager::init() return 0; } -CameraDevice *CameraHalManager::open(unsigned int id, - const hw_module_t *hardwareModule) +std::tuple +CameraHalManager::open(unsigned int id, const hw_module_t *hardwareModule) { MutexLocker locker(mutex_); if (!callbacks_) { LOG(HAL, Error) << "Can't open camera before callbacks are set"; - return nullptr; + return { nullptr, -ENODEV }; } CameraDevice *camera = cameraDeviceFromHalId(id); if (!camera) { LOG(HAL, Error) << "Invalid camera id '" << id << "'"; - return nullptr; + return { nullptr, -ENODEV }; } - if (camera->open(hardwareModule)) - return nullptr; + int ret = camera->open(hardwareModule); + if (ret) + return { nullptr, ret }; LOG(HAL, Info) << "Open camera '" << id << "'"; - return camera; + return { camera, 0 }; } void CameraHalManager::cameraAdded(std::shared_ptr cam) diff --git a/src/android/camera_hal_manager.h b/src/android/camera_hal_manager.h index a91decc7..24bf716c 100644 --- a/src/android/camera_hal_manager.h +++ b/src/android/camera_hal_manager.h @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -28,7 +29,8 @@ public: int init(); - CameraDevice *open(unsigned int id, const hw_module_t *module); + std::tuple + open(unsigned int id, const hw_module_t *module); unsigned int numCameras() const; int getCameraInfo(unsigned int id, struct camera_info *info);