[libcamera-devel] [PATCH v2 1/8] libcamera: pipeline_handler: Don't index factories by name
Niklas Söderlund
niklas.soderlund at ragnatech.se
Wed Jan 16 13:23:14 CET 2019
Hi Laurent,
On 2019-01-16 02:05:08 +0200, Laurent Pinchart wrote:
> Hi Niklas,
>
> On Tue, Jan 15, 2019 at 11:14:00PM +0100, Niklas Söderlund wrote:
> > On 2019-01-15 17:18:42 +0200, Laurent Pinchart wrote:
> > > Pipeline handler factories are register in a map indexed by their name,
> > > and the list of names is used to expose the factories and look them up.
> > > This is unnecessary cumbersome, we can instead store factories in a
> > > vector and expose it directly. The pipeline factory users will still
> > > have access to the factory names through the factory name() function.
> > >
> > > The PipelineHandlerFactory::create() method becomes so simple that it
> > > can be inlined in its single caller, removing the unneeded usage of the
> > > DeviceEnumerator in the factory.
> > >
> > > Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> > > Reviewed-by: Jacopo Mondi <jacopo at jmondi.org>
> >
> > This patch could have benefited from '--diff-algorithm=patience' :-)
> >
> > Apart from that really nice work!
> >
> > > ---
> > > Changes since v1:
> > >
> > > - ASSERT() factory name uniqueness
> > > ---
> > > src/libcamera/camera_manager.cpp | 22 +++---
> > > src/libcamera/include/pipeline_handler.h | 29 ++++----
> > > src/libcamera/pipeline_handler.cpp | 95 ++++++++----------------
> > > 3 files changed, 57 insertions(+), 89 deletions(-)
>
> [snip]
>
> > > diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp
> > > index 1daada8653e2..08e3291e741a 100644
> > > --- a/src/libcamera/pipeline_handler.cpp
> > > +++ b/src/libcamera/pipeline_handler.cpp
>
> [snip]
>
> > > +void PipelineHandlerFactory::registerType(PipelineHandlerFactory *factory)
> > > {
> > > - std::map<std::string, PipelineHandlerFactory *> &factories = registry();
> > > -
> > > - auto it = factories.find(name);
> > > - if (it == factories.end()) {
> > > - LOG(Error) << "Trying to create non-existing pipeline handler "
> > > - << name;
> > > - return nullptr;
> > > - }
> > > -
> > > - PipelineHandler *pipe = it->second->create();
> > > + std::vector<PipelineHandlerFactory *> &factories = handlers();
> > >
> > > - if (pipe->match(enumerator)) {
> > > - LOG(Debug) << "Pipeline handler \"" << name << "\" matched";
> > > - return pipe;
> > > - }
> > > -
> > > - delete pipe;
> > > - return nullptr;
> > > -}
> > > -
> > > -/**
> > > - * \brief Retrieve the names of all pipeline handlers registered with the
> > > - * factory
> > > - *
> > > - * \return a list of all registered pipeline handler names
> > > - */
> > > -std::vector<std::string> PipelineHandlerFactory::handlers()
> > > -{
> > > - std::map<std::string, PipelineHandlerFactory *> &factories = registry();
> > > - std::vector<std::string> handlers;
> > > + for (PipelineHandlerFactory *f : factories)
> > > + ASSERT(factory->name() != f->name());
> >
> > Is this check needed? The name come from the class name passed to
> > REGISTER_PIPELINE_HANDLER(). If there where to be a duplicated name
> > would we not get a symbol collision at compile time?
>
> We would, unless the classes are put in an anonymous namespace. Do you
> think keeping the check is worth it ?
I think we can drop it. As I think it is possible if one really tries to
create two handlers with the same name anyhow :-P
>
> > With or without this fixed
> >
> > Reviewed-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
> >
> > >
> > > - for (auto const &handler : factories)
> > > - handlers.push_back(handler.first);
> > > + factories.push_back(factory);
> > >
> > > - return handlers;
> > > + LOG(Debug) << "Registered pipeline handler \"" << factory->name() << "\"";
> > > }
>
> [snip]
>
> --
> Regards,
>
> Laurent Pinchart
--
Regards,
Niklas Söderlund
More information about the libcamera-devel
mailing list