[PATCH 1/1] libcamera: Add mailbox template helper
Barnabás Pőcze
pobrn at protonmail.com
Tue Oct 1 20:34:58 CEST 2024
Hi
2024. október 1., kedd 10:10 keltezéssel, Harvey Yang <chenghaoyang at chromium.org> írta:
> From: Han-Lin Chen <hanlinchen at chromium.org>
>
> MailBox is designed to be used to shares data, usually a frame buffer, among
^
share
> tasks. A Mailbox can store a data which the producer task should set into,
^
MailBox
> and multiple consumer tasks could read the data from it. The data could
> be set only once, i.e., there should be only one producer. All tasks shares
^
share
> the Mailbox with share_ptr and the data it contains should be recycled when
^ ^
MailBox shared_ptr
> all tasks are finished.
>
> Signed-off-by: Hanlin Chen <hanlinchen at google.com>
> Co-developed-by: Harvey Yang <chenghaoyang at chromium.org>
> ---
> include/libcamera/internal/mailbox.h | 50 +++++++++++++
> include/libcamera/internal/meson.build | 1 +
> src/libcamera/mailbox.cpp | 97 ++++++++++++++++++++++++++
> src/libcamera/meson.build | 1 +
> 4 files changed, 149 insertions(+)
> create mode 100644 include/libcamera/internal/mailbox.h
> create mode 100644 src/libcamera/mailbox.cpp
>
> diff --git a/include/libcamera/internal/mailbox.h b/include/libcamera/internal/mailbox.h
> new file mode 100644
> index 00000000..fb27f5bb
> --- /dev/null
> +++ b/include/libcamera/internal/mailbox.h
> @@ -0,0 +1,50 @@
> +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> +/*
> + * Copyright (C) 2024, Google Inc.
> + *
> + * mailbox.h - Template class for generic mailbox
> + */
> +
> +#pragma once
> +
> +#include <functional>
> +#include <memory>
> +#include <vector>
> +
> +namespace libcamera {
> +
> +template<class T>
> +class MailBox
> +{
> +public:
> + using Recycler = std::function<void(T &)>;
> +
> + MailBox()
> + : valid_(false) {}
> + ~MailBox();
> +
> + void put(const T &item, Recycler recycler);
> +
> + const T &get();
> +
> + bool valid() { return valid_; }
> +
> +private:
> + T item_;
> + bool valid_;
> + std::function<void(T &)> recycler_;
> +};
> +
> +template<class T>
> +using SharedMailBox = std::shared_ptr<MailBox<T>>;
> +
> +template<class T>
> +SharedMailBox<T> makeMailBox()
> +{
> + return std::make_shared<MailBox<T>>();
> +}
> +
> +template<class T>
> +std::vector<SharedMailBox<T>> makeMailBoxVector(const unsigned int count);
You have to put the definitions of templates in the header file, otherwise it won't work.
Also, this whole concept looks to me to be very similar to a `const std::shared_ptr<T>`
with a custom deleter (with the difference that you can only obtain a `const` reference
here unlike with an `std::shared_ptr`). So I am wondering if utilizing `std::shared_ptr`
with a custom deleter has been explored already.
I am also wondering if it wouldn't make more sense to remove `MailBox::put()`
and just have the two constructors taking `const T&` and `T&&`, and initializing
`item_`. This would do away with the need for the `valid_` member. Is there a
planned use case where that is not sufficient?
Regards,
Barnabás Pőcze
> +
> +} /* namespace libcamera */
> [...]
More information about the libcamera-devel
mailing list