mirror of
https://github.com/hyprwm/Hyprland.git
synced 2025-08-14 19:45:45 -07:00
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:
@@ -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) {
|
bool CSyncTimeline::addWaiter(const std::function<void()>& waiter, uint64_t point, uint32_t flags) {
|
||||||
auto w = makeShared<SWaiter>();
|
CFileDescriptor eventFd = CFileDescriptor{eventfd(0, EFD_CLOEXEC)};
|
||||||
w->fn = waiter;
|
|
||||||
w->timeline = self;
|
|
||||||
w->eventFd = CFileDescriptor{eventfd(0, EFD_CLOEXEC)};
|
|
||||||
|
|
||||||
if (!w->eventFd.isValid()) {
|
if (!eventFd.isValid()) {
|
||||||
Debug::log(ERR, "CSyncTimeline::addWaiter: failed to acquire an eventfd");
|
Debug::log(ERR, "CSyncTimeline::addWaiter: failed to acquire an eventfd");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
drm_syncobj_eventfd syncobjEventFD = {
|
if (drmSyncobjEventfd(drmFD, handle, point, eventFd.get(), flags)) {
|
||||||
.handle = handle,
|
Debug::log(ERR, "CSyncTimeline::addWaiter: drmSyncobjEventfd failed");
|
||||||
.flags = flags,
|
|
||||||
.point = point,
|
|
||||||
.fd = w->eventFd.get(),
|
|
||||||
};
|
|
||||||
|
|
||||||
if (drmIoctl(drmFD, DRM_IOCTL_SYNCOBJ_EVENTFD, &syncobjEventFD) != 0) {
|
|
||||||
Debug::log(ERR, "CSyncTimeline::addWaiter: drmIoctl failed");
|
|
||||||
return false;
|
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());
|
w->source = wl_event_loop_add_fd(g_pEventLoopManager->m_sWayland.loop, w->eventFd.get(), WL_EVENT_READABLE, ::handleWaiterFD, w.get());
|
||||||
if (!w->source) {
|
if (!w->source) {
|
||||||
Debug::log(ERR, "CSyncTimeline::addWaiter: wl_event_loop_add_fd failed");
|
Debug::log(ERR, "CSyncTimeline::addWaiter: wl_event_loop_add_fd failed");
|
||||||
|
Reference in New Issue
Block a user