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_; unsigned int *deleteCount_;
}; };
class NewThread : public Thread class DeleterThread : public Thread
{ {
public: public:
NewThread(Object *obj) DeleterThread(Object *obj)
: object_(obj) : object_(obj)
{ {
} }
@ -63,9 +63,9 @@ protected:
unsigned int count = 0; unsigned int count = 0;
TestObject *obj = new TestObject(&count); TestObject *obj = new TestObject(&count);
NewThread thread(obj); DeleterThread delThread(obj);
thread.start(); delThread.start();
thread.wait(); delThread.wait();
Thread::current()->dispatchMessages(Message::Type::DeferredDelete); Thread::current()->dispatchMessages(Message::Type::DeferredDelete);
@ -89,6 +89,26 @@ protected:
return TestFail; 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; return TestPass;
} }
}; };