[libcamera-devel] [PATCH v2 2/2] libcamera: pipeline_handler: Make lock() and unlock() thread-safe

Laurent Pinchart laurent.pinchart at ideasonboard.com
Mon Dec 27 00:12:55 CET 2021


The PipelineHandler lock() and unlock() functions are documented as
thread-safe, but they're not. Fix them using a mutex.

Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
---
Changes since v1:

- Add thread safety annotation
- Comment that lockOwner_ does not indicate ownership of lock_
---
 include/libcamera/internal/pipeline_handler.h | 4 +++-
 src/libcamera/pipeline_handler.cpp            | 5 +++++
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h
index a7331cedfb16..e5b8ffb4db3d 100644
--- a/include/libcamera/internal/pipeline_handler.h
+++ b/include/libcamera/internal/pipeline_handler.h
@@ -14,6 +14,7 @@
 #include <sys/types.h>
 #include <vector>
 
+#include <libcamera/base/mutex.h>
 #include <libcamera/base/object.h>
 
 #include <libcamera/controls.h>
@@ -88,7 +89,8 @@ private:
 
 	const char *name_;
 
-	bool lockOwner_;
+	Mutex lock_;
+	bool lockOwner_ LIBCAMERA_TSA_GUARDED_BY(lock_); /* *Not* ownership of lock_ */
 
 	friend class PipelineHandlerFactory;
 };
diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp
index a9241ac62979..03e4b9e66aa6 100644
--- a/src/libcamera/pipeline_handler.cpp
+++ b/src/libcamera/pipeline_handler.cpp
@@ -11,6 +11,7 @@
 #include <sys/sysmacros.h>
 
 #include <libcamera/base/log.h>
+#include <libcamera/base/mutex.h>
 #include <libcamera/base/utils.h>
 
 #include <libcamera/camera.h>
@@ -155,6 +156,8 @@ MediaDevice *PipelineHandler::acquireMediaDevice(DeviceEnumerator *enumerator,
  */
 bool PipelineHandler::lock()
 {
+	MutexLocker locker(lock_);
+
 	/* Do not allow nested locking in the same libcamera instance. */
 	if (lockOwner_)
 		return false;
@@ -183,6 +186,8 @@ bool PipelineHandler::lock()
  */
 void PipelineHandler::unlock()
 {
+	MutexLocker locker(lock_);
+
 	if (!lockOwner_)
 		return;
 
-- 
Regards,

Laurent Pinchart



More information about the libcamera-devel mailing list