From 982eb996f7d99c9c45a3bf4bdddffa41eeda0d45 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Fri, 7 Feb 2020 11:30:11 +0100 Subject: [PATCH] WindowServer: Process multiple mouse packets at the same time We can often get multiple packets in one read() syscall, so let's know how to deal with that to reduce syscall traffic during interactivity. --- Servers/WindowServer/EventLoop.cpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/Servers/WindowServer/EventLoop.cpp b/Servers/WindowServer/EventLoop.cpp index 538cb9c722..8ae086fb59 100644 --- a/Servers/WindowServer/EventLoop.cpp +++ b/Servers/WindowServer/EventLoop.cpp @@ -94,12 +94,18 @@ void EventLoop::drain_mouse() MousePacket state; state.buttons = screen.mouse_button_state(); unsigned buttons = state.buttons; - for (;;) { - MousePacket packet; - ssize_t nread = read(m_mouse_fd, &packet, sizeof(MousePacket)); - if (nread == 0) - break; - ASSERT(nread == sizeof(packet)); + MousePacket packets[32]; + + ssize_t nread = read(m_mouse_fd, &packets, sizeof(packets)); + if (nread < 0) { + perror("EventLoop::drain_mouse read"); + return; + } + size_t npackets = nread / sizeof(MousePacket); + if (!npackets) + return; + for (size_t i = 0; i < npackets; ++i) { + auto& packet = packets[i]; #ifdef WSMESSAGELOOP_DEBUG dbgprintf("EventLoop: Mouse X %d, Y %d, Z %d, relative %d\n", packet.x, packet.y, packet.z, packet.is_relative); #endif