Anyone seeing this or not seeing it please try this and let me know of
any strangeness
Index: server-client.c
===================================================================
RCS file: /cvs/src/usr.bin/tmux/server-client.c,v
retrieving revision 1.35
diff -u -p -r1.35 server-client.c
--- server-client.c 19 Jul 2010 18:27:38 -0000 1.35
+++ server-client.c 22 Jul 2010 22:14:06 -0000
@@ -29,6 +29,7 @@
void server_client_handle_key(int, struct mouse_event *, void *);
void server_client_repeat_timer(int, short, void *);
+void server_client_check_backoff(struct client *);
void server_client_check_redraw(struct client *);
void server_client_set_title(struct client *);
void server_client_reset_state(struct client *);
@@ -393,6 +394,7 @@ server_client_loop(void)
if (c == NULL || c->session == NULL)
continue;
+ server_client_check_backoff(c);
server_client_check_redraw(c);
server_client_reset_state(c);
}
@@ -455,6 +457,18 @@ server_client_repeat_timer(unused int fd
if (c->flags & CLIENT_REPEAT)
c->flags &= ~(CLIENT_PREFIX|CLIENT_REPEAT);
+}
+
+/* Check client backoff. */
+void
+server_client_check_backoff(struct client *c)
+{
+ struct tty *tty = &c->tty;
+
+ if (tty_backoff(tty)) {
+ tty_invalidate(tty);
+ server_redraw_client(c);
+ }
}
/* Check for client redraws. */
Index: server-window.c
===================================================================
RCS file: /cvs/src/usr.bin/tmux/server-window.c,v
retrieving revision 1.16
diff -u -p -r1.16 server-window.c
--- server-window.c 19 Jul 2010 21:13:03 -0000 1.16
+++ server-window.c 22 Jul 2010 22:14:06 -0000
@@ -29,31 +29,6 @@ int server_window_check_activity(struct
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)
@@ -68,17 +43,6 @@ server_window_loop(void)
w = ARRAY_ITEM(&windows, i);
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);
Index: tmux.h
===================================================================
RCS file: /cvs/src/usr.bin/tmux/tmux.h,v
retrieving revision 1.235
diff -u -p -r1.235 tmux.h
--- tmux.h 14 Jul 2010 18:37:49 -0000 1.235
+++ tmux.h 22 Jul 2010 22:14:08 -0000
@@ -59,8 +59,8 @@ extern char **environ;
/* 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 8192
/*
* Maximum sizes of strings in message data. Don't forget to bump
@@ -1017,6 +1017,7 @@ struct tty {
#define TTY_UTF8 0x8
#define TTY_STARTED 0x10
#define TTY_OPENED 0x20
+#define TTY_BACKOFF 0x40
int flags;
int term_flags;
@@ -1376,6 +1377,7 @@ void tty_putc(struct tty *, u_char);
void tty_pututf8(struct tty *, const struct grid_utf8 *);
void tty_init(struct tty *, int, char *);
int tty_resize(struct tty *);
+void tty_invalidate(struct tty *);
void tty_start_tty(struct tty *);
void tty_stop_tty(struct tty *);
void tty_set_title(struct tty *, const char *);
@@ -1384,6 +1386,7 @@ void tty_draw_line(struct tty *, struct
int tty_open(struct tty *, const char *, char **);
void tty_close(struct tty *);
void tty_free(struct tty *);
+int tty_backoff(struct tty *);
void tty_write(void (*)(
struct tty *, const struct tty_ctx *), const struct tty_ctx *);
void tty_cmd_alignmenttest(struct tty *, const struct tty_ctx *);
Index: tty.c
===================================================================
RCS file: /cvs/src/usr.bin/tmux/tty.c,v
retrieving revision 1.88
diff -u -p -r1.88 tty.c
--- tty.c 5 Jun 2010 16:47:11 -0000 1.88
+++ tty.c 22 Jul 2010 22:14:08 -0000
@@ -95,6 +95,15 @@ tty_resize(struct tty *tty)
tty->sx = sx;
tty->sy = sy;
+ tty_invalidate(tty);
+
+ return (1);
+}
+
+/* Invalidate any cached position data. */
+void
+tty_invalidate(struct tty *tty)
+{
tty->cx = UINT_MAX;
tty->cy = UINT_MAX;
@@ -109,8 +118,6 @@ tty_resize(struct tty *tty)
tty_cursor(tty, 0, 0);
tty_region(tty, 0, tty->sy - 1);
}
-
- return (1);
}
int
@@ -208,11 +215,7 @@ tty_start_tty(struct tty *tty)
if (tty_term_has(tty->term, TTYC_KMOUS))
tty_puts(tty, "\033[?1000l");
- tty->cx = UINT_MAX;
- tty->cy = UINT_MAX;
-
- tty->rlower = UINT_MAX;
- tty->rupper = UINT_MAX;
+ tty_invalidate(tty);
tty->mode = MODE_CURSOR;
@@ -257,6 +260,28 @@ tty_stop_tty(struct tty *tty)
fcntl(tty->fd, F_SETFL, mode & ~O_NONBLOCK);
}
+/*
+ * Check if the backoff state has changed on this tty. Returns 1 if the tty has
+ * changed state so it is no longer restricted. Backoff is only enforced when
+ * going through tty_write (updates from the windows), internal redraw goes
+ * directly to the output buffer.
+ */
+int
+tty_backoff(struct tty *tty)
+{
+ if (tty->flags & TTY_BACKOFF) {
+ if (EVBUFFER_LENGTH(tty->event->output) != 0)
+ return (0);
+ tty->flags &= ~TTY_BACKOFF;
+ return (1);
+ } else {
+ if (EVBUFFER_LENGTH(tty->event->output) <= BACKOFF_THRESHOLD)
+ return (0);
+ tty->flags |= TTY_BACKOFF;
+ return (0);
+ }
+}
+
void
tty_fill_acs(struct tty *tty)
{
@@ -578,7 +603,9 @@ tty_write(void (*cmdfn)(
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);
}
On Thu, Jul 22, 2010 at 09:20:13AM +0100, Nicholas Marriott wrote:
> yes, this is a known problem when a stale client is left behind, it used
> to happen because we did not pick up HUP, but we do now
>
> micahcowan and i started discussing this as a potential problem with ssh
> before, because ssh will not know to disconnect the client (tcp will not
> tell it), so tmux will never know either, but we were both called away
> and didn't finish the conversation
>
> probably what is happening is that ssh or the pty buffers fill and it is
> no longer reading from the pty so it hits the backoff limit and reading
> from any windows shown on that client is suspended
>
> maybe we are doing backoff the wrong way. maybe a better way would be to
> suspend /writing/ to the client until the buffer drains, then flush the
> pending data and force a redraw. this might be harder to achieve though
>
>
> On Wed, Jul 21, 2010 at 09:54:53PM -0400, Samer Atiani wrote:
> > The problem has happened to me again, but I was able to fix it after it
> > occured.
> > I typed "C-b : lsc" *and it returned this:
> > /dev/pts/4: 0 [208x62 xterm] * * * * * * * * * * * * * * * * * * * * * *
> > *
> > * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
> > * * * * * * * * * * * * * * * * * * * * * * * * * * * [0/2]
> > /dev/pts/5: 0 [208x62 xterm]
> > so I detached and from the terminal I typed:
> > tmux detach -t /dev/pts/4
> > so that the result of the statement "tmux list-clients" is nothing. Then
> > I
> > attached again with tmux attach and all was fixed.
> > Now onto finding what was using /dev/pts/4:
> > $ ls -al | grep ssh
> > ... [output redacted]
> > 5 S satiani * 1943 *1874 *0 *80 * 0 - 19735 poll_s 15:03 ? * * *
> > *00:00:00
> > sshd: sati...@pts/4
> > ...*[output redacted]
> > 5 S satiani *26350 26286 *0 *80 * 0 - 19735 poll_s 21:35 ? * * *
> > *00:00:00
> > sshd: sati...@pts/5
> > ...*[output redacted]
> > So it looks like there is a stale ssh connection to the machine (process
> > 1943) that was never closed properly after my connection died. Since I
> > was
> > still attached to tmux at the time my connection died I think thats what
> > caused it. Indeed, I was able to reproduce the problem:
> > Reproduction steps:
> > On Windows XP:
> > 1- Open a VPN connection to the network hosting the target machine.
> > 2- PuTTY to the machine, open a new tmux session.
> > 3- Without closing PuTTY or tmux, disconnect the VPN connection.
> > 4- Reopen the VPN and reconnect to the machine, check your ssh connection
> > processes and confirm that there is a stale connection from your
> > interrupted session.
> > 5- Attach tmux. At first it appears you can type a few keystrokes, but
> > eventually the windows will freeze. You should still be able to use tmux
> > keybindings to execute tmux commands but the windows themselves won't
> > respond to your keystrokes unless you switch to another window and then
> > back to the original window.
> > I can reliably reproduce this problem using the steps outlined above. You
> > can fix the problem either by issuing a tmux detach on the pts of the
> > stale connection or from outside tmux by killing the stale connection.
> > Samer
> > On Wed, Jul 21, 2010 at 3:59 PM, Richard Morse <[1][email protected]>
> > wrote:
> >
> > This is tmux running locally.
> >
> > Ricky
> > On Jul 21, 2010, at 3:58 PM, Nicholas Marriott wrote:
> >
> > > over ssh or running natively?
> > >
> > > sounds like problems with SIGWINCH or TIOCGWINSZ
> > >
> > >
> > > On Wed, Jul 21, 2010 at 03:55:35PM -0400, Richard Morse wrote:
> > >> Is it related to changing the terminal size (ie, the PuTTY window
> > size) too quickly? I've just discovered that quickly changing the size
> > of the Terminal.app window can sometimes cause tmux to stop updating
> > the
> > screen until the window is sized back to the size it had been...
> > >>
> > >> Ricky
> > >>
> > >> On Jul 21, 2010, at 3:17 PM, Samer Atiani wrote:
> > >>
> > >>> Yes, its 1.4.14b , sorry.
> > >>>
> > >>> As I said I can't reproduce it, so I don't know exactly the
> > sequence
> > of
> > >>> events that leads to this behavior, nor do I have this problem
> > happening to
> > >>> me now so I can answer your other questions.
> > >>>
> > >>> However, I'll keep you posted the next time it happens.
> > >>>
> > >>> Many thanks for your help,
> > >>> Samer
> > >>>
> > >>> On Wed, Jul 21, 2010 at 3:13 PM, Nicholas Marriott <
> > >>> [2][email protected]> wrote:
> > >>>
> > >>>> I take it that is 1.4.14b libevent.
> > >>>>
> > >>>> So are you doing anything particular when it happens? Running any
> > >>>> particular program?
> > >>>>
> > >>>> After it freezes, can you still detach tmux? What does "C-b : lsc"
> > say
> > >>>> after it happens? Does C-b r fix it?
> > >>>>
> > >>>>
> > >>>> On Wed, Jul 21, 2010 at 03:10:49PM -0400, Samer Atiani wrote:
> > >>>>> *libevent version: 1.4.1b-stable
> > >>>>> *tmux version: 1.2
> > >>>>> *platform: ubuntu 9.10, debian squeeze
> > >>>>> *TERM inside tmux: screen
> > >>>>> *TERM outside tmux: xterm
> > >>>>>
> > >>>>> *On Wed, Jul 21, 2010 at 2:59 PM, Nicholas Marriott
> > >>>>> *<[1][3][email protected]> wrote:
> > >>>>>
> > >>>>> * *What tmux version, what platform is it running on, what is
> > TERM
> > set
> > >>>> to
> > >>>>> * *inside and outside tmux, what version of libevent?
> > >>>>>
> > >>>>> * *On Wed, Jul 21, 2010 at 02:46:26PM -0400, Samer Atiani wrote:
> > >>>>>> * *Hello,
> > >>>>>> * *I'm having a weird problem were tmux windows stop reacting to
> > >>>> my
> > >>>>>> * *keystrokes interactively, this problem only happens to me in
> > >>>> PuTTY.
> > >>>>>> * *When the problem happens, tmux bindings still work (I can
> > >>>> switch
> > >>>>> * *between
> > >>>>>> * *windows, go into command/copy mode, etc.), however, when I
> > type
> > >>>>> * *something
> > >>>>>> * *into the window the terminal doesn't respond to my
> > keystrokes.
> > >>>>> * *Whats
> > >>>>>> * *interesting is that if I switch to another window and then
> > back
> > >>>>> * *into the
> > >>>>>> * *original window, *whatever I originally typed before
> > switching
> > >>>> will
> > >>>>> * *be
> > >>>>>> * *visible now.
> > >>>>>> * *I do not know how to reproduce this problem, so far it
> > happens
> > >>>>>> * *sporadically (it has happened to me twice today so far).
> > >>>>>> * *Can you please help me with resolving this problem?
> > >>>>>> * *Samer
> > >>>>>
> > >>>>>>
> > >>>>>
> > >>>>
> >
> > ------------------------------------------------------------------------------
> > >>>>>> This SF.net email is sponsored by Sprint
> > >>>>>> What will you do first with EVO, the first 4G phone?
> > >>>>>> Visit [2][4]sprint.com/first -- [3]
> > >>>> [5]http://p.sf.net/sfu/sprint-com-first
> > >>>>>
> > >>>>>> _______________________________________________
> > >>>>>> tmux-users mailing list
> > >>>>>> [4][6][email protected]
> > >>>>>> [5][7]https://lists.sourceforge.net/lists/listinfo/tmux-users
> > >>>>>
> > >>>>> References
> > >>>>>
> > >>>>> *Visible links
> > >>>>> *1. mailto:[8][email protected]
> > >>>>> *2. [9]http://sprint.com/first
> > >>>>> *3. [10]http://p.sf.net/sfu/sprint-com-first
> > >>>>> *4. mailto:[11][email protected]
> > >>>>> *5. [12]https://lists.sourceforge.net/lists/listinfo/tmux-users
> > >>>>
> > >>>
> >
> > ------------------------------------------------------------------------------
> > >>> This SF.net email is sponsored by Sprint
> > >>> What will you do first with EVO, the first 4G phone?
> > >>> Visit [13]sprint.com/first --
> >
> > [14]http://p.sf.net/sfu/sprint-com-first_______________________________________________
> > >>> tmux-users mailing list
> > >>> [15][email protected]
> > >>> [16]https://lists.sourceforge.net/lists/listinfo/tmux-users
> > >>
> > >>
> > >>
> > >> The information in this e-mail is intended only for the person to
> > whom it is
> > >> addressed. If you believe this e-mail was sent to you in error and
> > the e-mail
> > >> contains patient information, please contact the Partners Compliance
> > HelpLine at
> > >> [17]http://www.partners.org/complianceline . If the e-mail was sent
> > to you in error
> > >> but does not contain patient information, please contact the sender
> > and properly
> > >> dispose of the e-mail.
> > >>
> >
> > References
> >
> > Visible links
> > 1. mailto:[email protected]
> > 2. mailto:[email protected]
> > 3. mailto:[email protected]
> > 4. http://sprint.com/first
> > 5. http://p.sf.net/sfu/sprint-com-first
> > 6. mailto:[email protected]
> > 7. https://lists.sourceforge.net/lists/listinfo/tmux-users
> > 8. mailto:[email protected]
> > 9. http://sprint.com/first
> > 10. http://p.sf.net/sfu/sprint-com-first
> > 11. mailto:[email protected]
> > 12. https://lists.sourceforge.net/lists/listinfo/tmux-users
> > 13. http://sprint.com/first
> > 14.
> > http://p.sf.net/sfu/sprint-com-first_______________________________________________
> > 15. mailto:[email protected]
> > 16. https://lists.sourceforge.net/lists/listinfo/tmux-users
> > 17. http://www.partners.org/complianceline
>
> ------------------------------------------------------------------------------
> This SF.net email is sponsored by Sprint
> What will you do first with EVO, the first 4G phone?
> Visit sprint.com/first -- http://p.sf.net/sfu/sprint-com-first
> _______________________________________________
> tmux-users mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/tmux-users
------------------------------------------------------------------------------
This SF.net email is sponsored by Sprint
What will you do first with EVO, the first 4G phone?
Visit sprint.com/first -- http://p.sf.net/sfu/sprint-com-first
_______________________________________________
tmux-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tmux-users