synctimeline: check if fd is readable before wait (#9789)

a lot of the time the fd is already readable, and done. so just call the
waiter directly instead of making a waiter and adding it to the
eventloop.
This commit is contained in:
Tom Englund
2025-03-30 01:53:23 +01:00
committed by GitHub
parent 86c279d7d0
commit fc7223edc0

View File

@@ -91,28 +91,28 @@ static int handleWaiterFD(int fd, uint32_t mask, void* data) {
}
bool CSyncTimeline::addWaiter(const std::function<void()>& waiter, uint64_t point, uint32_t flags) {
auto w = makeShared<SWaiter>();
w->fn = waiter;
w->timeline = self;
w->eventFd = CFileDescriptor{eventfd(0, EFD_CLOEXEC)};
CFileDescriptor eventFd = CFileDescriptor{eventfd(0, EFD_CLOEXEC)};
if (!w->eventFd.isValid()) {
if (!eventFd.isValid()) {
Debug::log(ERR, "CSyncTimeline::addWaiter: failed to acquire an eventfd");
return false;
}
drm_syncobj_eventfd syncobjEventFD = {
.handle = handle,
.flags = flags,
.point = point,
.fd = w->eventFd.get(),
};
if (drmIoctl(drmFD, DRM_IOCTL_SYNCOBJ_EVENTFD, &syncobjEventFD) != 0) {
Debug::log(ERR, "CSyncTimeline::addWaiter: drmIoctl failed");
if (drmSyncobjEventfd(drmFD, handle, point, eventFd.get(), flags)) {
Debug::log(ERR, "CSyncTimeline::addWaiter: drmSyncobjEventfd failed");
return false;
}
if (eventFd.isReadable()) {
waiter();
return true;
}
auto w = makeShared<SWaiter>();
w->fn = waiter;
w->timeline = self;
w->eventFd = std::move(eventFd);
w->source = wl_event_loop_add_fd(g_pEventLoopManager->m_sWayland.loop, w->eventFd.get(), WL_EVENT_READABLE, ::handleWaiterFD, w.get());
if (!w->source) {
Debug::log(ERR, "CSyncTimeline::addWaiter: wl_event_loop_add_fd failed");