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:
parent
fcf98514cb
commit
a59c471e5a
2 changed files with 7 additions and 7 deletions
|
@ -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_;
|
||||||
};
|
};
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue