summaryrefslogtreecommitdiffstats
path: root/usr.bin/tmux/session.c
diff options
context:
space:
mode:
authornicm <nicm@openbsd.org>2009-09-07 21:01:50 +0000
committernicm <nicm@openbsd.org>2009-09-07 21:01:50 +0000
commit7255ff9076cd884c3e6ea8562c914cfd22455b69 (patch)
tree7a31f806c62af72348aafa65f292e687b0ac24d4 /usr.bin/tmux/session.c
parentDon't print package comment when -q is given, and no other option is (diff)
downloadwireguard-openbsd-7255ff9076cd884c3e6ea8562c914cfd22455b69.tar.xz
wireguard-openbsd-7255ff9076cd884c3e6ea8562c914cfd22455b69.zip
Reference count clients and sessions rather than relying on a saved index for
cmd-choose-*.
Diffstat (limited to 'usr.bin/tmux/session.c')
-rw-r--r--usr.bin/tmux/session.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/usr.bin/tmux/session.c b/usr.bin/tmux/session.c
index 6058acf9128..6fae595e32e 100644
--- a/usr.bin/tmux/session.c
+++ b/usr.bin/tmux/session.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: session.c,v 1.6 2009/09/01 13:09:49 nicm Exp $ */
+/* $OpenBSD: session.c,v 1.7 2009/09/07 21:01:50 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -28,6 +28,7 @@
/* Global session list. */
struct sessions sessions;
+struct sessions dead_sessions;
struct winlink *session_next_activity(struct session *, struct winlink *);
struct winlink *session_previous_activity(struct session *, struct winlink *);
@@ -121,14 +122,19 @@ session_create(const char *name, const char *cmd, const char *cwd,
u_int i;
s = xmalloc(sizeof *s);
+ s->references = 0;
s->flags = 0;
+
if (gettimeofday(&s->tv, NULL) != 0)
fatal("gettimeofday");
+
s->curw = NULL;
SLIST_INIT(&s->lastw);
RB_INIT(&s->windows);
SLIST_INIT(&s->alerts);
+
paste_init_stack(&s->buffers);
+
options_init(&s->options, &global_s_options);
environ_init(&s->environ);
if (env != NULL)
@@ -187,7 +193,16 @@ session_destroy(struct session *s)
winlink_remove(&s->windows, RB_ROOT(&s->windows));
xfree(s->name);
- xfree(s);
+
+ for (i = 0; i < ARRAY_LENGTH(&dead_sessions); i++) {
+ if (ARRAY_ITEM(&dead_sessions, i) == NULL) {
+ ARRAY_SET(&dead_sessions, i, s);
+ break;
+ }
+ }
+ if (i == ARRAY_LENGTH(&dead_sessions))
+ ARRAY_ADD(&dead_sessions, s);
+ s->flags |= SESSION_DEAD;
}
/* Find session index. */