summaryrefslogtreecommitdiffstats
path: root/session.c
diff options
context:
space:
mode:
authornicm <nicm>2015-06-05 18:18:32 +0000
committernicm <nicm>2015-06-05 18:18:32 +0000
commit641a9cd3f591b0ace3ae9947ebe6ab889b641eed (patch)
treee11dd1d51c0d86d3191991cf5290dd00af61709b /session.c
parent10e90ae01f53a67a1b7c3a2c498cefb73c6a23b4 (diff)
Similarly, for sessions use a callback to free rather than checking
every loop.
Diffstat (limited to 'session.c')
-rw-r--r--session.c31
1 files changed, 27 insertions, 4 deletions
diff --git a/session.c b/session.c
index 907bdee9..5061083a 100644
--- a/session.c
+++ b/session.c
@@ -27,12 +27,12 @@
#include "tmux.h"
-/* Global session list. */
struct sessions sessions;
-struct sessions dead_sessions;
u_int next_session_id;
struct session_groups session_groups;
+void session_free(int, short, void *);
+
struct winlink *session_next_alert(struct winlink *);
struct winlink *session_previous_alert(struct winlink *);
@@ -109,7 +109,7 @@ session_create(const char *name, int argc, char **argv, const char *path,
struct winlink *wl;
s = xmalloc(sizeof *s);
- s->references = 0;
+ s->references = 1;
s->flags = 0;
if (gettimeofday(&s->creation_time, NULL) != 0)
@@ -164,6 +164,29 @@ session_create(const char *name, int argc, char **argv, const char *path,
return (s);
}
+/* Remove a reference from a session. */
+void
+session_unref(struct session *s)
+{
+ log_debug("session %s has %d references", s->name, s->references);
+
+ s->references--;
+ if (s->references == 0)
+ event_once(-1, EV_TIMEOUT, session_free, s, NULL);
+}
+
+/* Free session. */
+void
+session_free(unused int fd, unused short events, void *arg)
+{
+ struct session *s = arg;
+
+ log_debug("sesson %s freed (%d references)", s->name, s->references);
+
+ if (s->references == 0)
+ free(s);
+}
+
/* Destroy a session. */
void
session_destroy(struct session *s)
@@ -191,7 +214,7 @@ session_destroy(struct session *s)
close(s->cwd);
- RB_INSERT(sessions, &dead_sessions, s);
+ session_unref(s);
}
/* Check a session name is valid: not empty and no colons or periods. */