1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 17:07:34 +00:00

WindowServer+LibGUI: Wait for the extra_data to arrive.

Since the sockets we use are non-blocking, just slap a select before the
second call to read(). This fixes some flakiness seen under load.

This should eventually work a bit differently, we could use recv() once
it has MSG_WAITALL, and we should not let WindowServer handle all the
client connections on the main thread. But for now, this works.

Fixes #24.
This commit is contained in:
Andreas Kling 2019-05-01 18:25:24 +02:00
parent ded3652f6c
commit 288e97a206
2 changed files with 17 additions and 0 deletions

View file

@ -309,6 +309,17 @@ void WSEventLoop::drain_client(WSClientConnection& client)
}
extra_data = ByteBuffer::create_uninitialized(message.extra_size);
fd_set rfds;
FD_ZERO(&rfds);
FD_SET(client.fd(), &rfds);
struct timeval timeout { 1, 0 };
int rc = select(client.fd() + 1, &rfds, nullptr, nullptr, &timeout);
if (rc != 1) {
dbgprintf("extra_data didn't show up in time\n");
return client.did_misbehave();
}
int extra_nread = read(client.fd(), extra_data.data(), extra_data.size());
if (extra_nread != message.extra_size) {
dbgprintf("extra_nread(%d) != extra_size(%d)\n", extra_nread, extra_data.size());