1
0
Fork 0

log: set nonblocking mode for stderr

Glib can print error messages to stderr and blocking write freezes
Profanity if the buffer is full. Move stderr to nonblocking mode
in hope that glib will skip printing on EWOULDBLOCK error. In this
case we lose some error messages, but Profanity continues working.
This commit is contained in:
Dmitry Podgorny 2019-09-12 08:49:30 +00:00
parent 000650a908
commit 3ecb5424ae
1 changed files with 16 additions and 6 deletions

View File

@ -790,26 +790,36 @@ log_stderr_handler(void)
}
}
static int log_stderr_nonblock_set(int fd)
{
int rc;
rc = fcntl(fd, F_GETFL);
if (rc >= 0)
rc = fcntl(fd, F_SETFL, rc | O_NONBLOCK);
return rc;
}
void
log_stderr_init(log_level_t level)
{
int rc;
int flags;
rc = pipe(stderr_pipe);
if (rc != 0)
goto err;
flags = fcntl(stderr_pipe[0], F_GETFL);
rc = fcntl(stderr_pipe[0], F_SETFL, flags | O_NONBLOCK);
if (rc != 0)
goto err_close;
close(STDERR_FILENO);
rc = dup2(stderr_pipe[1], STDERR_FILENO);
if (rc < 0)
goto err_close;
rc = log_stderr_nonblock_set(stderr_pipe[0])
?: log_stderr_nonblock_set(stderr_pipe[1]);
if (rc != 0)
goto err_close;
stderr_buf = malloc(STDERR_BUFSIZE);
stderr_msg = g_string_sized_new(STDERR_BUFSIZE);
stderr_level = level;