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 <nicolas.dufresne@collabora.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Tested-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Nicolas Dufresne 2021-08-26 09:23:45 -04:00 committed by Laurent Pinchart
parent 1ca5513396
commit 9c49106b97
4 changed files with 35 additions and 28 deletions

View file

@ -178,3 +178,27 @@ gst_libcamera_resume_task(GstTask *task)
GST_TASK_SIGNAL(task);
}
}
G_LOCK_DEFINE_STATIC(cm_singleton_lock);
std::weak_ptr<CameraManager> cm_singleton_ptr;
std::shared_ptr<CameraManager>
gst_libcamera_get_camera_mananger(int &ret)
{
std::shared_ptr<CameraManager> cm;
G_LOCK(cm_singleton_lock);
cm = cm_singleton_ptr.lock();
if (!cm) {
cm = std::make_shared<CameraManager>();
cm_singleton_ptr = cm;
ret = cm->start();
} else {
ret = 0;
}
G_UNLOCK(cm_singleton_lock);
return cm;
}