Sync OpenBSD patchset 320:

Reference count clients and sessions rather than relying on a saved index for
cmd-choose-*.
This commit is contained in:
Tiago Cunha
2009-09-07 23:59:19 +00:00
parent 1de812d5a8
commit 930f67f474
7 changed files with 113 additions and 46 deletions

View File

@ -1,4 +1,4 @@
/* $Id: session.c,v 1.64 2009-09-02 01:05:55 tcunha Exp $ */
/* $Id: session.c,v 1.65 2009-09-07 23:59:19 tcunha Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -27,6 +27,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 *);
@ -120,14 +121,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)
@ -186,7 +192,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. */