summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2021-08-29 21:03:23 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2022-01-03 15:31:14 +0200
commitec6921d7f7ef70cd7c5ea3d7a20082d66b8aa6e5 (patch)
tree744fd998a9381101737bb1bd52cb2449e0f1448d
parent46b32fa0e48aed16778c6e8d324d65473fbd06b7 (diff)
libcamera: media_device: Move recursive lock handling to pipeline handler
The MediaDevice lock is meant to prevent concurrent usage of multiple cameras from the same pipeline handlers. As media devices are acquired by pipeline handlers, we can't have multiple pipeline handlers trying to lock the same media device. The recursive locking detection can thus be moved to the pipeline handler. This simplifies the media device implementation that now implements true lock semantics, and prepares for support of concurrent camera usage. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>
-rw-r--r--include/libcamera/internal/media_device.h1
-rw-r--r--include/libcamera/internal/pipeline_handler.h2
-rw-r--r--src/libcamera/media_device.cpp14
-rw-r--r--src/libcamera/pipeline_handler.cpp13
4 files changed, 15 insertions, 15 deletions
diff --git a/include/libcamera/internal/media_device.h b/include/libcamera/internal/media_device.h
index af0b25b7..6e2a63f3 100644
--- a/include/libcamera/internal/media_device.h
+++ b/include/libcamera/internal/media_device.h
@@ -86,7 +86,6 @@ private:
UniqueFD fd_;
bool valid_;
bool acquired_;
- bool lockOwner_;
std::map<unsigned int, MediaObject *> objects_;
std::vector<MediaEntity *> entities_;
diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h
index ec986a51..a7331ced 100644
--- a/include/libcamera/internal/pipeline_handler.h
+++ b/include/libcamera/internal/pipeline_handler.h
@@ -88,6 +88,8 @@ private:
const char *name_;
+ bool lockOwner_;
+
friend class PipelineHandlerFactory;
};
diff --git a/src/libcamera/media_device.cpp b/src/libcamera/media_device.cpp
index 0b794018..941f86c2 100644
--- a/src/libcamera/media_device.cpp
+++ b/src/libcamera/media_device.cpp
@@ -63,8 +63,7 @@ LOG_DEFINE_CATEGORY(MediaDevice)
* populate() before the media graph can be queried.
*/
MediaDevice::MediaDevice(const std::string &deviceNode)
- : deviceNode_(deviceNode), valid_(false), acquired_(false),
- lockOwner_(false)
+ : deviceNode_(deviceNode), valid_(false), acquired_(false)
{
}
@@ -145,15 +144,9 @@ bool MediaDevice::lock()
if (!fd_.isValid())
return false;
- /* Do not allow nested locking in the same libcamera instance. */
- if (lockOwner_)
- return false;
-
if (lockf(fd_.get(), F_TLOCK, 0))
return false;
- lockOwner_ = true;
-
return true;
}
@@ -171,11 +164,6 @@ void MediaDevice::unlock()
if (!fd_.isValid())
return;
- if (!lockOwner_)
- return;
-
- lockOwner_ = false;
-
lockf(fd_.get(), F_ULOCK, 0);
}
diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp
index 0bc0e341..a9241ac6 100644
--- a/src/libcamera/pipeline_handler.cpp
+++ b/src/libcamera/pipeline_handler.cpp
@@ -67,7 +67,7 @@ LOG_DEFINE_CATEGORY(Pipeline)
* respective factories.
*/
PipelineHandler::PipelineHandler(CameraManager *manager)
- : manager_(manager)
+ : manager_(manager), lockOwner_(false)
{
}
@@ -155,6 +155,10 @@ MediaDevice *PipelineHandler::acquireMediaDevice(DeviceEnumerator *enumerator,
*/
bool PipelineHandler::lock()
{
+ /* Do not allow nested locking in the same libcamera instance. */
+ if (lockOwner_)
+ return false;
+
for (std::shared_ptr<MediaDevice> &media : mediaDevices_) {
if (!media->lock()) {
unlock();
@@ -162,6 +166,8 @@ bool PipelineHandler::lock()
}
}
+ lockOwner_ = true;
+
return true;
}
@@ -177,8 +183,13 @@ bool PipelineHandler::lock()
*/
void PipelineHandler::unlock()
{
+ if (!lockOwner_)
+ return;
+
for (std::shared_ptr<MediaDevice> &media : mediaDevices_)
media->unlock();
+
+ lockOwner_ = false;
}
/**