[libcamera-devel] [PATCH v2 02/12] libcamera: fence: Introduce Fence
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Sun Nov 21 17:51:52 CET 2021
Hi Jacopo,
Thank you for the patch.
On Sat, Nov 20, 2021 at 12:13:03PM +0100, Jacopo Mondi wrote:
> 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>
You could use a forward declaration for FileDescriptor.
> +
> +namespace libcamera {
> +
> +class Fence : public Extensible
> +{
> + LIBCAMERA_DECLARE_PRIVATE()
> +
> +public:
> + Fence(const FileDescriptor &fd);
> +
> + bool isValid() const;
> + const FileDescriptor &fd();
> +
> + void close();
This function is only used in test/fence.cpp.
> +
> +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_; }
These two functions are only used by the Fence class. You can drop them
and access fd_ directly there. As a general rule, given that the
Extensible public class and the Private class are friends of each other,
we only need a public API in the Private class when used by other
classes internally in libcamera.
> + 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
We need more documentation here, to explain what fences are about, how
they're used, ...
> + *
> + * \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
Indeed :-) Same for the functions below.
> + */
> +
> +/**
> + * \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()
As we'll likely drop the Private accessors we won't need copydoc, but if
we didn't, I'd document the public API in full, and copy the
documentation to the Private class.
> + */
> +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',
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list