[libcamera-devel] [PATCH] android: camera_worker: Process all queued requests when stopping

Hirokazu Honda hiroh at chromium.org
Mon May 24 13:09:23 CEST 2021


Hi Laurent,

On Mon, May 24, 2021 at 6:32 PM Jacopo Mondi <jacopo at jmondi.org> wrote:

> Hi Laurent,
>
> On Sun, May 23, 2021 at 05:33:42AM +0300, Laurent Pinchart wrote:
> > When stopping the camera worker, queuedRequest() calls may have queued
> > asynchronous function invocation messages to the worker thread, and some
> > of those messages may not have been processed yet. The messages will
> > stay in the thread's queue until the camera worker is restarted (when
> > the camera service will start a new capture session). At that point,
> > they will be dispatched, which will cause a crash due to the
> > CaptureRequest passed to processRequest() having been deleted by
> > CameraDevice::stop() calling descriptors_.clear().
> >
> > Fix this by forcing dispatching of all function invocation messages when
> > stopping the camera worker thread. Note that this is inherently racy, as
> > more queueRequest() calls may arrive from the camera service while we're
> > stopping. This race condition will be addressed by a subsequent patch
> > series.
> >
> > Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
>

It looks working as far as I tested.

Tested-by: Hirokazu Honda <hiroh at chromium.org>


> > ---
> > I haven't tested this patch, as I'm currently rebuilding a new Soraka
> > image. Hiro, could you give it a try to see if it fixes the problem
> > you've reported ?
> > ---
> >  src/android/camera_worker.cpp | 14 ++++++++++----
> >  src/android/camera_worker.h   |  6 ++++--
> >  2 files changed, 14 insertions(+), 6 deletions(-)
> >
> > diff --git a/src/android/camera_worker.cpp
> b/src/android/camera_worker.cpp
> > index 300ddde03645..9f727826e23f 100644
> > --- a/src/android/camera_worker.cpp
> > +++ b/src/android/camera_worker.cpp
> > @@ -52,18 +52,24 @@ void CaptureRequest::queue()
> >   */
> >  CameraWorker::CameraWorker()
> >  {
> > -     worker_.moveToThread(&thread_);
> > +     worker_.moveToThread(this);
> >  }
> >
> >  void CameraWorker::start()
> >  {
> > -     thread_.start();
> > +     Thread::start();
> >  }
> >
> >  void CameraWorker::stop()
> >  {
> > -     thread_.exit();
> > -     thread_.wait();
> > +     exit();
> > +     wait();
> > +}
> > +
> > +void CameraWorker::run()
> > +{
> > +     exec();
> > +     dispatchMessages(Message::Type::InvokeMessage);
> >  }
> >
> >  void CameraWorker::queueRequest(CaptureRequest *request)
> > diff --git a/src/android/camera_worker.h b/src/android/camera_worker.h
> > index 64b1658b61b4..e289ef9b8655 100644
> > --- a/src/android/camera_worker.h
> > +++ b/src/android/camera_worker.h
> > @@ -42,7 +42,7 @@ private:
> >       std::unique_ptr<libcamera::Request> request_;
> >  };
> >
> > -class CameraWorker
> > +class CameraWorker : private libcamera::Thread
>
> There is one thing I don't get here
>
> Now the whole CameraWorker runs in it own thread.
> Before this change CameraWorker had a Worker that was run a separate
> thread.
>
> CameraDevice calls CameraWorker::queueRequest, which runs on a
> different thread.
>
> CameraWorker::queueRequest
>
>         void CameraWorker::queueRequest(CaptureRequest *request)
>         {
>                 /* Async process the request on the worker which runs its
> own thread. */
>                 worker_.invokeMethod(&Worker::processRequest,
> ConnectionTypeQueued,
>                                      request);
>         }
>
> 1) How does direct method calls on CameraWorker work now that it's a
> Thread
> 2) If 1) is ok, then queueRequest should not need to call invokeMethod
> on worker_ as it runs in the same thread CameraWorker itself.
>
> Would it be possible to keep CameraWorker a simple class and make
> Worker a thread ?
>
> Thanks
>    j
>
> >  {
> >  public:
> >       CameraWorker();
> > @@ -52,6 +52,9 @@ public:
> >
> >       void queueRequest(CaptureRequest *request);
> >
> > +protected:
> > +     void run() override;
> > +
> >  private:
> >       class Worker : public libcamera::Object
> >       {
> > @@ -63,7 +66,6 @@ private:
> >       };
> >
> >       Worker worker_;
> > -     libcamera::Thread thread_;
> >  };
> >
> >  #endif /* __ANDROID_CAMERA_WORKER_H__ */
> > --
> > Regards,
> >
> > Laurent Pinchart
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.libcamera.org/pipermail/libcamera-devel/attachments/20210524/1890f856/attachment.htm>


More information about the libcamera-devel mailing list