[libcamera-devel] [PATCH v3 3/8] libcamera: pipeline_handler: Cancel Request on queueing failure
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Sun May 23 19:59:44 CEST 2021
Hi Niklas and Jacopo,
On Sat, May 22, 2021 at 11:30:23AM +0200, Niklas Söderlund wrote:
> On 2021-05-21 17:42:22 +0200, Jacopo Mondi wrote:
> > Capture requests are queued by the PipelineHandler base class to each
> > pipeline handler implementation using the virtual queueRequestDevice()
> > function.
> >
> > However, if the pipeline handler fails to queue the request to the
> > hardware, the request gets silently deleted from the list of queued
> > ones, without notifying application of the error.
> >
> > Reporting to applications that a Request has failed to queue by
> > cancelling and then completing it allows applications to maintain their
> > request-tracking mechanism consistent with the one internal to the library.
>
> I think this touches on a larger issue, PipelineHandler::queueRequest()
> should really return something to the caller about if it succeeded or
> not. We have had similar needs in the past. But that is above the intent
> of this change so,
PipelineHandler::queueRequest() is called asynchronously, so it can't
return an error to Camera::queueRequest(). That's why errors have to be
handled internally.
> Reviewed-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
>
> > Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> > ---
> > src/libcamera/pipeline_handler.cpp | 8 ++++++--
> > 1 file changed, 6 insertions(+), 2 deletions(-)
> >
> > diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp
> > index f41b7a7b3308..e507a8bba8a6 100644
> > --- a/src/libcamera/pipeline_handler.cpp
> > +++ b/src/libcamera/pipeline_handler.cpp
> > @@ -391,6 +391,8 @@ bool PipelineHandler::hasPendingRequests(const Camera *camera) const
> > * This method queues a capture request to the pipeline handler for processing.
> > * The request is first added to the internal list of queued requests, and
> > * then passed to the pipeline handler with a call to queueRequestDevice().
> > + * If the pipeline handler fails in queuing the request to the hardware the
> > + * request is cancelled.
The Cancelled state was meant for requests cancelled when the camera
gets stopped. We may need a different state for errors at runtime. That
will be for another patch series though.
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> > *
> > * Keeping track of queued requests ensures automatic completion of all requests
> > * when the pipeline handler is stopped with stop(). Request completion shall be
> > @@ -409,8 +411,10 @@ void PipelineHandler::queueRequest(Request *request)
> > request->sequence_ = data->requestSequence_++;
> >
> > int ret = queueRequestDevice(camera, request);
> > - if (ret)
> > - data->queuedRequests_.remove(request);
> > + if (ret) {
> > + request->cancel();
> > + completeRequest(request);
> > + }
> > }
> >
> > /**
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list