From 9c49106b9709da130d81bff913db8ce2daecd9b6 Mon Sep 17 00:00:00 2001 From: Nicolas Dufresne Date: Thu, 26 Aug 2021 09:23:45 -0400 Subject: gstreamer: Fix concurrent access issues to CameraManager It's not allowed to have multiple instances of CameraManager. This requirement is not easy for GStreamer were the device monitor and the camerasrc, or two camerasrc instances don't usually have any interaction between each other. Fix this by implementing a minimalist singleton around CameraManager constructor and start()/stop() operations. Signed-off-by: Nicolas Dufresne Reviewed-by: Laurent Pinchart Tested-by: Kieran Bingham Signed-off-by: Laurent Pinchart --- src/gstreamer/gstlibcamera-utils.cpp | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'src/gstreamer/gstlibcamera-utils.cpp') diff --git a/src/gstreamer/gstlibcamera-utils.cpp b/src/gstreamer/gstlibcamera-utils.cpp index 61370d5f..f7e0e1c8 100644 --- a/src/gstreamer/gstlibcamera-utils.cpp +++ b/src/gstreamer/gstlibcamera-utils.cpp @@ -178,3 +178,27 @@ gst_libcamera_resume_task(GstTask *task) GST_TASK_SIGNAL(task); } } + +G_LOCK_DEFINE_STATIC(cm_singleton_lock); +std::weak_ptr cm_singleton_ptr; + +std::shared_ptr +gst_libcamera_get_camera_mananger(int &ret) +{ + std::shared_ptr cm; + + G_LOCK(cm_singleton_lock); + + cm = cm_singleton_ptr.lock(); + if (!cm) { + cm = std::make_shared(); + cm_singleton_ptr = cm; + ret = cm->start(); + } else { + ret = 0; + } + + G_UNLOCK(cm_singleton_lock); + + return cm; +} -- cgit v1.2.1