[PATCH v1] libcamera: request: addBuffer(): Do fence check earlier

Barnabás Pőcze pobrn at protonmail.com
Mon Jan 20 15:16:59 CET 2025


Check if the buffer has a fence before making any modifications because
otherwise it is possible for `Request::addBuffer()` to return an error code
while at the same time the buffer - for all intents and purposes - is added
to the request.

Signed-off-by: Barnabás Pőcze <pobrn at protonmail.com>
---
 src/libcamera/request.cpp | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/src/libcamera/request.cpp b/src/libcamera/request.cpp
index 5cfafea89..e7eb1c0c8 100644
--- a/src/libcamera/request.cpp
+++ b/src/libcamera/request.cpp
@@ -466,6 +466,15 @@ int Request::addBuffer(const Stream *stream, FrameBuffer *buffer,
 		return -EINVAL;
 	}
 
+	/*
+	 * Make sure the fence has been extracted from the buffer
+	 * to avoid waiting on a stale fence.
+	 */
+	if (buffer->_d()->fence()) {
+		LOG(Request, Error) << "Can't add buffer that still references a fence";
+		return -EEXIST;
+	}
+
 	auto it = bufferMap_.find(stream);
 	if (it != bufferMap_.end()) {
 		LOG(Request, Error) << "FrameBuffer already set for stream";
@@ -476,15 +485,6 @@ int Request::addBuffer(const Stream *stream, FrameBuffer *buffer,
 	_d()->pending_.insert(buffer);
 	bufferMap_[stream] = buffer;
 
-	/*
-	 * Make sure the fence has been extracted from the buffer
-	 * to avoid waiting on a stale fence.
-	 */
-	if (buffer->_d()->fence()) {
-		LOG(Request, Error) << "Can't add buffer that still references a fence";
-		return -EEXIST;
-	}
-
 	if (fence && fence->isValid())
 		buffer->_d()->setFence(std::move(fence));
 
-- 
2.48.1




More information about the libcamera-devel mailing list