mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 16:48:12 +00:00
LibCore: Don't crash in IPC client/server on EAGAIN
Instead, just sched_yield() and try again. This makes the WindowServer not fall apart whenever clients take a bit too long to respond. Fixes #656.
This commit is contained in:
parent
735f02900b
commit
7dbc13ac88
2 changed files with 34 additions and 19 deletions
|
@ -6,6 +6,7 @@
|
|||
#include <LibCore/CNotifier.h>
|
||||
#include <LibCore/CSyscallUtils.h>
|
||||
#include <LibIPC/IMessage.h>
|
||||
#include <sched.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/select.h>
|
||||
|
@ -145,10 +146,19 @@ namespace Client {
|
|||
++iov_count;
|
||||
}
|
||||
|
||||
int nwritten = writev(m_connection->fd(), iov, iov_count);
|
||||
if (nwritten < 0) {
|
||||
perror("writev");
|
||||
ASSERT_NOT_REACHED();
|
||||
int nwritten;
|
||||
|
||||
for (;;) {
|
||||
nwritten = writev(m_connection->fd(), iov, iov_count);
|
||||
if (nwritten < 0) {
|
||||
if (errno == EAGAIN) {
|
||||
sched_yield();
|
||||
continue;
|
||||
}
|
||||
perror("writev");
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
break;
|
||||
}
|
||||
ASSERT((size_t)nwritten == sizeof(message) + extra_data.size());
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue