[libcamera-devel] [PATCH 4/5] libcamera: object: Document danger of deleting object from other thread
Kieran Bingham
kieran.bingham at ideasonboard.com
Wed Nov 27 16:42:29 CET 2019
Hi Laurent,
On 27/11/2019 15:20, Laurent Pinchart wrote:
> Hi Kieran,
>
> On Wed, Nov 27, 2019 at 03:14:08PM +0000, Kieran Bingham wrote:
>> On 27/11/2019 08:49, Laurent Pinchart wrote:
>>> Object instances receive messages dispatched from the event loop of the
>>> thread they belong to. Deleting an object from a different thread is
>>> thus dangerous, unless the caller ensures that no message delivery is in
>>> progress. Document this in the Object class documentation.
>>>
>>> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
>>> ---
>>> src/libcamera/object.cpp | 4 ++++
>>> 1 file changed, 4 insertions(+)
>>>
>>> diff --git a/src/libcamera/object.cpp b/src/libcamera/object.cpp
>>> index 1f787271f782..e76faf48b8ed 100644
>>> --- a/src/libcamera/object.cpp
>>> +++ b/src/libcamera/object.cpp
>>> @@ -40,6 +40,10 @@ LOG_DEFINE_CATEGORY(Object)
>>> * implementing easy message passing between threads by inheriting from the
>>> * 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.
>>> + *
>>
>> What about codifying this with an assertion or Log(Error) check?
>>
>> I.e. put something into the destructor which tests the current thread
>> against the object bound thread?
>>
>> I think a runtime check here would be cheap, and serve a better way to
>> catch these bugs than simply documenting potential issues.
>
> I'd do so if it wasn't for the "unless the caller" part. It's valid to
> destroy objects from other threads if we're careful, and one simple use
> case is destroying objects that have been moved to a thread after the
> thread finishes.
But the message says <paraphrasing>
"From an object if the object is processing a message"
So doesn't that make the check (psuedo-code):
if (pendingMessages_ && this_thread != object->bound_thread())
Log(Error)
<< "Destroying object from separate thread with messages";
Or maybe I've misunderstood something?
--
Kieran
>
>>> * 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
>>> * in another thread.
>
--
Regards
--
Kieran
More information about the libcamera-devel
mailing list