[PATCH 11/12] libcamera: object: Document and ensure Object deletion constraints
Milan Zamazal
mzamazal at redhat.com
Mon Jan 22 21:30:25 CET 2024
Laurent Pinchart <laurent.pinchart at ideasonboard.com> writes:
> Object instances are meant to be deleted from the thread they are bound
> to, and this requirement is documented. There are however exceptions to
> the rule, as threads may be stopped and restarted, with objects bound to
> them not being deleted and recreated for every stop/restart cycle. Bound
> objects may therefore need to be deleted after the thread has stopped,
> making it impossible to use Object::deleteLater().
>
> Document the lifetime requirements more precisely, and enforce them with
> an assertion.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
Reviewed-by: Milan Zamazal <mzamazal at redhat.com>
> ---
> src/libcamera/base/object.cpp | 16 ++++++++++++++--
> 1 file changed, 14 insertions(+), 2 deletions(-)
>
> diff --git a/src/libcamera/base/object.cpp b/src/libcamera/base/object.cpp
> index 1fce5a2af9af..8af0337f5448 100644
> --- a/src/libcamera/base/object.cpp
> +++ b/src/libcamera/base/object.cpp
> @@ -40,8 +40,9 @@ LOG_DEFINE_CATEGORY(Object)
> * Object class.
> *
> * Deleting an object from a thread other than the one the object is bound to is
> - * unsafe, unless the caller ensures that the object isn't processing any
> - * message concurrently.
> + * unsafe, unless the caller ensures that the object's thread is stopped and no
> + * parent or child of the object gets deleted concurrently. See
> + * Object::~Object() for more information.
> *
> * Object slots connected to signals will also run in the context of the
> * object's thread, regardless of whether the signal is emitted in the same or
> @@ -84,9 +85,20 @@ Object::Object(Object *parent)
> * Object instances shall be destroyed from the thread they are bound to,
> * otherwise undefined behaviour may occur. If deletion of an Object needs to
> * be scheduled from a different thread, deleteLater() shall be used.
> + *
> + * As an exception to this rule, Object instances may be deleted from a
> + * different thread if the thread the instance is bound to is stopped through
> + * the whole duration of the object's destruction, *and* the parent and children
> + * of the object do not get deleted concurrently. The caller is responsible for
> + * fulfilling those requirements.
> + *
> + * In all cases Object instances shall be deleted before the Thread they are
> + * bound to.
> */
> Object::~Object()
> {
> + ASSERT(Thread::current() == thread_ || !thread_->isRunning());
> +
> /*
> * Move signals to a private list to avoid concurrent iteration and
> * deletion of items from Signal::disconnect().
More information about the libcamera-devel
mailing list