[libcamera-devel] [PATCH 5/5] test: object-invoke: Delete InvokeObject after thread termination
Niklas Söderlund
niklas.soderlund at ragnatech.se
Wed Nov 27 16:14:52 CET 2019
Hi Laurent,
Thanks for your patch.
On 2019-11-27 10:49:09 +0200, Laurent Pinchart wrote:
> The InvokeObject instance is created on the stack in the run() method,
> and is thus destroyed before the thread the object is bound to
> terminates. This creates a race condition as the object message handler
> could be running when the object is deleted. Fix this by moving the
> InvokeObject to a member field.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
> ---
> test/object-invoke.cpp | 24 ++++++++++++------------
> 1 file changed, 12 insertions(+), 12 deletions(-)
>
> diff --git a/test/object-invoke.cpp b/test/object-invoke.cpp
> index 6582fa75ae11..560adee14e3a 100644
> --- a/test/object-invoke.cpp
> +++ b/test/object-invoke.cpp
> @@ -60,23 +60,22 @@ protected:
> int run()
> {
> EventDispatcher *dispatcher = Thread::current()->eventDispatcher();
> - InvokedObject object;
>
> /*
> * Test that queued method invocation in the same thread goes
> * through the event dispatcher.
> */
> - object.invokeMethod(&InvokedObject::method,
> - ConnectionTypeQueued, 42);
> + object_.invokeMethod(&InvokedObject::method,
> + ConnectionTypeQueued, 42);
>
> - if (object.status() != InvokedObject::NoCall) {
> + if (object_.status() != InvokedObject::NoCall) {
> cerr << "Method not invoked asynchronously" << endl;
> return TestFail;
> }
>
> dispatcher->processEvents();
>
> - switch (object.status()) {
> + switch (object_.status()) {
> case InvokedObject::NoCall:
> cout << "Method not invoked for main thread" << endl;
> return TestFail;
> @@ -87,7 +86,7 @@ protected:
> break;
> }
>
> - if (object.value() != 42) {
> + if (object_.value() != 42) {
> cout << "Method invoked with incorrect value for main thread" << endl;
> return TestFail;
> }
> @@ -96,15 +95,15 @@ protected:
> * Move the object to a thread and verify that auto method
> * invocation is delivered in the correct thread.
> */
> - object.reset();
> - object.moveToThread(&thread_);
> + object_.reset();
> + object_.moveToThread(&thread_);
>
> thread_.start();
>
> - object.invokeMethod(&InvokedObject::method,
> - ConnectionTypeBlocking, 42);
> + object_.invokeMethod(&InvokedObject::method,
> + ConnectionTypeBlocking, 42);
>
> - switch (object.status()) {
> + switch (object_.status()) {
> case InvokedObject::NoCall:
> cout << "Method not invoked for custom thread" << endl;
> return TestFail;
> @@ -115,7 +114,7 @@ protected:
> break;
> }
>
> - if (object.value() != 42) {
> + if (object_.value() != 42) {
> cout << "Method invoked with incorrect value for custom thread" << endl;
> return TestFail;
> }
> @@ -131,6 +130,7 @@ protected:
>
> private:
> Thread thread_;
> + InvokedObject object_;
> };
>
> TEST_REGISTER(ObjectInvokeTest)
> --
> Regards,
>
> Laurent Pinchart
>
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel at lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel
--
Regards,
Niklas Söderlund
More information about the libcamera-devel
mailing list