[libcamera-devel] [PATCH v7 1/2] cam: event_loop: Add timer events to event loop
Eric Curtin
ecurtin at redhat.com
Fri Apr 15 13:14:52 CEST 2022
Hi Guys,
I know holidays are coming up. Just a friendly reminder if you get a
chance to review.
Is mise le meas/Regards,
Eric Curtin
On Fri, 8 Apr 2022 at 17:00, Eric Curtin <ecurtin at redhat.com> wrote:
>
> Extend the EventLoop class to support periodic timer events. This can be
> used to run tasks periodically, such as handling the event loop of SDL.
>
> Signed-off-by: Eric Curtin <ecurtin at redhat.com>
> ---
> src/cam/event_loop.cpp | 37 +++++++++++++++++++++++++++++++++----
> src/cam/event_loop.h | 3 +++
> 2 files changed, 36 insertions(+), 4 deletions(-)
>
> diff --git a/src/cam/event_loop.cpp b/src/cam/event_loop.cpp
> index e25784c0..1e1a4269 100644
> --- a/src/cam/event_loop.cpp
> +++ b/src/cam/event_loop.cpp
> @@ -60,6 +60,17 @@ void EventLoop::callLater(const std::function<void()> &func)
> event_base_once(base_, -1, EV_TIMEOUT, dispatchCallback, this, nullptr);
> }
>
> +int EventLoop::eventNew(const std::unique_ptr<Event> &event, const int fd, const short events)
> +{
> + event->event_ = event_new(base_, fd, events, &EventLoop::Event::dispatch, event.get());
> + if (!event->event_) {
> + std::cerr << "Failed to create event for fd " << fd << std::endl;
> + return -EINVAL;
> + }
> +
> + return 0;
> +}
> +
> void EventLoop::addEvent(int fd, EventType type,
> const std::function<void()> &callback)
> {
> @@ -68,10 +79,7 @@ void EventLoop::addEvent(int fd, EventType type,
> | (type & Write ? EV_WRITE : 0)
> | EV_PERSIST;
>
> - event->event_ = event_new(base_, fd, events, &EventLoop::Event::dispatch,
> - event.get());
> - if (!event->event_) {
> - std::cerr << "Failed to create event for fd " << fd << std::endl;
> + if (eventNew(event, fd, events)) {
> return;
> }
>
> @@ -84,6 +92,27 @@ void EventLoop::addEvent(int fd, EventType type,
> events_.push_back(std::move(event));
> }
>
> +void EventLoop::addTimerEvent(const suseconds_t period,
> + const std::function<void()> &callback)
> +{
> + std::unique_ptr<Event> event = std::make_unique<Event>(callback);
> + if (eventNew(event, -1, EV_PERSIST)) {
> + return;
> + }
> +
> + struct timeval tv;
> + tv.tv_sec = 0;
> + tv.tv_usec = period;
> +
> + int ret = event_add(event->event_, &tv);
> + if (ret < 0) {
> + std::cerr << "Failed to add timer event" << std::endl;
> + return;
> + }
> +
> + events_.push_back(std::move(event));
> +}
> +
> void EventLoop::dispatchCallback([[maybe_unused]] evutil_socket_t fd,
> [[maybe_unused]] short flags, void *param)
> {
> diff --git a/src/cam/event_loop.h b/src/cam/event_loop.h
> index a4613eb2..3d3561e5 100644
> --- a/src/cam/event_loop.h
> +++ b/src/cam/event_loop.h
> @@ -36,6 +36,8 @@ public:
>
> void addEvent(int fd, EventType type,
> const std::function<void()> &handler);
> + void addTimerEvent(const suseconds_t period,
> + const std::function<void()> &handler);
>
> private:
> struct Event {
> @@ -60,4 +62,5 @@ private:
> static void dispatchCallback(evutil_socket_t fd, short flags,
> void *param);
> void dispatchCall();
> + int eventNew(const std::unique_ptr<Event> &event, const int fd, const short events);
> };
> --
> 2.35.1
>
More information about the libcamera-devel
mailing list