summaryrefslogtreecommitdiff
path: root/src/helpers/sync/SyncTimeline.cpp
diff options
context:
space:
mode:
authorTom Englund <tomenglund26@gmail.com>2025-03-30 01:53:23 +0100
committerGitHub <noreply@github.com>2025-03-30 01:53:23 +0100
commitfc7223edc08a2e330052e699e91ba35402aa088b (patch)
treea77acfc841dd581892a05d56de0f52311e3b5a6b /src/helpers/sync/SyncTimeline.cpp
parent86c279d7d0df9a6f2a78b47f3ca966272a9b9ee0 (diff)
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.
Diffstat (limited to 'src/helpers/sync/SyncTimeline.cpp')
-rw-r--r--src/helpers/sync/SyncTimeline.cpp28
1 files 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<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");