[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