-/* $OpenBSD: format.c,v 1.125 2017/04/18 15:44:17 nicm Exp $ */
+/* $OpenBSD: format.c,v 1.126 2017/04/19 06:52:27 nicm Exp $ */
/*
* Copyright (c) 2011 Nicholas Marriott <nicholas.marriott@gmail.com>
format_add_tv(ft, "client_created", &c->creation_time);
format_add_tv(ft, "client_activity", &c->activity_time);
- format_add(ft, "client_written", "%zu", tty->written);
+
+ format_add(ft, "client_written", "%zu", c->written);
+ format_add(ft, "client_discarded", "%zu", c->discarded);
name = server_client_get_key_table(c);
if (strcmp(c->keytable->name, name) == 0)
-.\" $OpenBSD: tmux.1,v 1.541 2017/04/18 15:44:17 nicm Exp $
+.\" $OpenBSD: tmux.1,v 1.542 2017/04/19 06:52:27 nicm Exp $
.\"
.\" Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
.\"
.\" IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
.\" OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\"
-.Dd $Mdocdate: April 18 2017 $
+.Dd $Mdocdate: April 19 2017 $
.Dt TMUX 1
.Os
.Sh NAME
.It Li "client_activity" Ta "" Ta "Integer time client last had activity"
.It Li "client_created" Ta "" Ta "Integer time client created"
.It Li "client_control_mode" Ta "" Ta "1 if client is in control mode"
+.It Li "client_discarded" Ta "" Ta "Bytes discarded when client behind"
.It Li "client_height" Ta "" Ta "Height of client"
.It Li "client_key_table" Ta "" Ta "Current key table"
.It Li "client_last_session" Ta "" Ta "Name of the client's last session"
-/* $OpenBSD: tty.c,v 1.265 2017/04/18 21:41:42 nicm Exp $ */
+/* $OpenBSD: tty.c,v 1.266 2017/04/19 06:52:27 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
#define tty_pane_full_width(tty, ctx) \
((ctx)->xoff == 0 && screen_size_x((ctx)->wp->screen) >= (tty)->sx)
+#define TTY_BLOCK_INTERVAL (100000 /* 100 milliseconds */)
+#define TTY_BLOCK_START(tty) (1 + ((tty)->sx * (tty)->sy) * 8)
+#define TTY_BLOCK_STOP(tty) (1 + ((tty)->sx * (tty)->sy) / 8)
+
void
tty_create_log(void)
{
;
}
+static void
+tty_timer_callback(__unused int fd, __unused short events, void *data)
+{
+ struct tty *tty = data;
+ struct client *c = tty->client;
+ struct timeval tv = { .tv_usec = TTY_BLOCK_INTERVAL };
+
+ log_debug("%s: %zu discarded", c->name, tty->discarded);
+
+ c->flags |= CLIENT_REDRAW;
+ c->discarded += tty->discarded;
+
+ if (tty->discarded < TTY_BLOCK_STOP(tty)) {
+ tty->flags &= ~TTY_BLOCK;
+ tty_invalidate(tty);
+ return;
+ }
+ tty->discarded = 0;
+ evtimer_add(&tty->timer, &tv);
+}
+
+static int
+tty_block_maybe(struct tty *tty)
+{
+ struct client *c = tty->client;
+ size_t size = EVBUFFER_LENGTH(tty->out);
+ struct timeval tv = { .tv_usec = TTY_BLOCK_INTERVAL };
+
+ if (size < TTY_BLOCK_START(tty))
+ return (0);
+
+ if (tty->flags & TTY_BLOCK)
+ return (1);
+ tty->flags |= TTY_BLOCK;
+
+ log_debug("%s: can't keep up, %zu discarded", c->name, size);
+
+ evbuffer_drain(tty->out, size);
+ c->discarded += size;
+
+ tty->discarded = 0;
+ evtimer_add(&tty->timer, &tv);
+ return (1);
+}
+
static void
tty_write_callback(__unused int fd, __unused short events, void *data)
{
return;
log_debug("%s: wrote %d bytes (of %zu)", c->name, nwrite, size);
+ if (tty_block_maybe(tty))
+ return;
+
if (EVBUFFER_LENGTH(tty->out) != 0)
event_add(&tty->event_out, NULL);
}
}
tty->flags |= TTY_OPENED;
- tty->flags &= ~(TTY_NOCURSOR|TTY_FREEZE);
+ tty->flags &= ~(TTY_NOCURSOR|TTY_FREEZE|TTY_BLOCK|TTY_TIMER);
event_set(&tty->event_in, tty->fd, EV_PERSIST|EV_READ,
tty_read_callback, tty);
event_set(&tty->event_out, tty->fd, EV_WRITE, tty_write_callback, tty);
tty->out = evbuffer_new();
+ evtimer_set(&tty->timer, tty_timer_callback, tty);
+
tty_start_tty(tty);
tty_keys_build(tty);
return;
tty->flags &= ~TTY_STARTED;
+ event_del(&tty->timer);
+ tty->flags &= ~TTY_BLOCK;
+
event_del(&tty->event_in);
event_del(&tty->event_out);
{
struct client *c = tty->client;
+ if (tty->flags & TTY_BLOCK) {
+ tty->discarded += len;
+ return;
+ }
+
evbuffer_add(tty->out, buf, len);
log_debug("%s: %.*s", c->name, (int)len, (const char *)buf);
- tty->written += len;
+ c->written += len;
if (tty_log_fd != -1)
write(tty_log_fd, buf, len);