libcamera: event_dispatcher_poll: Manage fd by UniqueFD

Manages the event file descriptor owned by EventDispatcherPoll
by UniqueFD.

Signed-off-by: Hirokazu Honda <hiroh@chromium.org>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Hirokazu Honda 2021-06-10 16:50:19 +09:00 committed by Laurent Pinchart
parent fcf98514cb
commit a59c471e5a
2 changed files with 7 additions and 7 deletions

View file

@ -14,6 +14,7 @@
#include <libcamera/base/private.h> #include <libcamera/base/private.h>
#include <libcamera/base/event_dispatcher.h> #include <libcamera/base/event_dispatcher.h>
#include <libcamera/base/unique_fd.h>
struct pollfd; struct pollfd;
@ -50,7 +51,7 @@ private:
std::map<int, EventNotifierSetPoll> notifiers_; std::map<int, EventNotifierSetPoll> notifiers_;
std::list<Timer *> timers_; std::list<Timer *> timers_;
int eventfd_; UniqueFD eventfd_;
bool processingEvents_; bool processingEvents_;
}; };

View file

@ -54,14 +54,13 @@ EventDispatcherPoll::EventDispatcherPoll()
* Create the event fd. Failures are fatal as we can't implement an * Create the event fd. Failures are fatal as we can't implement an
* interruptible dispatcher without the fd. * interruptible dispatcher without the fd.
*/ */
eventfd_ = eventfd(0, EFD_CLOEXEC | EFD_NONBLOCK); eventfd_ = UniqueFD(eventfd(0, EFD_CLOEXEC | EFD_NONBLOCK));
if (eventfd_ < 0) if (!eventfd_.isValid())
LOG(Event, Fatal) << "Unable to create eventfd"; LOG(Event, Fatal) << "Unable to create eventfd";
} }
EventDispatcherPoll::~EventDispatcherPoll() EventDispatcherPoll::~EventDispatcherPoll()
{ {
close(eventfd_);
} }
void EventDispatcherPoll::registerEventNotifier(EventNotifier *notifier) void EventDispatcherPoll::registerEventNotifier(EventNotifier *notifier)
@ -154,7 +153,7 @@ void EventDispatcherPoll::processEvents()
for (auto notifier : notifiers_) for (auto notifier : notifiers_)
pollfds.push_back({ notifier.first, notifier.second.events(), 0 }); pollfds.push_back({ notifier.first, notifier.second.events(), 0 });
pollfds.push_back({ eventfd_, POLLIN, 0 }); pollfds.push_back({ eventfd_.get(), POLLIN, 0 });
/* Wait for events and process notifiers and timers. */ /* Wait for events and process notifiers and timers. */
do { do {
@ -176,7 +175,7 @@ void EventDispatcherPoll::processEvents()
void EventDispatcherPoll::interrupt() void EventDispatcherPoll::interrupt()
{ {
uint64_t value = 1; uint64_t value = 1;
ssize_t ret = write(eventfd_, &value, sizeof(value)); ssize_t ret = write(eventfd_.get(), &value, sizeof(value));
if (ret != sizeof(value)) { if (ret != sizeof(value)) {
if (ret < 0) if (ret < 0)
ret = -errno; ret = -errno;
@ -230,7 +229,7 @@ void EventDispatcherPoll::processInterrupt(const struct pollfd &pfd)
return; return;
uint64_t value; uint64_t value;
ssize_t ret = read(eventfd_, &value, sizeof(value)); ssize_t ret = read(eventfd_.get(), &value, sizeof(value));
if (ret != sizeof(value)) { if (ret != sizeof(value)) {
if (ret < 0) if (ret < 0)
ret = -errno; ret = -errno;