libcamera/test/object-delete.cpp
Kieran Bingham 27aff949fb libcamera/base: Move extended base functionality
Move the functionality for the following components to the new
base support library:

 - BoundMethod
 - EventDispatcher
 - EventDispatcherPoll
 - Log
 - Message
 - Object
 - Signal
 - Semaphore
 - Thread
 - Timer

While it would be preferable to see these split to move one component
per commit, these components are all interdependent upon each other,
which leaves us with one big change performing the move for all of them.

Reviewed-by: Hirokazu Honda <hiroh@chromium.org>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2021-06-25 16:11:08 +01:00

96 lines
1.6 KiB
C++

/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* Copyright (C) 2020, Google Inc.
*
* object.cpp - Object deletion tests
*/
#include <iostream>
#include <libcamera/base/object.h>
#include <libcamera/base/thread.h>
#include "test.h"
using namespace std;
using namespace libcamera;
class TestObject : public Object
{
public:
TestObject(unsigned int *count)
: deleteCount_(count)
{
}
~TestObject()
{
/* Count the deletions from the correct thread. */
if (thread() == Thread::current())
(*deleteCount_)++;
}
unsigned int *deleteCount_;
};
class NewThread : public Thread
{
public:
NewThread(Object *obj)
: object_(obj)
{
}
protected:
void run()
{
object_->deleteLater();
}
private:
Object *object_;
};
class ObjectDeleteTest : public Test
{
protected:
int run()
{
/*
* Test that deferred deletion is executed from the object's
* thread, not the caller's thread.
*/
unsigned int count = 0;
TestObject *obj = new TestObject(&count);
NewThread thread(obj);
thread.start();
thread.wait();
Thread::current()->dispatchMessages(Message::Type::DeferredDelete);
if (count != 1) {
cout << "Failed to dispatch DeferredDelete (" << count << ")" << endl;
return TestFail;
}
/*
* Test that multiple calls to deleteLater() delete the object
* once only.
*/
count = 0;
obj = new TestObject(&count);
obj->deleteLater();
obj->deleteLater();
Thread::current()->dispatchMessages(Message::Type::DeferredDelete);
if (count != 1) {
cout << "Multiple deleteLater() failed (" << count << ")" << endl;
return TestFail;
}
return TestPass;
}
};
TEST_REGISTER(ObjectDeleteTest)