[libcamera-devel,01/11] libcamera: Always check return value of MediaDevice::acquire()

Message ID 20190429191729.29697-2-niklas.soderlund@ragnatech.se
State Superseded
Headers show
Series
  • libcamerea: Add support for exclusive access to cameras between processes
Related show

Commit Message

Niklas Söderlund April 29, 2019, 7:17 p.m. UTC
In preparation of adding more responsibility to MediaDevice::acquire()
make sure all callers checks and acts properly to its return value.

Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 src/libcamera/pipeline/ipu3/ipu3.cpp         | 10 ++++------
 src/libcamera/pipeline/uvcvideo.cpp          |  3 ++-
 src/libcamera/pipeline/vimc.cpp              |  3 ++-
 test/media_device/media_device_link_test.cpp |  6 +++++-
 test/v4l2_device/v4l2_device_test.cpp        |  3 ++-
 test/v4l2_subdevice/v4l2_subdevice_test.cpp  |  6 +++++-
 6 files changed, 20 insertions(+), 11 deletions(-)

Comments

Kieran Bingham April 30, 2019, 8:01 a.m. UTC | #1
Hi Niklas,

On 29/04/2019 20:17, Niklas Söderlund wrote:
> In preparation of adding more responsibility to MediaDevice::acquire()

"In preparation for adding"

> make sure all callers checks and acts properly to its return value.

make sure all callers check and act accordingly to its return value.

Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>

> Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---
>  src/libcamera/pipeline/ipu3/ipu3.cpp         | 10 ++++------
>  src/libcamera/pipeline/uvcvideo.cpp          |  3 ++-
>  src/libcamera/pipeline/vimc.cpp              |  3 ++-
>  test/media_device/media_device_link_test.cpp |  6 +++++-
>  test/v4l2_device/v4l2_device_test.cpp        |  3 ++-
>  test/v4l2_subdevice/v4l2_subdevice_test.cpp  |  6 +++++-
>  6 files changed, 20 insertions(+), 11 deletions(-)
> 
> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> index fbb37498ca8a85cd..e8b9cd8f889b7cf2 100644
> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> @@ -617,21 +617,19 @@ bool PipelineHandlerIPU3::match(DeviceEnumerator *enumerator)
>  	imgu_dm.add("ipu3-imgu 1 viewfinder");
>  	imgu_dm.add("ipu3-imgu 1 3a stat");
>  
> -	/*
> -	 * It is safe to acquire both media devices at this point as
> -	 * DeviceEnumerator::search() skips the busy ones for us.
> -	 */
>  	cio2MediaDev_ = enumerator->search(cio2_dm);
>  	if (!cio2MediaDev_)
>  		return false;
>  
> -	cio2MediaDev_->acquire();
> +	if (!cio2MediaDev_->acquire())
> +		return false;
>  
>  	imguMediaDev_ = enumerator->search(imgu_dm);
>  	if (!imguMediaDev_)
>  		return false;
>  
> -	imguMediaDev_->acquire();
> +	if (!imguMediaDev_->acquire())
> +		return false;
>  
>  	/*
>  	 * Disable all links that are enabled by default on CIO2, as camera
> diff --git a/src/libcamera/pipeline/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo.cpp
> index 2f9b5e0fdc08d089..d7ef37a8171f0eac 100644
> --- a/src/libcamera/pipeline/uvcvideo.cpp
> +++ b/src/libcamera/pipeline/uvcvideo.cpp
> @@ -189,7 +189,8 @@ bool PipelineHandlerUVC::match(DeviceEnumerator *enumerator)
>  	if (!media_)
>  		return false;
>  
> -	media_->acquire();
> +	if (!media_->acquire())
> +		return false;
>  
>  	std::unique_ptr<UVCCameraData> data = utils::make_unique<UVCCameraData>(this);
>  
> diff --git a/src/libcamera/pipeline/vimc.cpp b/src/libcamera/pipeline/vimc.cpp
> index f70b4d3c6bab4a84..25f0802c30d3d07b 100644
> --- a/src/libcamera/pipeline/vimc.cpp
> +++ b/src/libcamera/pipeline/vimc.cpp
> @@ -199,7 +199,8 @@ bool PipelineHandlerVimc::match(DeviceEnumerator *enumerator)
>  	if (!media_)
>  		return false;
>  
> -	media_->acquire();
> +	if (!media_->acquire())
> +		return false;
>  
>  	std::unique_ptr<VimcCameraData> data = utils::make_unique<VimcCameraData>(this);
>  
> diff --git a/test/media_device/media_device_link_test.cpp b/test/media_device/media_device_link_test.cpp
> index 58a55cdfee634c0b..484d3691310f78a0 100644
> --- a/test/media_device/media_device_link_test.cpp
> +++ b/test/media_device/media_device_link_test.cpp
> @@ -51,7 +51,11 @@ class MediaDeviceLinkTest : public Test
>  			return TestSkip;
>  		}
>  
> -		dev_->acquire();
> +		if (!dev_->acquire()) {
> +			cerr << "Unable to acquire media device "
> +			     << dev_->deviceNode() << endl;
> +			return TestSkip;
> +		}
>  
>  		if (dev_->open()) {
>  			cerr << "Failed to open media device at "
> diff --git a/test/v4l2_device/v4l2_device_test.cpp b/test/v4l2_device/v4l2_device_test.cpp
> index 4225291bbb6e23f0..90e5f7a3ee0c0f2f 100644
> --- a/test/v4l2_device/v4l2_device_test.cpp
> +++ b/test/v4l2_device/v4l2_device_test.cpp
> @@ -46,7 +46,8 @@ int V4L2DeviceTest::init()
>  	if (!media_)
>  		return TestSkip;
>  
> -	media_->acquire();
> +	if (!media_->acquire())
> +		return TestSkip;
>  
>  	MediaEntity *entity = media_->getEntityByName("vivid-000-vid-cap");
>  	if (!entity)
> diff --git a/test/v4l2_subdevice/v4l2_subdevice_test.cpp b/test/v4l2_subdevice/v4l2_subdevice_test.cpp
> index 72d5f72543d29378..4e16ab6cf3e5f874 100644
> --- a/test/v4l2_subdevice/v4l2_subdevice_test.cpp
> +++ b/test/v4l2_subdevice/v4l2_subdevice_test.cpp
> @@ -45,7 +45,11 @@ int V4L2SubdeviceTest::init()
>  		return TestSkip;
>  	}
>  
> -	media_->acquire();
> +	if (!media_->acquire()) {
> +		cerr << "Unable to acquire media device "
> +		     << media_->deviceNode() << endl;
> +		return TestSkip;
> +	}
>  
>  	int ret = media_->open();
>  	if (ret) {
>

Patch

diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index fbb37498ca8a85cd..e8b9cd8f889b7cf2 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -617,21 +617,19 @@  bool PipelineHandlerIPU3::match(DeviceEnumerator *enumerator)
 	imgu_dm.add("ipu3-imgu 1 viewfinder");
 	imgu_dm.add("ipu3-imgu 1 3a stat");
 
-	/*
-	 * It is safe to acquire both media devices at this point as
-	 * DeviceEnumerator::search() skips the busy ones for us.
-	 */
 	cio2MediaDev_ = enumerator->search(cio2_dm);
 	if (!cio2MediaDev_)
 		return false;
 
-	cio2MediaDev_->acquire();
+	if (!cio2MediaDev_->acquire())
+		return false;
 
 	imguMediaDev_ = enumerator->search(imgu_dm);
 	if (!imguMediaDev_)
 		return false;
 
-	imguMediaDev_->acquire();
+	if (!imguMediaDev_->acquire())
+		return false;
 
 	/*
 	 * Disable all links that are enabled by default on CIO2, as camera
diff --git a/src/libcamera/pipeline/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo.cpp
index 2f9b5e0fdc08d089..d7ef37a8171f0eac 100644
--- a/src/libcamera/pipeline/uvcvideo.cpp
+++ b/src/libcamera/pipeline/uvcvideo.cpp
@@ -189,7 +189,8 @@  bool PipelineHandlerUVC::match(DeviceEnumerator *enumerator)
 	if (!media_)
 		return false;
 
-	media_->acquire();
+	if (!media_->acquire())
+		return false;
 
 	std::unique_ptr<UVCCameraData> data = utils::make_unique<UVCCameraData>(this);
 
diff --git a/src/libcamera/pipeline/vimc.cpp b/src/libcamera/pipeline/vimc.cpp
index f70b4d3c6bab4a84..25f0802c30d3d07b 100644
--- a/src/libcamera/pipeline/vimc.cpp
+++ b/src/libcamera/pipeline/vimc.cpp
@@ -199,7 +199,8 @@  bool PipelineHandlerVimc::match(DeviceEnumerator *enumerator)
 	if (!media_)
 		return false;
 
-	media_->acquire();
+	if (!media_->acquire())
+		return false;
 
 	std::unique_ptr<VimcCameraData> data = utils::make_unique<VimcCameraData>(this);
 
diff --git a/test/media_device/media_device_link_test.cpp b/test/media_device/media_device_link_test.cpp
index 58a55cdfee634c0b..484d3691310f78a0 100644
--- a/test/media_device/media_device_link_test.cpp
+++ b/test/media_device/media_device_link_test.cpp
@@ -51,7 +51,11 @@  class MediaDeviceLinkTest : public Test
 			return TestSkip;
 		}
 
-		dev_->acquire();
+		if (!dev_->acquire()) {
+			cerr << "Unable to acquire media device "
+			     << dev_->deviceNode() << endl;
+			return TestSkip;
+		}
 
 		if (dev_->open()) {
 			cerr << "Failed to open media device at "
diff --git a/test/v4l2_device/v4l2_device_test.cpp b/test/v4l2_device/v4l2_device_test.cpp
index 4225291bbb6e23f0..90e5f7a3ee0c0f2f 100644
--- a/test/v4l2_device/v4l2_device_test.cpp
+++ b/test/v4l2_device/v4l2_device_test.cpp
@@ -46,7 +46,8 @@  int V4L2DeviceTest::init()
 	if (!media_)
 		return TestSkip;
 
-	media_->acquire();
+	if (!media_->acquire())
+		return TestSkip;
 
 	MediaEntity *entity = media_->getEntityByName("vivid-000-vid-cap");
 	if (!entity)
diff --git a/test/v4l2_subdevice/v4l2_subdevice_test.cpp b/test/v4l2_subdevice/v4l2_subdevice_test.cpp
index 72d5f72543d29378..4e16ab6cf3e5f874 100644
--- a/test/v4l2_subdevice/v4l2_subdevice_test.cpp
+++ b/test/v4l2_subdevice/v4l2_subdevice_test.cpp
@@ -45,7 +45,11 @@  int V4L2SubdeviceTest::init()
 		return TestSkip;
 	}
 
-	media_->acquire();
+	if (!media_->acquire()) {
+		cerr << "Unable to acquire media device "
+		     << media_->deviceNode() << endl;
+		return TestSkip;
+	}
 
 	int ret = media_->open();
 	if (ret) {