test: object-delete: Test deferred delete just before thread stops

The Object::deleteLater() function is expected to not race with stopping
the thread the object is bound to. Add a test for this.

The test currently fails, demonstrating a bug in libcamera.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Milan Zamazal <mzamazal@redhat.com>
This commit is contained in:
Laurent Pinchart 2024-01-21 05:13:04 +02:00
parent d5c9b726bd
commit d47fa37c2e

View file

@ -33,10 +33,10 @@ public:
unsigned int *deleteCount_;
};
class NewThread : public Thread
class DeleterThread : public Thread
{
public:
NewThread(Object *obj)
DeleterThread(Object *obj)
: object_(obj)
{
}
@ -63,9 +63,9 @@ protected:
unsigned int count = 0;
TestObject *obj = new TestObject(&count);
NewThread thread(obj);
thread.start();
thread.wait();
DeleterThread delThread(obj);
delThread.start();
delThread.wait();
Thread::current()->dispatchMessages(Message::Type::DeferredDelete);
@ -89,6 +89,26 @@ protected:
return TestFail;
}
/*
* Test that deleteLater() works properly when called just
* before the object's thread exits.
*/
Thread boundThread;
boundThread.start();
count = 0;
obj = new TestObject(&count);
obj->moveToThread(&boundThread);
obj->deleteLater();
boundThread.exit();
boundThread.wait();
if (count != 1) {
cout << "Object deletion right before thread exit failed (" << count << ")" << endl;
return TestFail;
}
return TestPass;
}
};