[PATCH v1] libcamera: request: Store fence `EventNotifier` directly

Kieran Bingham kieran.bingham at ideasonboard.com
Sun Mar 16 13:22:40 CET 2025


Quoting Barnabás Pőcze (2025-03-10 17:03:35)
> Simplify a bit by storing the `EventNotifier` objects directly in the
> `std::map` instead of wrapping them in unique_ptr. An other advantage
> is that it removes one allocation per fence.

This one sounds good, and doesn't impact public API/ABI as far as I can
tell:


Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>

> 
> Signed-off-by: Barnabás Pőcze <barnabas.pocze at ideasonboard.com>
> ---
>  include/libcamera/internal/request.h |  2 +-
>  src/libcamera/request.cpp            | 13 +++++--------
>  2 files changed, 6 insertions(+), 9 deletions(-)
> 
> diff --git a/include/libcamera/internal/request.h b/include/libcamera/internal/request.h
> index 73e9bb5cc..78cb99f36 100644
> --- a/include/libcamera/internal/request.h
> +++ b/include/libcamera/internal/request.h
> @@ -59,7 +59,7 @@ private:
>         bool prepared_ = false;
>  
>         std::unordered_set<FrameBuffer *> pending_;
> -       std::map<FrameBuffer *, std::unique_ptr<EventNotifier>> notifiers_;
> +       std::map<FrameBuffer *, EventNotifier> notifiers_;
>         std::unique_ptr<Timer> timer_;
>  };
>  
> diff --git a/src/libcamera/request.cpp b/src/libcamera/request.cpp
> index b206ac132..6fa1801a0 100644
> --- a/src/libcamera/request.cpp
> +++ b/src/libcamera/request.cpp
> @@ -228,15 +228,12 @@ void Request::Private::prepare(std::chrono::milliseconds timeout)
>                 if (!fence)
>                         continue;
>  
> -               std::unique_ptr<EventNotifier> notifier =
> -                       std::make_unique<EventNotifier>(fence->fd().get(),
> -                                                       EventNotifier::Read);
> +               auto [it, inserted] = notifiers_.try_emplace(buffer, fence->fd().get(), EventNotifier::Type::Read);
> +               ASSERT(inserted);
>  
> -               notifier->activated.connect(this, [this, buffer] {
> -                                                       notifierActivated(buffer);
> -                                           });
> -
> -               notifiers_[buffer] = std::move(notifier);
> +               it->second.activated.connect(this, [this, buffer] {
> +                       notifierActivated(buffer);
> +               });
>         }
>  
>         if (notifiers_.empty()) {
> -- 
> 2.48.1
>


More information about the libcamera-devel mailing list