summaryrefslogtreecommitdiff
path: root/usr.bin/tmux
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@cvs.openbsd.org>2009-11-13 17:33:08 +0000
committerNicholas Marriott <nicm@cvs.openbsd.org>2009-11-13 17:33:08 +0000
commit3c6d57f8f67acbbbd7c47bd1815071189b8d069d (patch)
treeeb7198de62d4814ea41c5a81dfd8e5d0c4e8fad5 /usr.bin/tmux
parent68f6c9fd5d85f99f464506d5e06d285831ff164e (diff)
Destroy panes immediately rather than checking them all every loop.
Diffstat (limited to 'usr.bin/tmux')
-rw-r--r--usr.bin/tmux/cmd-respawn-window.c3
-rw-r--r--usr.bin/tmux/server-fn.c23
-rw-r--r--usr.bin/tmux/server-window.c64
-rw-r--r--usr.bin/tmux/server.c8
-rw-r--r--usr.bin/tmux/tmux.h3
-rw-r--r--usr.bin/tmux/window.c6
6 files changed, 32 insertions, 75 deletions
diff --git a/usr.bin/tmux/cmd-respawn-window.c b/usr.bin/tmux/cmd-respawn-window.c
index 57e7716ba84..38f8f6f4b09 100644
--- a/usr.bin/tmux/cmd-respawn-window.c
+++ b/usr.bin/tmux/cmd-respawn-window.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-respawn-window.c,v 1.9 2009/09/16 12:35:04 nicm Exp $ */
+/* $OpenBSD: cmd-respawn-window.c,v 1.10 2009/11/13 17:33:07 nicm Exp $ */
/*
* Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -80,6 +80,7 @@ cmd_respawn_window_exec(struct cmd *self, struct cmd_ctx *ctx)
ctx->error(ctx, "respawn window failed: %s", cause);
xfree(cause);
environ_free(&env);
+ server_destroy_pane(wp);
return (-1);
}
layout_init(w);
diff --git a/usr.bin/tmux/server-fn.c b/usr.bin/tmux/server-fn.c
index d57f069b6fe..dbe83cbefe1 100644
--- a/usr.bin/tmux/server-fn.c
+++ b/usr.bin/tmux/server-fn.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: server-fn.c,v 1.28 2009/11/04 23:29:42 nicm Exp $ */
+/* $OpenBSD: server-fn.c,v 1.29 2009/11/13 17:33:07 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -317,6 +317,27 @@ server_unlink_window(struct session *s, struct winlink *wl)
}
void
+server_destroy_pane(struct window_pane *wp)
+{
+ struct window *w = wp->window;
+
+ close(wp->fd);
+ bufferevent_free(wp->event);
+ wp->fd = -1;
+
+ if (options_get_number(&w->options, "remain-on-exit"))
+ return;
+
+ layout_close_pane(wp);
+ window_remove_pane(w, wp);
+
+ if (TAILQ_EMPTY(&w->panes))
+ server_kill_window(w);
+ else
+ server_redraw_window(w);
+}
+
+void
server_destroy_session_group(struct session *s)
{
struct session_group *sg;
diff --git a/usr.bin/tmux/server-window.c b/usr.bin/tmux/server-window.c
index f92f935fae6..6330e82c9bc 100644
--- a/usr.bin/tmux/server-window.c
+++ b/usr.bin/tmux/server-window.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: server-window.c,v 1.11 2009/11/06 10:42:06 nicm Exp $ */
+/* $OpenBSD: server-window.c,v 1.12 2009/11/13 17:33:07 nicm Exp $ */
/*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -28,7 +28,6 @@ int server_window_check_bell(struct session *, struct window *);
int server_window_check_activity(struct session *, struct window *);
int server_window_check_content(
struct session *, struct window *, struct window_pane *);
-void server_window_check_alive(struct window *);
/* Check if this window should suspend reading. */
int
@@ -90,8 +89,6 @@ server_window_loop(void)
server_window_check_content(s, w, wp);
}
w->flags &= ~(WINDOW_BELL|WINDOW_ACTIVITY|WINDOW_CONTENT);
-
- server_window_check_alive(w);
}
}
@@ -228,62 +225,3 @@ server_window_check_content(
return (1);
}
-
-/* Check if window still exists. */
-void
-server_window_check_alive(struct window *w)
-{
- struct window_pane *wp, *wq;
- struct options *oo = &w->options;
- struct session *s;
- struct winlink *wl;
- u_int i;
- int destroyed;
-
- destroyed = 1;
-
- wp = TAILQ_FIRST(&w->panes);
- while (wp != NULL) {
- wq = TAILQ_NEXT(wp, entry);
- /*
- * If the pane has died and the remain-on-exit flag is not set,
- * remove the pane; otherwise, if the flag is set, don't allow
- * the window to be destroyed (or it'll close when the last
- * pane dies).
- */
- if (wp->fd == -1 && !options_get_number(oo, "remain-on-exit")) {
- layout_close_pane(wp);
- window_remove_pane(w, wp);
- server_redraw_window(w);
- } else
- destroyed = 0;
- wp = wq;
- }
-
- if (!destroyed)
- return;
-
- for (i = 0; i < ARRAY_LENGTH(&sessions); i++) {
- s = ARRAY_ITEM(&sessions, i);
- if (s == NULL)
- continue;
- if (!session_has(s, w))
- continue;
-
- restart:
- /* Detach window and either redraw or kill clients. */
- RB_FOREACH(wl, winlinks, &s->windows) {
- if (wl->window != w)
- continue;
- if (session_detach(s, wl)) {
- server_destroy_session_group(s);
- break;
- }
- server_redraw_session(s);
- server_status_session_group(s);
- goto restart;
- }
- }
-
- recalculate_sizes();
-}
diff --git a/usr.bin/tmux/server.c b/usr.bin/tmux/server.c
index e4b336b109f..c01d54603d0 100644
--- a/usr.bin/tmux/server.c
+++ b/usr.bin/tmux/server.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: server.c,v 1.76 2009/11/11 13:24:42 nicm Exp $ */
+/* $OpenBSD: server.c,v 1.77 2009/11/13 17:33:07 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -335,7 +335,6 @@ server_accept_callback(int fd, short events, unused void *data)
return;
}
server_client_create(newfd);
-
}
/* Set up server signal handling. */
@@ -449,9 +448,8 @@ server_child_exited(pid_t pid, int status)
continue;
TAILQ_FOREACH(wp, &w->panes, entry) {
if (wp->pid == pid) {
- close(wp->fd);
- bufferevent_free(wp->event);
- wp->fd = -1;
+ server_destroy_pane(wp);
+ break;
}
}
}
diff --git a/usr.bin/tmux/tmux.h b/usr.bin/tmux/tmux.h
index d5e3b5dcfea..c420fdd57f8 100644
--- a/usr.bin/tmux/tmux.h
+++ b/usr.bin/tmux/tmux.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: tmux.h,v 1.176 2009/11/13 07:00:54 nicm Exp $ */
+/* $OpenBSD: tmux.h,v 1.177 2009/11/13 17:33:07 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -1590,6 +1590,7 @@ void server_kill_window(struct window *);
int server_link_window(struct session *,
struct winlink *, struct session *, int, int, int, char **);
void server_unlink_window(struct session *, struct winlink *);
+void server_destroy_pane(struct window_pane *);
void server_destroy_session_group(struct session *);
void server_destroy_session(struct session *);
void server_set_identify(struct client *);
diff --git a/usr.bin/tmux/window.c b/usr.bin/tmux/window.c
index 0aba1e99940..368427ec9f3 100644
--- a/usr.bin/tmux/window.c
+++ b/usr.bin/tmux/window.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: window.c,v 1.38 2009/11/04 23:54:57 nicm Exp $ */
+/* $OpenBSD: window.c,v 1.39 2009/11/13 17:33:07 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -594,9 +594,7 @@ window_pane_error_callback(
{
struct window_pane *wp = data;
- close(wp->fd);
- bufferevent_free(wp->event);
- wp->fd = -1;
+ server_destroy_pane(wp);
}
void