From fc7223edc08a2e330052e699e91ba35402aa088b Mon Sep 17 00:00:00 2001 From: Tom Englund Date: Sun, 30 Mar 2025 01:53:23 +0100 Subject: [PATCH] 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. --- src/helpers/sync/SyncTimeline.cpp | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/helpers/sync/SyncTimeline.cpp b/src/helpers/sync/SyncTimeline.cpp index 224b2c0f..9f5f5a8a 100644 --- a/src/helpers/sync/SyncTimeline.cpp +++ b/src/helpers/sync/SyncTimeline.cpp @@ -91,28 +91,28 @@ static int handleWaiterFD(int fd, uint32_t mask, void* data) { } bool CSyncTimeline::addWaiter(const std::function& waiter, uint64_t point, uint32_t flags) { - auto w = makeShared(); - 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(); + 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");