summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDavid Herrmann <dh.herrmann@gmail.com>2014-10-03 15:54:21 +0200
committerDavid Herrmann <dh.herrmann@gmail.com>2014-10-03 15:57:00 +0200
commit48fed5c55b5183e6d44702dfdccd3b5325d8689c (patch)
tree8fdca659457e7cd3686e95d25e956e0b2c9575f8 /src
parentce04e2335ab80eda5674de3399aa16b5aea2657f (diff)
pty: optimize read loop
As it turns out, I can actually send data to the pty faster than the terminal can read. Therefore, make sure we read as much data as possible but bail out early enough to not cause starvation. Kernel TTY buffers are 4k, so reduce the overall buffer size, but read more than once if possible (up to 8 times sounds reasonable).
Diffstat (limited to 'src')
-rw-r--r--src/shared/pty.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/src/shared/pty.c b/src/shared/pty.c
index adcb32d0be..52a426c0e1 100644
--- a/src/shared/pty.c
+++ b/src/shared/pty.c
@@ -67,7 +67,7 @@
#include "ring.h"
#include "util.h"
-#define PTY_BUFSIZE 16384
+#define PTY_BUFSIZE 4096
enum {
PTY_ROLE_UNKNOWN,
@@ -305,11 +305,11 @@ static int pty_dispatch_read(Pty *pty) {
/*
* We're edge-triggered, means we need to read the whole queue. This,
* however, might cause us to stall if the writer is faster than we
- * are. Therefore, we read twice and if the second read still returned
- * data, we reschedule.
+ * are. Therefore, try reading as much as 8 times (32KiB) and only
+ * bail out then.
*/
- for (i = 0; i < 2; ++i) {
+ for (i = 0; i < 8; ++i) {
len = read(pty->fd, pty->in_buf, sizeof(pty->in_buf) - 1);
if (len < 0) {
if (errno == EINTR)