From d9dac46e6f7c1bfbb76daa016fd7aaa580026d70 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Wed, 27 Nov 2019 08:28:38 +0200 Subject: test: message: Add slow receiver test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Jacopo Mondi Reviewed-by: Niklas Söderlund --- test/message.cpp | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'test/message.cpp') diff --git a/test/message.cpp b/test/message.cpp index cf21d5ca..7ebedb55 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::None)); + + this_thread::sleep_for(chrono::milliseconds(10)); + + delete slowReceiver; + return TestPass; } -- cgit v1.2.1