[libcamera-devel] [PATCH v4 6/6] libcamera: request: Make it extensible
Jean-Michel Hautbois
jeanmichel.hautbois at ideasonboard.com
Tue Apr 20 19:31:10 CEST 2021
Hi Kieran,
Thanks for the patch !
On 20/04/2021 15:07, Kieran Bingham wrote:
> Provide an extensible private object for the Request class.
> This allows us to make modifications to the private API and storage of
> requests without affecting the public API or ABI.
>
> The D pointer is obtained in all Request functions implemented in the
> request.cpp file along with an assertion that the D pointer was valid to
> provide extra validation checking that the Request has not been
> deleted, while in use as it is 'owned' by the application.
>
> Signed-off-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
>
Reviewed-by: Jean-Michel Hautbois <jeanmichel.hautbois at ideasonboard.com>
> ---
> The assertions added in findBuffer, complete() and completeBuffer()
> allow us to ensure that the Request is still valid while asynchronous
> actions occur on the Request internally in libcamera, and provide
> (almost) equivalent functionality as the Request Canary previously
> proposed.
>
> The additions in reuse() and addBuffer() are called from applications,
> so the assertions may be less helpful there, but I've added them for
> consistency.
>
> include/libcamera/request.h | 4 +++-
> src/libcamera/request.cpp | 34 ++++++++++++++++++++++++++++++++--
> 2 files changed, 35 insertions(+), 3 deletions(-)
>
> diff --git a/include/libcamera/request.h b/include/libcamera/request.h
> index 4cf5ff3f7d3b..909a1aebc2d2 100644
> --- a/include/libcamera/request.h
> +++ b/include/libcamera/request.h
> @@ -24,8 +24,10 @@ class CameraControlValidator;
> class FrameBuffer;
> class Stream;
>
> -class Request
> +class Request : public Extensible
> {
> + LIBCAMERA_DECLARE_PRIVATE(Request)
> +
> public:
> enum Status {
> RequestPending,
> diff --git a/src/libcamera/request.cpp b/src/libcamera/request.cpp
> index ce2dd7b17f10..977bfac4fce6 100644
> --- a/src/libcamera/request.cpp
> +++ b/src/libcamera/request.cpp
> @@ -28,6 +28,19 @@ namespace libcamera {
>
> LOG_DEFINE_CATEGORY(Request)
>
> +class Request::Private : public Extensible::Private
> +{
> + LIBCAMERA_DECLARE_PUBLIC(Request)
> +
> +public:
> + Private(Request *request);
> +};
> +
> +Request::Private::Private(Request *request)
> + : Extensible::Private(request)
> +{
> +}
> +
> /**
> * \enum Request::Status
> * Request completion status
> @@ -73,8 +86,8 @@ LOG_DEFINE_CATEGORY(Request)
> *
> */
> Request::Request(Camera *camera, uint64_t cookie)
> - : camera_(camera), sequence_(0), cookie_(cookie),
> - status_(RequestPending), cancelled_(false)
> + : Extensible(new Private(this)), camera_(camera), sequence_(0),
> + cookie_(cookie), status_(RequestPending), cancelled_(false)
> {
> /**
> * \todo Should the Camera expose a validator instance, to avoid
> @@ -114,6 +127,9 @@ Request::~Request()
> */
> void Request::reuse(ReuseFlag flags)
> {
> + Private *const d = LIBCAMERA_D_PTR();
> + ASSERT(d);
> +
> LIBCAMERA_TRACEPOINT(request_reuse, this);
>
> pending_.clear();
> @@ -179,6 +195,9 @@ void Request::reuse(ReuseFlag flags)
> */
> int Request::addBuffer(const Stream *stream, FrameBuffer *buffer)
> {
> + Private *const d = LIBCAMERA_D_PTR();
> + ASSERT(d);
> +
> if (!stream) {
> LOG(Request, Error) << "Invalid stream reference";
> return -EINVAL;
> @@ -214,6 +233,9 @@ int Request::addBuffer(const Stream *stream, FrameBuffer *buffer)
> */
> FrameBuffer *Request::findBuffer(const Stream *stream) const
> {
> + const Private *const d = LIBCAMERA_D_PTR();
> + ASSERT(d);
> +
> const auto it = bufferMap_.find(stream);
> if (it == bufferMap_.end())
> return nullptr;
> @@ -282,6 +304,8 @@ FrameBuffer *Request::findBuffer(const Stream *stream) const
> */
> void Request::complete()
> {
> + Private *const d = LIBCAMERA_D_PTR();
> + ASSERT(d);
> ASSERT(status_ == RequestPending);
> ASSERT(!hasPendingBuffers());
>
> @@ -307,6 +331,9 @@ void Request::complete()
> */
> bool Request::completeBuffer(FrameBuffer *buffer)
> {
> + Private *const d = LIBCAMERA_D_PTR();
> + ASSERT(d);
> +
> LIBCAMERA_TRACEPOINT(request_complete_buffer, this, buffer);
>
> int ret = pending_.erase(buffer);
> @@ -330,6 +357,9 @@ bool Request::completeBuffer(FrameBuffer *buffer)
> */
> std::string Request::toString() const
> {
> + const Private *const d = LIBCAMERA_D_PTR();
> + ASSERT(d);
> +
> std::stringstream ss;
>
> /* Pending, Completed, Cancelled(X). */
>
More information about the libcamera-devel
mailing list