[libcamera-devel] [PATCH 2/5] test: message: Add slow receiver test

Laurent Pinchart laurent.pinchart at ideasonboard.com
Wed Nov 27 09:49:06 CET 2019


There's a race in the message delivery against object deletion. Add a
test that triggers it reliably. This test is expected to fail with an
assertion error.

Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
---
 test/message.cpp | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/test/message.cpp b/test/message.cpp
index cf21d5ca50d1..7ebedb557502 100644
--- a/test/message.cpp
+++ b/test/message.cpp
@@ -52,6 +52,25 @@ private:
 	Status status_;
 };
 
+class SlowMessageReceiver : public Object
+{
+protected:
+	void message(Message *msg)
+	{
+		if (msg->type() != Message::None) {
+			Object::message(msg);
+			return;
+		}
+
+		/*
+		 * Don't access any member of the object here (including the
+		 * vtable) as the object will be deleted by the main thread
+		 * while we're sleeping.
+		 */
+		this_thread::sleep_for(chrono::milliseconds(100));
+	}
+};
+
 class MessageTest : public Test
 {
 protected:
@@ -88,6 +107,19 @@ protected:
 			break;
 		}
 
+		/*
+		 * Test for races between message delivery and object deletion.
+		 * Failures result in assertion errors, there is no need for
+		 * explicit checks.
+		 */
+		SlowMessageReceiver *slowReceiver = new SlowMessageReceiver();
+		slowReceiver->moveToThread(&thread_);
+		slowReceiver->postMessage(utils::make_unique<Message>(Message::None));
+
+		this_thread::sleep_for(chrono::milliseconds(10));
+
+		delete slowReceiver;
+
 		return TestPass;
 	}
 
-- 
Regards,

Laurent Pinchart



More information about the libcamera-devel mailing list