[libcamera-devel] [PATCH v2 4/7] v4l2: v4l2_camera_proxy: Acquire only one buffer semaphore on VIDIOC_DQBUF

Paul Elder paul.elder at ideasonboard.com
Fri Jun 5 11:01:03 CEST 2020


We use a semaphore to atomically keep track of how many buffers are
available for dequeueing. The check for how to acquire the semaphore was
incorrect, leading to a double acquire upon a successful nonblocking
acquire. Fix this.

Signed-off-by: Paul Elder <paul.elder at ideasonboard.com>

---
Changes in v2: restructured the if block so it's easier to read
---
 src/v4l2/v4l2_camera_proxy.cpp | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/v4l2/v4l2_camera_proxy.cpp b/src/v4l2/v4l2_camera_proxy.cpp
index ec6d265d..a0c6deea 100644
--- a/src/v4l2/v4l2_camera_proxy.cpp
+++ b/src/v4l2/v4l2_camera_proxy.cpp
@@ -426,10 +426,10 @@ int V4L2CameraProxy::vidioc_dqbuf(struct v4l2_buffer *arg)
 	    !validateMemoryType(arg->memory))
 		return -EINVAL;
 
-	if (nonBlocking_ && !vcam_->bufferSema_.tryAcquire())
-		return -EAGAIN;
-	else
+	if (!nonBlocking_)
 		vcam_->bufferSema_.acquire();
+	else if (!vcam_->bufferSema_.tryAcquire())
+		return -EAGAIN;
 
 	updateBuffers();
 
-- 
2.20.1



More information about the libcamera-devel mailing list