cam: Add event loop
Add a simple event loop to the cam application and use it in the main() function, with an example of how to handle SIGINT to gracefully stop the loop. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
This commit is contained in:
parent
67d313240c
commit
71ef5532d9
4 changed files with 95 additions and 1 deletions
39
src/cam/event_loop.cpp
Normal file
39
src/cam/event_loop.cpp
Normal file
|
@ -0,0 +1,39 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
/*
|
||||
* Copyright (C) 2019, Google Inc.
|
||||
*
|
||||
* event_loop.cpp - cam - Event loop
|
||||
*/
|
||||
|
||||
#include <libcamera/event_dispatcher.h>
|
||||
|
||||
#include "event_loop.h"
|
||||
|
||||
using namespace libcamera;
|
||||
|
||||
EventLoop::EventLoop(EventDispatcher *dispatcher)
|
||||
: dispatcher_(dispatcher)
|
||||
{
|
||||
}
|
||||
|
||||
EventLoop::~EventLoop()
|
||||
{
|
||||
}
|
||||
|
||||
int EventLoop::exec()
|
||||
{
|
||||
exitCode_ = -1;
|
||||
exit_.store(false, std::memory_order_release);
|
||||
|
||||
while (!exit_.load(std::memory_order_acquire))
|
||||
dispatcher_->processEvents();
|
||||
|
||||
return exitCode_;
|
||||
}
|
||||
|
||||
void EventLoop::exit(int code)
|
||||
{
|
||||
exitCode_ = code;
|
||||
exit_.store(true, std::memory_order_release);
|
||||
dispatcher_->interrupt();
|
||||
}
|
34
src/cam/event_loop.h
Normal file
34
src/cam/event_loop.h
Normal file
|
@ -0,0 +1,34 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
/*
|
||||
* Copyright (C) 2019, Google Inc.
|
||||
*
|
||||
* event_loop.h - cam - Event loop
|
||||
*/
|
||||
#ifndef __CAM_EVENT_LOOP_H__
|
||||
#define __CAM_EVENT_LOOP_H__
|
||||
|
||||
#include <atomic>
|
||||
|
||||
#include <libcamera/event_notifier.h>
|
||||
|
||||
namespace libcamera {
|
||||
class EventDispatcher;
|
||||
};
|
||||
|
||||
class EventLoop
|
||||
{
|
||||
public:
|
||||
EventLoop(libcamera::EventDispatcher *dispatcher);
|
||||
~EventLoop();
|
||||
|
||||
int exec();
|
||||
void exit(int code = 0);
|
||||
|
||||
private:
|
||||
libcamera::EventDispatcher *dispatcher_;
|
||||
|
||||
std::atomic<bool> exit_;
|
||||
int exitCode_;
|
||||
};
|
||||
|
||||
#endif /* __CAM_EVENT_LOOP_H__ */
|
|
@ -7,10 +7,12 @@
|
|||
|
||||
#include <iostream>
|
||||
#include <map>
|
||||
#include <signal.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <libcamera/libcamera.h>
|
||||
|
||||
#include "event_loop.h"
|
||||
#include "options.h"
|
||||
|
||||
using namespace libcamera;
|
||||
|
@ -23,6 +25,14 @@ enum {
|
|||
OptList = 'l',
|
||||
};
|
||||
|
||||
EventLoop *loop;
|
||||
|
||||
void signalHandler(int signal)
|
||||
{
|
||||
std::cout << "Exiting" << std::endl;
|
||||
loop->exit();
|
||||
}
|
||||
|
||||
static int parseOptions(int argc, char *argv[])
|
||||
{
|
||||
OptionsParser parser;
|
||||
|
@ -79,7 +89,17 @@ int main(int argc, char **argv)
|
|||
}
|
||||
}
|
||||
|
||||
loop = new EventLoop(cm->eventDispatcher());
|
||||
|
||||
struct sigaction sa = {};
|
||||
sa.sa_handler = &signalHandler;
|
||||
sigaction(SIGINT, &sa, nullptr);
|
||||
|
||||
ret = loop->exec();
|
||||
|
||||
delete loop;
|
||||
|
||||
cm->stop();
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
cam_sources = files([
|
||||
'event_loop.cpp',
|
||||
'main.cpp',
|
||||
'options.cpp',
|
||||
])
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue