[libcamera-devel] [PATCH v5 2/7] libcamera: camera: Propagate freeBuffers() error

Jacopo Mondi jacopo at jmondi.org
Tue Apr 16 14:52:08 CEST 2019


Hi,

On Tue, Apr 16, 2019 at 01:55:27PM +0300, Laurent Pinchart wrote:
> Hello,
>
> On Tue, Apr 16, 2019 at 01:43:28AM +0200, Niklas Söderlund wrote:
> > On 2019-04-16 01:18:54 +0200, Jacopo Mondi wrote:
> > > The error return code of PipelineHandler::freeBuffers() was not
> > > propagate up to applications by the Camera class. Fix this by returning
> > > the incremental error accumulated by multiple calls (one per Stream)
> > > to freeBuffers().
> > >
> > > Do not return the error code of the call to freeBuffers() in the
> > > allocateBuffers() method error path not to overwrite the original error
> > > code returned from the allocation method.
> > >
> > > Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> > > ---
> > >  src/libcamera/camera.cpp | 6 ++++--
> > >  1 file changed, 4 insertions(+), 2 deletions(-)
> > >
> > > diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp
> > > index bdf14b31d8ee..7f2dc904df16 100644
> > > --- a/src/libcamera/camera.cpp
> > > +++ b/src/libcamera/camera.cpp
> > > @@ -671,6 +671,8 @@ int Camera::allocateBuffers()
> > >   */
> > >  int Camera::freeBuffers()
> > >  {
> > > +	int ret = 0;
> > > +
> > >  	if (!stateIs(CameraPrepared))
> > >  		return -EACCES;
> > >
> > > @@ -683,12 +685,12 @@ int Camera::freeBuffers()
> > >  		 * by the V4L2 device that has allocated them.
> > >  		 */
> > >  		stream->bufferPool().destroyBuffers();
> > > -		pipe_->freeBuffers(this, stream);
> > > +		ret |= pipe_->freeBuffers(this, stream);
> >
> > Or:ing in errors here seems very strange as we are dealing with the
> > standard error codes (EINVAL, EBUSY, etc). Would it not be saner to
> > store and return the (potential) first error while still running
> > freeBuffers() for all streams before returning?
> >
> > How about something like this
> >
> >     int ret = 0;
> >
> >     for (Stream *stream : activeStreams_) {
> >         int status = pipe_->freeBuffers(this, stream);
> >
> >         if (!ret)
> >             ret = status;
> >     }
> >
> >     return ret;
>
> Or maybe merging this on top of the patch that refactors buffer
> allocation ? The loop will then be gone.
>

Ah! so you would like to have it like it was in v4? It made more sense
to me as well, I think I've been asked to split it, so I did.


> > >  	}
> > >
> > >  	state_ = CameraConfigured;
> > >
> > > -	return 0;
> > > +	return ret;
> > >  }
> > >
> > >  /**
>
> --
> Regards,
>
> Laurent Pinchart
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://lists.libcamera.org/pipermail/libcamera-devel/attachments/20190416/14adf464/attachment.sig>


More information about the libcamera-devel mailing list