From patchwork Wed Jan 2 00:49:01 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 127 Return-Path: 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 3462160B30 for ; Wed, 2 Jan 2019 01:48:08 +0100 (CET) Received: from avalon.bb.dnainternet.fi (dfj612ybrt5fhg77mgycy-3.rev.dnainternet.fi [IPv6:2001:14ba:21f5:5b00:2e86:4862:ef6a:2804]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id A9F7F505 for ; Wed, 2 Jan 2019 01:48:07 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1546390087; bh=Ht6R9xbDXuATQK4BdllJKlU5jcPbz9AZP0pXp0qK+JU=; h=From:To:Subject:Date:From; b=jU3y16oafU4TPbKi+FA5MN5p1g9cPbqAVMnU2RKSGVkEfwjuDvx/pIkoLEWDDziwX Grpjh6tjDv/JaofOth6ijCFSgCNOTErmLL536wqbbHEvIaobZMewfDVwdkdJTuMEqU TsuRELrMtRJB22AioFik6s7yKBWO0X/YNkRfI+Oc= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Wed, 2 Jan 2019 02:49:01 +0200 Message-Id: <20190102004903.24190-1-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.19.2 MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 1/3] libcamera: media_device: Add DeviceInfo features X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 02 Jan 2019 00:48:08 -0000 From: Jacopo Mondi Add the features of the DeviceInfo class needed to replace it with MediaDevice. Signed-off-by: Jacopo Mondi Signed-off-by: Laurent Pinchart --- src/libcamera/include/media_device.h | 5 +++ src/libcamera/media_device.cpp | 52 ++++++++++++++++++++++++++-- 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/src/libcamera/include/media_device.h b/src/libcamera/include/media_device.h index d787be391882..3fcdb4b4d5f8 100644 --- a/src/libcamera/include/media_device.h +++ b/src/libcamera/include/media_device.h @@ -24,6 +24,10 @@ public: MediaDevice(const std::string &devnode); ~MediaDevice(); + bool acquire(); + void release() { acquired_ = false; } + bool busy() const { return acquired_; } + int open(); void close(); @@ -41,6 +45,7 @@ private: std::string devnode_; int fd_; bool valid_; + bool acquired_; std::map objects_; MediaObject *object(unsigned int id); diff --git a/src/libcamera/media_device.cpp b/src/libcamera/media_device.cpp index 1bd4f43a0c79..605e504be124 100644 --- a/src/libcamera/media_device.cpp +++ b/src/libcamera/media_device.cpp @@ -52,7 +52,11 @@ namespace libcamera { * controller device node. It can be closed at any time with a call to close(). * This will not invalidate the media graph and all cached media objects remain * valid and can be accessed normally. The device can then be later reopened if - * needed to perform other operations that interact with the device node. + * needed to perform other operations that interect with the device node. + * + * Media device can be claimed for exclusive use with acquire(), released with + * release() and tested with busy(). This mechanism is aimed at pipeline + * managers to claim media devices they support during enumeration. */ /** @@ -63,7 +67,7 @@ namespace libcamera { * populated with open() and populate() before the media graph can be queried. */ MediaDevice::MediaDevice(const std::string &devnode) - : devnode_(devnode), fd_(-1), valid_(false) + : devnode_(devnode), fd_(-1), valid_(false), acquired_(false) { } @@ -74,6 +78,50 @@ MediaDevice::~MediaDevice() clear(); } +/** + * \brief Claim a device for exclusive use + * + * The device claiming mechanism offers simple media device access arbitration + * between multiple users. When the media device is created, it is available to + * all users. Users can query the media graph to determine whether they can + * support the device and, if they do, claim the device for exclusive use. Other + * users are then expected to skip over media devices in use as reported by the + * busy() function. + * + * Once claimed the device shall be released by its user when not needed anymore + * by calling the release() function. + * + * Exclusive access is only guaranteed if all users of the media device abide by + * the device claiming mechanism, as it isn't enforced by the media device + * itself. + * + * \return true if the device was successfully claimed, or false if it was + * already in use + * \sa release(), busy() + */ +bool MediaDevice::acquire() +{ + if (acquired_) + return false; + + acquired_ = true; + return true; +} + +/** + * \fn MediaDevice::release() + * \brief Release a device previously claimed for exclusive use + * \sa acquire(), busy() + */ + +/** + * \fn MediaDevice::busy() + * \brief Check if a device is in use + * \return true if the device has been claimed for exclusive user, or false if + * it is available + * \sa acquire(), release() + */ + /** * \brief Open a media device and retrieve device information *