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:
parent
d5c9b726bd
commit
d47fa37c2e
1 changed files with 25 additions and 5 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue