<div dir="auto">Another friendly reminder. In case you guys get the opportunity.</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed 11 May 2022, 12:33 Eric Curtin, <<a href="mailto:ecurtin@redhat.com">ecurtin@redhat.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Thu, 5 May 2022 at 16:19, Eric Curtin <<a href="mailto:ecurtin@redhat.com" target="_blank" rel="noreferrer">ecurtin@redhat.com</a>> wrote:<br>
><br>
> Extend the EventLoop class to support periodic timer events. This can be<br>
> used to run tasks periodically, such as handling the event loop of SDL.<br>
><br>
> Also delete all events in the list, before we event_base_loopbreak.<br>
><br>
> Signed-off-by: Eric Curtin <<a href="mailto:ecurtin@redhat.com" target="_blank" rel="noreferrer">ecurtin@redhat.com</a>><br>
> ---<br>
>  src/cam/event_loop.cpp | 33 +++++++++++++++++++++++++++++++++<br>
>  src/cam/event_loop.h   |  6 ++++++<br>
>  2 files changed, 39 insertions(+)<br>
><br>
> diff --git a/src/cam/event_loop.cpp b/src/cam/event_loop.cpp<br>
> index e25784c0..181c971c 100644<br>
> --- a/src/cam/event_loop.cpp<br>
> +++ b/src/cam/event_loop.cpp<br>
> @@ -47,6 +47,10 @@ int EventLoop::exec()<br>
>  void EventLoop::exit(int code)<br>
>  {<br>
>         exitCode_ = code;<br>
> +       for (auto const &e : events_) {<br>
> +               event_del(e->event_);<br>
> +       }<br>
> +<br>
>         event_base_loopbreak(base_);<br>
>  }<br>
><br>
> @@ -84,6 +88,35 @@ void EventLoop::addEvent(int fd, EventType type,<br>
>         events_.push_back(std::move(event));<br>
>  }<br>
><br>
> +void EventLoop::toTimeval(const std::chrono::milliseconds d, struct timeval &tv)<br>
> +{<br>
> +       tv.tv_sec = std::chrono::duration_cast<std::chrono::seconds>(d).count();<br>
> +       tv.tv_usec = std::chrono::duration_cast<std::chrono::microseconds>(d).count();<br>
> +}<br>
> +<br>
> +void EventLoop::addTimerEvent(const std::chrono::milliseconds d,<br>
> +                             const std::function<void()> &callback)<br>
> +{<br>
> +       std::unique_ptr<Event> event = std::make_unique<Event>(callback);<br>
> +       event->event_ = event_new(base_, -1, EV_PERSIST, &EventLoop::Event::dispatch,<br>
> +                                 event.get());<br>
> +       if (!event->event_) {<br>
> +               std::cerr << "Failed to create timer event" << std::endl;<br>
> +               return;<br>
> +       }<br>
> +<br>
> +       struct timeval tv;<br>
> +       toTimeval(d, tv);<br>
> +<br>
> +       int ret = event_add(event->event_, &tv);<br>
> +       if (ret < 0) {<br>
> +               std::cerr << "Failed to add timer event" << std::endl;<br>
> +               return;<br>
> +       }<br>
> +<br>
> +       events_.push_back(std::move(event));<br>
> +}<br>
> +<br>
>  void EventLoop::dispatchCallback([[maybe_unused]] evutil_socket_t fd,<br>
>                                  [[maybe_unused]] short flags, void *param)<br>
>  {<br>
> diff --git a/src/cam/event_loop.h b/src/cam/event_loop.h<br>
> index a4613eb2..89215dce 100644<br>
> --- a/src/cam/event_loop.h<br>
> +++ b/src/cam/event_loop.h<br>
> @@ -14,6 +14,8 @@<br>
><br>
>  #include <event2/util.h><br>
><br>
> +using namespace std::chrono_literals;<br>
> +<br>
>  struct event_base;<br>
><br>
>  class EventLoop<br>
> @@ -37,6 +39,9 @@ public:<br>
>         void addEvent(int fd, EventType type,<br>
>                       const std::function<void()> &handler);<br>
><br>
> +       void addTimerEvent(const std::chrono::milliseconds d,<br>
> +                          const std::function<void()> &handler);<br>
> +<br>
>  private:<br>
>         struct Event {<br>
>                 Event(const std::function<void()> &callback);<br>
> @@ -57,6 +62,7 @@ private:<br>
>         std::list<std::unique_ptr<Event>> events_;<br>
>         std::mutex lock_;<br>
><br>
> +       void toTimeval(const std::chrono::milliseconds d, struct timeval &tv);<br>
>         static void dispatchCallback(evutil_socket_t fd, short flags,<br>
>                                      void *param);<br>
>         void dispatchCall();<br>
> --<br>
> 2.35.1<br>
><br>
<br>
Hi Guys,<br>
<br>
Friendly reminder if you could review once you get a spare moment.<br>
<br>
Regards,<br>
<br>
Eric<br>
</blockquote></div>