[libcamera-devel] [PATCH v7 1/2] cam: event_loop: Add timer events to event loop
Eric Curtin
ecurtin at redhat.com
Tue Apr 19 16:48:54 CEST 2022
On Fri, 15 Apr 2022 at 17:25, Laurent Pinchart
<laurent.pinchart at ideasonboard.com> wrote:
>
> Hi Eric,
>
> Thank you for the patch.
>
> On Fri, Apr 08, 2022 at 05:00:14PM +0100, Eric Curtin via libcamera-devel 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;
>
> This message will be a bit confusing for timer events, as it will print
>
> Failed to create event for fd -1
>
> As there's really no other code sharing in this function, how about
> dropping it, keeping addEvent() unchanged, and called event_new()
> directlry in addTimerEvent() with a more appropriate message (such as
> "Failed to create timer event") ?
>
> > + 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,
>
> This could be called addEvent() too, C++ will pick the right function.
> The name addTimerEvent() makes the code more explicit though, which is
> nice, but I'd then rename addEvent to addFdEvent() (in a patch before
> this one).
Funnily enough I started changing to addFdEvent, but then reverted as
it was touching many files, and didn't want the patch to spread to so
many files. I'll go back to doing that.
>
> > + 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);
> > };
>
> --
> Regards,
>
> Laurent Pinchart
>
More information about the libcamera-devel
mailing list