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:
parent
0fc00eacdb
commit
b1b99f4d66
2 changed files with 12 additions and 12 deletions
|
@ -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)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue