apps: common: event_loop: Take callbacks by rvalue ref

Using a const lvalue reference to `std::function<>` is not ideal
because it forces a copy to happen. Use an rvalue reference and
`std::move()` to avoid that.

Signed-off-by: Barnabás Pőcze <pobrn@protonmail.com>
Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
This commit is contained in:
Barnabás Pőcze 2025-01-13 13:31:54 +01:00
parent 0fc00eacdb
commit b1b99f4d66
2 changed files with 12 additions and 12 deletions

View file

@ -50,20 +50,20 @@ void EventLoop::exit(int code)
event_base_loopbreak(base_); event_base_loopbreak(base_);
} }
void EventLoop::callLater(const std::function<void()> &func) void EventLoop::callLater(std::function<void()> &&func)
{ {
{ {
std::unique_lock<std::mutex> locker(lock_); std::unique_lock<std::mutex> locker(lock_);
calls_.push_back(func); calls_.push_back(std::move(func));
} }
event_base_once(base_, -1, EV_TIMEOUT, dispatchCallback, this, nullptr); event_base_once(base_, -1, EV_TIMEOUT, dispatchCallback, this, nullptr);
} }
void EventLoop::addFdEvent(int fd, EventType type, void EventLoop::addFdEvent(int fd, EventType type,
const std::function<void()> &callback) std::function<void()> &&callback)
{ {
std::unique_ptr<Event> event = std::make_unique<Event>(callback); std::unique_ptr<Event> event = std::make_unique<Event>(std::move(callback));
short events = (type & Read ? EV_READ : 0) short events = (type & Read ? EV_READ : 0)
| (type & Write ? EV_WRITE : 0) | (type & Write ? EV_WRITE : 0)
| EV_PERSIST; | EV_PERSIST;
@ -85,9 +85,9 @@ void EventLoop::addFdEvent(int fd, EventType type,
} }
void EventLoop::addTimerEvent(const std::chrono::microseconds period, void EventLoop::addTimerEvent(const std::chrono::microseconds period,
const std::function<void()> &callback) std::function<void()> &&callback)
{ {
std::unique_ptr<Event> event = std::make_unique<Event>(callback); std::unique_ptr<Event> event = std::make_unique<Event>(std::move(callback));
event->event_ = event_new(base_, -1, EV_PERSIST, &EventLoop::Event::dispatch, event->event_ = event_new(base_, -1, EV_PERSIST, &EventLoop::Event::dispatch,
event.get()); event.get());
if (!event->event_) { if (!event->event_) {
@ -131,8 +131,8 @@ void EventLoop::dispatchCall()
call(); call();
} }
EventLoop::Event::Event(const std::function<void()> &callback) EventLoop::Event::Event(std::function<void()> &&callback)
: callback_(callback), event_(nullptr) : callback_(std::move(callback)), event_(nullptr)
{ {
} }

View file

@ -33,18 +33,18 @@ public:
int exec(); int exec();
void exit(int code = 0); void exit(int code = 0);
void callLater(const std::function<void()> &func); void callLater(std::function<void()> &&func);
void addFdEvent(int fd, EventType type, void addFdEvent(int fd, EventType type,
const std::function<void()> &handler); std::function<void()> &&handler);
using duration = std::chrono::steady_clock::duration; using duration = std::chrono::steady_clock::duration;
void addTimerEvent(const std::chrono::microseconds period, void addTimerEvent(const std::chrono::microseconds period,
const std::function<void()> &handler); std::function<void()> &&handler);
private: private:
struct Event { struct Event {
Event(const std::function<void()> &callback); Event(std::function<void()> &&callback);
~Event(); ~Event();
static void dispatch(int fd, short events, void *arg); static void dispatch(int fd, short events, void *arg);