[libcamera-devel] [PATCH] qcam: Fix camera reference leak on hot-unplug
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Mon Jul 27 17:50:34 CEST 2020
Hi Umang,
On Mon, Jul 27, 2020 at 03:38:00PM +0000, Umang Jain wrote:
> On 7/27/20 8:35 PM, Laurent Pinchart wrote:
> > On Mon, Jul 27, 2020 at 12:32:59PM +0000, Umang Jain wrote:
> >> If the currently streaming camera is hot-unplugged,
> >> a camera reference was still held by MainWindow::camera_,
> >> preventing it to be destructed, until qcam window is
> >> closed. Plug the leak in the hot-unplug handler itself.
> >>
> >> Signed-off-by: Umang Jain <email at uajain.com>
> >
> > Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> >
> > Does this fix all the shared pointer refcount issues you've been chasing
> > ?
>
> The refcount issues are sorted here. I spent extensive time on it (both for hotplug
> and un-plug refcount).
>
> However, the other issue I am chasing (earlier believed was caused by refcount issue)
> is still present - which primarily deals with event loop and how event-notifiers are processed.
>
> I can still trigger ASSERT(iter != notifiers_.end()); in EventDispatcherPoll::processNotifiers(),
> on hot-unplugging a currently streaming camera. This is probably due to the fact that, when
> destroying a Camera object, it always destroys V4L2VideoDevice() - which in turn, "delete"s
> two EventNotifiers in it's destructor() and then processNotifiers() isn't aware about the deletion
> and still trying to find a EventNotifier with concerned pollfd and fails :-(
The issue is that the camera object is meant to be destroyed in the
thread it belongs to, as explained in a previous e-mail (see [1]). Is
that something you can try fixing, with the pointers in that e-mail, or
would you like to discuss it further first ?
[1] https://lists.libcamera.org/pipermail/libcamera-devel/2020-July/010951.html
> >> ---
> >> src/qcam/main_window.cpp | 2 ++
> >> 1 file changed, 2 insertions(+)
> >>
> >> diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp
> >> index 7bc1360..c8298ec 100644
> >> --- a/src/qcam/main_window.cpp
> >> +++ b/src/qcam/main_window.cpp
> >> @@ -587,6 +587,8 @@ void MainWindow::processHotplug(HotplugEvent *e)
> >> /* Check if the currently-streaming camera is removed. */
> >> if (camera == camera_.get()) {
> >> toggleCapture(false);
> >> + camera_->release();
> >> + camera_.reset();
> >> cameraCombo_->setCurrentIndex(0);
> >> }
> >>
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list