tests: event-dispatcher: Add processEvents() interruption test
Test that the EventDispatcher::interrupt() function correctly interrupts the processEvents() function, both when called before processEvents() and when called while it is running. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
This commit is contained in:
parent
4d470eb37f
commit
eb1ecc92ce
1 changed files with 31 additions and 1 deletions
|
@ -18,16 +18,23 @@
|
|||
using namespace std;
|
||||
using namespace libcamera;
|
||||
|
||||
static EventDispatcher *dispatcher;
|
||||
static bool interrupt;
|
||||
|
||||
class EventDispatcherTest : public Test
|
||||
{
|
||||
protected:
|
||||
static void sigAlarmHandler(int)
|
||||
{
|
||||
cout << "SIGALARM received" << endl;
|
||||
if (interrupt)
|
||||
dispatcher->interrupt();
|
||||
}
|
||||
|
||||
int init()
|
||||
{
|
||||
dispatcher = CameraManager::instance()->eventDispatcher();
|
||||
|
||||
struct sigaction sa = {};
|
||||
sa.sa_handler = &sigAlarmHandler;
|
||||
sigaction(SIGALRM, &sa, nullptr);
|
||||
|
@ -37,7 +44,6 @@ protected:
|
|||
|
||||
int run()
|
||||
{
|
||||
EventDispatcher *dispatcher = CameraManager::instance()->eventDispatcher();
|
||||
Timer timer;
|
||||
|
||||
/* Event processing interruption by signal. */
|
||||
|
@ -48,6 +54,7 @@ protected:
|
|||
|
||||
struct itimerval itimer = {};
|
||||
itimer.it_value.tv_usec = 500000;
|
||||
interrupt = false;
|
||||
setitimer(ITIMER_REAL, &itimer, nullptr);
|
||||
|
||||
dispatcher->processEvents();
|
||||
|
@ -62,6 +69,29 @@ protected:
|
|||
return TestFail;
|
||||
}
|
||||
|
||||
/* Event processing interruption. */
|
||||
timer.start(1000);
|
||||
dispatcher->interrupt();
|
||||
|
||||
dispatcher->processEvents();
|
||||
|
||||
if (!timer.isRunning()) {
|
||||
cout << "Event processing immediate interruption failed" << endl;
|
||||
return TestFail;
|
||||
}
|
||||
|
||||
timer.start(1000);
|
||||
itimer.it_value.tv_usec = 500000;
|
||||
interrupt = true;
|
||||
setitimer(ITIMER_REAL, &itimer, nullptr);
|
||||
|
||||
dispatcher->processEvents();
|
||||
|
||||
if (!timer.isRunning()) {
|
||||
cout << "Event processing delayed interruption failed" << endl;
|
||||
return TestFail;
|
||||
}
|
||||
|
||||
return TestPass;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue