From c30fc9d60f637477edc6f62ec97ddd3604707af6 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Mon, 12 Jan 2026 23:53:11 +0200 Subject: [PATCH] LibGUI: Rewrite using epoll select is slow :^) --- userspace/libraries/LibGUI/Window.cpp | 33 +++++++++++-------- .../libraries/LibGUI/include/LibGUI/Window.h | 4 ++- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/userspace/libraries/LibGUI/Window.cpp b/userspace/libraries/LibGUI/Window.cpp index 4386967b..6f431165 100644 --- a/userspace/libraries/LibGUI/Window.cpp +++ b/userspace/libraries/LibGUI/Window.cpp @@ -5,8 +5,8 @@ #include #include #include +#include #include -#include #include #include #include @@ -67,6 +67,18 @@ namespace LibGUI return BAN::Error::from_errno(errno); BAN::ScopeGuard server_closer([server_fd] { close(server_fd); }); + int epoll_fd = epoll_create1(EPOLL_CLOEXEC); + if (epoll_fd == -1) + return BAN::Error::from_errno(errno); + BAN::ScopeGuard epoll_closer([epoll_fd] { close(epoll_fd); }); + + epoll_event epoll_event { + .events = EPOLLIN, + .data = { .fd = server_fd }, + }; + if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, server_fd, &epoll_event) == -1) + return BAN::Error::from_errno(errno); + if (fcntl(server_fd, F_SETFD, fcntl(server_fd, F_GETFD) | FD_CLOEXEC) == -1) return BAN::Error::from_errno(errno); @@ -100,7 +112,7 @@ namespace LibGUI TRY(create_packet.title.append(title)); TRY(create_packet.send_serialized(server_fd)); - auto window = TRY(BAN::UniqPtr::create(server_fd, attributes)); + auto window = TRY(BAN::UniqPtr::create(server_fd, epoll_fd, attributes)); bool resized = false; window->set_resize_window_event_callback([&]() { resized = true; }); @@ -109,6 +121,7 @@ namespace LibGUI window->set_resize_window_event_callback({}); server_closer.disable(); + epoll_closer.disable(); return window; } @@ -261,6 +274,7 @@ namespace LibGUI { munmap(m_framebuffer_smo, m_width * m_height * 4); close(m_server_fd); + close(m_epoll_fd); } BAN::ErrorOr Window::handle_resize_event(const EventPacket::ResizeWindowEvent& event) @@ -289,10 +303,8 @@ namespace LibGUI void Window::wait_events() { - fd_set fds; - FD_ZERO(&fds); - FD_SET(m_server_fd, &fds); - select(m_server_fd + 1, &fds, nullptr, nullptr, nullptr); + epoll_event dummy; + epoll_wait(m_epoll_fd, &dummy, 1, -1); } void Window::poll_events() @@ -300,13 +312,8 @@ namespace LibGUI #define TRY_OR_BREAK(...) ({ auto&& e = (__VA_ARGS__); if (e.is_error()) break; e.release_value(); }) for (;;) { - fd_set fds; - FD_ZERO(&fds); - FD_SET(m_server_fd, &fds); - timeval timeout { .tv_sec = 0, .tv_usec = 0 }; - select(m_server_fd + 1, &fds, nullptr, nullptr, &timeout); - - if (!FD_ISSET(m_server_fd, &fds)) + epoll_event event; + if (epoll_wait(m_epoll_fd, &event, 1, 0) == 0) break; auto packet_or_error = recv_packet(m_server_fd); diff --git a/userspace/libraries/LibGUI/include/LibGUI/Window.h b/userspace/libraries/LibGUI/include/LibGUI/Window.h index 456bd3ac..5d995398 100644 --- a/userspace/libraries/LibGUI/include/LibGUI/Window.h +++ b/userspace/libraries/LibGUI/include/LibGUI/Window.h @@ -81,8 +81,9 @@ namespace LibGUI int server_fd() const { return m_server_fd; } private: - Window(int server_fd, Attributes attributes) + Window(int server_fd, int epoll_fd, Attributes attributes) : m_server_fd(server_fd) + , m_epoll_fd(epoll_fd) , m_attributes(attributes) { } @@ -93,6 +94,7 @@ namespace LibGUI private: const int m_server_fd; + const int m_epoll_fd; bool m_handling_socket_error { false };