[{"id":1588,"web_url":"https://patchwork.libcamera.org/comment/1588/","msgid":"<20190511130935.GG4946@pendragon.ideasonboard.com>","date":"2019-05-11T13:09:35","subject":"Re: [libcamera-devel] [PATCH v3 08/11] libcamera: media_device: Add\n\tfunctions to lock device for other processes","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Niklas,\n\nThank you for the patch.\n\nOn Sat, May 11, 2019 at 11:19:04AM +0200, Niklas Söderlund wrote:\n> Add lock() and unlock() which are backed by lockf() and allows an\n\ns/allows/allow/\n\n> instance of libcamera to claim exclusive access to a media device.\n> These functions are the base of allowing multiple user of libcamera to\n> coexist in the system without stepping on each others toes.\n\ns/others/other's/\n\n> \n> Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> ---\n>  src/libcamera/include/media_device.h |  4 ++\n>  src/libcamera/media_device.cpp       | 58 +++++++++++++++++++++++++++-\n>  2 files changed, 61 insertions(+), 1 deletion(-)\n> \n> diff --git a/src/libcamera/include/media_device.h b/src/libcamera/include/media_device.h\n> index e513a2fee1b91a1b..7b88e2875d59dfc3 100644\n> --- a/src/libcamera/include/media_device.h\n> +++ b/src/libcamera/include/media_device.h\n> @@ -30,6 +30,9 @@ public:\n>  \tvoid release();\n>  \tbool busy() const { return acquired_; }\n>  \n> +\tbool lock();\n> +\tvoid unlock();\n> +\n>  \tint populate();\n>  \tbool valid() const { return valid_; }\n>  \n> @@ -58,6 +61,7 @@ private:\n>  \tint fd_;\n>  \tbool valid_;\n>  \tbool acquired_;\n> +\tbool lockOwner_;\n>  \n>  \tint open();\n>  \tvoid close();\n> diff --git a/src/libcamera/media_device.cpp b/src/libcamera/media_device.cpp\n> index 62c59e7e8fc0299f..874ecc06e4bd9c94 100644\n> --- a/src/libcamera/media_device.cpp\n> +++ b/src/libcamera/media_device.cpp\n> @@ -63,7 +63,8 @@ LOG_DEFINE_CATEGORY(MediaDevice)\n>   * populate() before the media graph can be queried.\n>   */\n>  MediaDevice::MediaDevice(const std::string &deviceNode)\n> -\t: deviceNode_(deviceNode), fd_(-1), valid_(false), acquired_(false)\n> +\t: deviceNode_(deviceNode), fd_(-1), valid_(false), acquired_(false),\n> +\t  lockOwner_(false)\n>  {\n>  }\n>  \n> @@ -118,6 +119,61 @@ void MediaDevice::release()\n>  \tacquired_ = false;\n>  }\n>  \n> +/**\n> + * \\brief Lock the device for use by other instances of libcamera\n\nThis sounds a bit weird to me. Maybe \"Lock the device from being used by\nother instances of libcamera\" ? Feedback from a native speaker would be\nappreciated here (and for the unlock() method below). Apart from this,\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n> + *\n> + * Multiple instances of libcamera might be running on the same system, at the\n> + * same time. To allow the different instances to coexist, system resources in\n> + * the form of media devices must be accessible for enumerating the cameras\n> + * they provide at all times, while still allowing an instance to lock a\n> + * resource while it prepares to actively use a camera from the resource.\n> + *\n> + * This method shall not be called from a pipeline handler implementation\n> + * directly, as the base PipelineHandler implementation handles this on the\n> + * behalf of the specified implementation.\n> + *\n> + * \\return True if the device could be locked, false otherwise\n> + * \\sa unlock()\n> + */\n> +bool MediaDevice::lock()\n> +{\n> +\tif (fd_ == -1)\n> +\t\treturn false;\n> +\n> +\t/* Do not allow nested locking in the same libcamera instance. */\n> +\tif (lockOwner_)\n> +\t\treturn false;\n> +\n> +\tif (lockf(fd_, F_TLOCK, 0))\n> +\t\treturn false;\n> +\n> +\tlockOwner_ = true;\n> +\n> +\treturn true;\n> +}\n> +\n> +/**\n> + * \\brief Unlock the device and free it for use for libcamera instances\n> + *\n> + * This method shall not be called from a pipeline handler implementation\n> + * directly, as the base PipelineHandler implementation handles this on the\n> + * behalf of the specified implementation.\n> + *\n> + * \\sa lock()\n> + */\n> +void MediaDevice::unlock()\n> +{\n> +\tif (fd_ == -1)\n> +\t\treturn;\n> +\n> +\tif (!lockOwner_)\n> +\t\treturn;\n> +\n> +\tlockOwner_ = false;\n> +\n> +\tlockf(fd_, F_ULOCK, 0);\n> +}\n> +\n>  /**\n>   * \\fn MediaDevice::busy()\n>   * \\brief Check if a device is in use","headers":{"Return-Path":"<laurent.pinchart@ideasonboard.com>","Received":["from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id EE2A060E4F\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSat, 11 May 2019 15:09:59 +0200 (CEST)","from pendragon.ideasonboard.com\n\t(dfj612yhrgyx302h3jwwy-3.rev.dnainternet.fi\n\t[IPv6:2001:14ba:21f5:5b00:ce28:277f:58d7:3ca4])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 6607CD5;\n\tSat, 11 May 2019 15:09:59 +0200 (CEST)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1557580199;\n\tbh=KRNOnze35LL9But8UUlMuctSj2ux1yled3/74owGaWQ=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=gEk8Tre7jUqF2WXMCCEXki79nlmf4xO67UgJF8HQpq348Wpghe3KXL/YCxVXeIzwY\n\tVT8RhKquwNMR73x4rAZp4xA0ZicAa53JTHBGa6hJLPaNhjHnD29Ccc0cUMrm7D6GQP\n\tXfrb3FvuEkBC/CyZrjdvnFXQiHY/jBqNLHTTtA3E=","Date":"Sat, 11 May 2019 16:09:35 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Niklas =?utf-8?q?S=C3=B6derlund?= <niklas.soderlund@ragnatech.se>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20190511130935.GG4946@pendragon.ideasonboard.com>","References":"<20190511091907.10050-1-niklas.soderlund@ragnatech.se>\n\t<20190511091907.10050-9-niklas.soderlund@ragnatech.se>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20190511091907.10050-9-niklas.soderlund@ragnatech.se>","User-Agent":"Mutt/1.10.1 (2018-07-13)","Subject":"Re: [libcamera-devel] [PATCH v3 08/11] libcamera: media_device: Add\n\tfunctions to lock device for other processes","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.23","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>","X-List-Received-Date":"Sat, 11 May 2019 13:10:00 -0000"}}]