Update of /cvsroot/tmux/tmux
In directory sfp-cvsdas-2.v30.ch3.sourceforge.com:/tmp/cvs-serv31051

Modified Files:
        server-client.c server-window.c tmux.h tty.c 
Log Message:
Sync OpenBSD patchset 745:

Change the way backoff works. Instead of stopping reading from the pty
when the client tty backs up too much, just stop updating the tty and
only update the internal screen. Then when the tty recovers, force a
redraw.

This prevents a dodgy client from causing other clients to go into
backoff while still allowing tmux to be responsive (locally) when seeing
lots of output.


Index: tty.c
===================================================================
RCS file: /cvsroot/tmux/tmux/tty.c,v
retrieving revision 1.192
retrieving revision 1.193
diff -u -d -r1.192 -r1.193
--- tty.c       6 Jun 2010 00:30:34 -0000       1.192
+++ tty.c       11 Aug 2010 22:16:04 -0000      1.193
@@ -578,7 +578,9 @@
                        continue;
 
                if (c->session->curw->window == wp->window) {
-                       if (c->tty.flags & TTY_FREEZE || c->tty.term == NULL)
+                       if (c->tty.term == NULL)
+                               continue;
+                       if (c->tty.flags & (TTY_FREEZE|TTY_BACKOFF))
                                continue;
                        cmdfn(&c->tty, ctx);
                }

Index: server-window.c
===================================================================
RCS file: /cvsroot/tmux/tmux/server-window.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -d -r1.16 -r1.17
--- server-window.c     20 Jul 2010 17:36:41 -0000      1.16
+++ server-window.c     11 Aug 2010 22:16:03 -0000      1.17
@@ -29,31 +29,6 @@
 int    server_window_check_content(
            struct session *, struct winlink *, struct window_pane *);
 
-/* Check if this window should suspend reading. */
-int
-server_window_backoff(struct window_pane *wp)
-{
-       struct client   *c;
-       u_int            i;
-
-       if (!window_pane_visible(wp))
-               return (0);
-
-       for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
-               c = ARRAY_ITEM(&clients, i);
-               if (c == NULL || c->session == NULL)
-                       continue;
-               if ((c->flags & (CLIENT_SUSPENDED|CLIENT_DEAD)) != 0)
-                       continue;
-               if (c->session->curw->window != wp->window)
-                       continue;
-
-               if (EVBUFFER_LENGTH(c->tty.event->output) > BACKOFF_THRESHOLD)
-                       return (1);
-       }
-       return (0);
-}
-
 /* Window functions that need to happen every loop. */
 void
 server_window_loop(void)
@@ -69,17 +44,6 @@
                if (w == NULL)
                        continue;
 
-               TAILQ_FOREACH(wp, &w->panes, entry) {
-                       if (wp->fd == -1)
-                               continue;
-                       if (!(wp->flags & PANE_FREEZE)) {
-                               if (server_window_backoff(wp))
-                                       bufferevent_disable(wp->event, EV_READ);
-                               else
-                                       bufferevent_enable(wp->event, EV_READ);
-                       }
-               }
-
                for (j = 0; j < ARRAY_LENGTH(&sessions); j++) {
                        s = ARRAY_ITEM(&sessions, j);
                        if (s == NULL)

Index: tmux.h
===================================================================
RCS file: /cvsroot/tmux/tmux/tmux.h,v
retrieving revision 1.572
retrieving revision 1.573
diff -u -d -r1.572 -r1.573
--- tmux.h      9 Aug 2010 21:44:25 -0000       1.572
+++ tmux.h      11 Aug 2010 22:16:03 -0000      1.573
@@ -58,8 +58,8 @@
 /* Automatic name refresh interval, in milliseconds. */
 #define NAME_INTERVAL 500
 
-/* Maximum data to buffer for output before suspending reading from panes. */
-#define BACKOFF_THRESHOLD 1024
+/* Maximum data to buffer for output before suspending writing to a tty. */
+#define BACKOFF_THRESHOLD 16384
 
 /*
  * Maximum sizes of strings in message data. Don't forget to bump
@@ -1016,6 +1016,7 @@
 #define TTY_UTF8 0x8
 #define TTY_STARTED 0x10
 #define TTY_OPENED 0x20
+#define TTY_BACKOFF 0x40
        int              flags;
 
        int              term_flags;
@@ -1125,6 +1126,8 @@
 #define CLIENT_DEAD 0x200
 #define CLIENT_BORDERS 0x400
 #define CLIENT_READONLY 0x800
+#define CLIENT_BACKOFF 0x1000
+#define CLIENT_REDRAWWINDOW 0x2000
        int              flags;
 
        struct event     identify_timer;

Index: server-client.c
===================================================================
RCS file: /cvsroot/tmux/tmux/server-client.c,v
retrieving revision 1.38
retrieving revision 1.39
diff -u -d -r1.38 -r1.39
--- server-client.c     9 Aug 2010 21:45:37 -0000       1.38
+++ server-client.c     11 Aug 2010 22:16:03 -0000      1.39
@@ -491,6 +491,50 @@
        c->flags &= ~CLIENT_EXIT;
 }
 
+/*
+ * Check if the client should backoff. During backoff, data from external
+ * programs is not written to the terminal. When the existing data drains, the
+ * client is redrawn.
+ *
+ * There are two backoff phases - both the tty and client have backoff flags -
+ * the first to allow existing data to drain and the latter to ensure backoff
+ * is disabled until the redraw has finished and prevent the redraw triggering
+ * another backoff.
+ */
+void
+server_client_check_backoff(struct client *c)
+{
+       struct tty      *tty = &c->tty;
+       size_t           used;
+
+       used = EVBUFFER_LENGTH(tty->event->output);
+
+       /*
+        * If in the second backoff phase (redrawing), don't check backoff
+        * until the redraw has completed (or enough of it to drop below the
+        * backoff threshold).
+        */
+       if (c->flags & CLIENT_BACKOFF) {
+               if (used > BACKOFF_THRESHOLD)
+                       return;
+               c->flags &= ~CLIENT_BACKOFF;
+               return;
+       }
+
+       /* Once drained, allow data through again and schedule redraw. */
+       if (tty->flags & TTY_BACKOFF) {
+               if (used != 0)
+                       return;
+               tty->flags &= ~TTY_BACKOFF;
+               c->flags |= (CLIENT_BACKOFF|CLIENT_REDRAWWINDOW|CLIENT_STATUS);
+               return;
+       }
+
+       /* If too much data, start backoff. */
+       if (used > BACKOFF_THRESHOLD)
+               tty->flags |= TTY_BACKOFF;
+}
+
 /* Check for client redraws. */
 void
 server_client_check_redraw(struct client *c)
@@ -519,6 +563,10 @@
        if (c->flags & CLIENT_REDRAW) {
                screen_redraw_screen(c, 0, 0);
                c->flags &= ~(CLIENT_STATUS|CLIENT_BORDERS);
+       } else if (c->flags & CLIENT_REDRAWWINDOW) {
+               TAILQ_FOREACH(wp, &c->session->curw->window->panes, entry)
+                       screen_redraw_pane(c, wp);
+               c->flags &= ~CLIENT_REDRAWWINDOW;
        } else {
                TAILQ_FOREACH(wp, &c->session->curw->window->panes, entry) {
                        if (wp->flags & PANE_REDRAW)


------------------------------------------------------------------------------
This SF.net email is sponsored by 

Make an app they can't live without
Enter the BlackBerry Developer Challenge
http://p.sf.net/sfu/RIM-dev2dev 
_______________________________________________
tmux-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tmux-cvs

Reply via email to