diff options
author | nicm <nicm> | 2015-06-05 18:18:32 +0000 |
---|---|---|
committer | nicm <nicm> | 2015-06-05 18:18:32 +0000 |
commit | 641a9cd3f591b0ace3ae9947ebe6ab889b641eed (patch) | |
tree | e11dd1d51c0d86d3191991cf5290dd00af61709b /session.c | |
parent | 10e90ae01f53a67a1b7c3a2c498cefb73c6a23b4 (diff) | |
download | rtmux-641a9cd3f591b0ace3ae9947ebe6ab889b641eed.tar.gz rtmux-641a9cd3f591b0ace3ae9947ebe6ab889b641eed.tar.bz2 rtmux-641a9cd3f591b0ace3ae9947ebe6ab889b641eed.zip |
Similarly, for sessions use a callback to free rather than checking
every loop.
Diffstat (limited to 'session.c')
-rw-r--r-- | session.c | 31 |
1 files changed, 27 insertions, 4 deletions
@@ -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. */ |