[libcamera-devel] [RFC v3 1/5] HACK: Camera public destructor
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Thu Dec 9 11:53:03 CET 2021
Hi Kieran,
On Thu, Dec 09, 2021 at 10:34:51AM +0000, Kieran Bingham wrote:
> Quoting Tomi Valkeinen (2021-12-09 10:22:16)
> > On 09/12/2021 12:05, Kieran Bingham wrote:
> > > Quoting Tomi Valkeinen (2021-12-09 09:29:02)
> > >> pybind11 needs a public destructor for Camera to be able to manage the
> > >> shared_ptr. It's not clear why this is needed, and can it be fixed in
> > >> pybind11.
> > >
> > > :-( The 'HACK' here seems to be the only thing that would count as a
> > > blocker to integration.
> > >
> > > I wonder if this is really a HACK or if we just need to explain that the
> > > destructor needs to be public to support the python bindings, but I
> > > myself don't understand the reasoning itself.
> > >
> > > Is the python code the only instance where we create a shared_ptr for
> > > the Camera? If that's true - then perhaps this patch should actually be
> > > squashed with the one that returns the Camera as a shared_ptr...
> >
> > This is not related to the patch 2.
> >
> > pybind11 needs a holder type that is used to manage the references to
> > the C++ instances. By default it's unique_ptr, but can be defined. We
> > use shared_ptr for many classes
> > (https://pybind11.readthedocs.io/en/stable/advanced/smart_ptrs.html?highlight=shared_ptr#std-shared-ptr).
> >
> > I think normally it makes sense that the destructor must be public: if
> > pybind11 wrapper code can create the instances, it can also destruct
> > them. Here we don't create Cameras, nor destruct them, but the related
> > code is still created, causing the build error.
> >
> > I believe it should be possible to fix this in pybind11, by making the
> > template code to detect these kind of classes and skip the destructor
> > code. Maybe. Somehow. I have no idea how =).
>
> But how could a shared_ptr skip calling the destructor? Isn't the
> purpose of a shared_ptr to keep the object 'alive' until the last user
> is removed? Therefore the shared_ptr has to be able to destruct the
> object?
>
> Is there some magic that means the destructor can still be private for a
> shared_ptr in that instance?
>
> A quick google on shared_ptr private destructor brings up:
> https://stackoverflow.com/a/8202667
>
> Saying it can be solved by making a custom deleter for the shared
> pointer. Is that what we're missing perhaps?
We already have a deleter, see Camera::create().
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list