[libcamera-devel] [PATCH v2 02/12] libcamera: fence: Introduce Fence
Jacopo Mondi
jacopo at jmondi.org
Sat Nov 20 12:13:03 CET 2021
Introduce a Fence class which models a synchronization primitive that
allows to notify the availability of a resource.
The Fence is modeled as a wrapper of a FileDescriptor instance where
read events are used to signal the Fence. The class can be later
extended to support additional signalling mechanisms.
Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
---
include/libcamera/fence.h | 36 +++++++++
include/libcamera/internal/fence.h | 37 +++++++++
include/libcamera/internal/meson.build | 1 +
include/libcamera/meson.build | 1 +
src/libcamera/fence.cpp | 104 +++++++++++++++++++++++++
src/libcamera/meson.build | 1 +
6 files changed, 180 insertions(+)
create mode 100644 include/libcamera/fence.h
create mode 100644 include/libcamera/internal/fence.h
create mode 100644 src/libcamera/fence.cpp
diff --git a/include/libcamera/fence.h b/include/libcamera/fence.h
new file mode 100644
index 000000000000..5ae0ff6208d7
--- /dev/null
+++ b/include/libcamera/fence.h
@@ -0,0 +1,36 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2021, Google Inc.
+ *
+ * internal/fence.h - Synchronization fence
+ */
+#ifndef __LIBCAMERA_FENCE_H__
+#define __LIBCAMERA_FENCE_H__
+
+#include <memory>
+
+#include <libcamera/base/class.h>
+
+#include <libcamera/file_descriptor.h>
+
+namespace libcamera {
+
+class Fence : public Extensible
+{
+ LIBCAMERA_DECLARE_PRIVATE()
+
+public:
+ Fence(const FileDescriptor &fd);
+
+ bool isValid() const;
+ const FileDescriptor &fd();
+
+ void close();
+
+private:
+ LIBCAMERA_DISABLE_COPY_AND_MOVE(Fence)
+};
+
+} /* namespace libcamera */
+
+#endif /* __LIBCAMERA_FENCE_H__ */
diff --git a/include/libcamera/internal/fence.h b/include/libcamera/internal/fence.h
new file mode 100644
index 000000000000..5f03c0804d44
--- /dev/null
+++ b/include/libcamera/internal/fence.h
@@ -0,0 +1,37 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2021, Google Inc.
+ *
+ * internal/fence.h - Internal synchronization fence
+ */
+#ifndef __LIBCAMERA_INTERNAL_FENCE_H__
+#define __LIBCAMERA_INTERNAL_FENCE_H__
+
+#include <memory>
+
+#include <libcamera/base/class.h>
+#include <libcamera/base/event_notifier.h>
+
+#include <libcamera/fence.h>
+#include <libcamera/file_descriptor.h>
+
+namespace libcamera {
+
+class Fence::Private : public Extensible::Private
+{
+ LIBCAMERA_DECLARE_PUBLIC(Fence)
+
+public:
+ Private(const FileDescriptor &fd);
+
+ bool isValid() const { return fd_.isValid(); }
+ const FileDescriptor &fd() { return fd_; }
+ void close();
+
+private:
+ FileDescriptor fd_;
+};
+
+} /* namespace libcamera */
+
+#endif /* __LIBCAMERA_INTERNAL_FENCE_H__ */
diff --git a/include/libcamera/internal/meson.build b/include/libcamera/internal/meson.build
index cae65b0604ff..32d5c3387de3 100644
--- a/include/libcamera/internal/meson.build
+++ b/include/libcamera/internal/meson.build
@@ -22,6 +22,7 @@ libcamera_internal_headers = files([
'device_enumerator.h',
'device_enumerator_sysfs.h',
'device_enumerator_udev.h',
+ 'fence.h',
'formats.h',
'framebuffer.h',
'ipa_manager.h',
diff --git a/include/libcamera/meson.build b/include/libcamera/meson.build
index 7155ff203f6e..3721feb1ec92 100644
--- a/include/libcamera/meson.build
+++ b/include/libcamera/meson.build
@@ -7,6 +7,7 @@ libcamera_public_headers = files([
'camera_manager.h',
'compiler.h',
'controls.h',
+ 'fence.h',
'file_descriptor.h',
'framebuffer.h',
'framebuffer_allocator.h',
diff --git a/src/libcamera/fence.cpp b/src/libcamera/fence.cpp
new file mode 100644
index 000000000000..9ad86b3fa115
--- /dev/null
+++ b/src/libcamera/fence.cpp
@@ -0,0 +1,104 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2021, Google Inc.
+ *
+ * fence.cpp - Synchronization fence
+ */
+
+#include "libcamera/internal/fence.h"
+
+#include <libcamera/base/log.h>
+#include <libcamera/base/thread.h>
+
+namespace libcamera {
+
+/**
+ *
+ * \file libcamera/fence.h
+ * \brief Synchronization fence
+ *
+ * \file internal/fence.h
+ * \brief Internal synchronization fence representation
+ */
+
+/**
+ * \class Fence::Private
+ * \brief Private synchronization Fence implementation
+ */
+
+/**
+ * \brief Construct a Fence::Private
+ * \param[in] fd The filedescriptor owned by the Fence
+ */
+Fence::Private::Private(const FileDescriptor &fd)
+ : fd_(std::move(fd))
+{
+}
+
+/**
+ * \fn Fence::Private::isValid()
+ * \brief Retrieve if a Fence is valid
+ *
+ * A Fence is valid if the FileDescriptor it wraps is valid
+ *
+ * \return True if the Fence is valid, false otherwise
+ */
+
+/**
+ * \fn Fence::Private::fd()
+ * \brief Retrieve a refernce to the FileDescriptor wrapped by this Fence
+ *
+ * \todo Document how to extract the FileDescriptor in case the Fence has failed
+ *
+ * \return A reference to the FileDescriptor this Fence wraps
+ */
+
+/**
+ * \brief Close the Fence by releasing the wrapped FileDescriptor
+ */
+void Fence::Private::close()
+{
+ fd_ = FileDescriptor();
+}
+
+/**
+ * \class Fence
+ * \brief Synchronization fence class
+ *
+ * \todo Documentation
+ */
+
+/**
+ * \brief Create a synchronization fence
+ * \param[in] fd The synchronization fence file descriptor
+ */
+Fence::Fence(const FileDescriptor &fd)
+ : Extensible(std::make_unique<Private>(fd))
+{
+}
+
+/**
+ * \copydoc Fence::Private::isValid()
+ */
+bool Fence::isValid() const
+{
+ return _d()->isValid();
+}
+
+/**
+ * \copydoc Fence::Private::fd()
+ */
+const FileDescriptor &Fence::fd()
+{
+ return _d()->fd();
+}
+
+/**
+ * \copydoc Fence::Private::close()
+ */
+void Fence::close()
+{
+ _d()->close();
+}
+
+} /* namespace libcamera */
diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build
index 6727a777d804..6fb0d5f49b63 100644
--- a/src/libcamera/meson.build
+++ b/src/libcamera/meson.build
@@ -14,6 +14,7 @@ libcamera_sources = files([
'delayed_controls.cpp',
'device_enumerator.cpp',
'device_enumerator_sysfs.cpp',
+ 'fence.cpp',
'file_descriptor.cpp',
'formats.cpp',
'framebuffer.cpp',
--
2.33.1
More information about the libcamera-devel
mailing list