summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-11-27 08:28:38 +0200
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-11-27 19:30:48 +0200
commitd9dac46e6f7c1bfbb76daa016fd7aaa580026d70 (patch)
tree2b20fb7cbe039fa98905774c5d707b87721289a0 /test
parent1f6342f46bda8d2c4bc693dda01f6b5385e11cf6 (diff)
test: message: Add slow receiver test
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@ideasonboard.com> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Diffstat (limited to 'test')
-rw-r--r--test/message.cpp32
1 files changed, 32 insertions, 0 deletions
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>(Message::None));
+
+ this_thread::sleep_for(chrono::milliseconds(10));
+
+ delete slowReceiver;
+
return TestPass;
}