From 57cc4d45d52e0af562172ac4044f311e1bb00c64 Mon Sep 17 00:00:00 2001 From: nicm Date: Fri, 28 Aug 2015 13:01:03 +0000 Subject: Make session_update_activity more useful and use it in more places. --- session.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) (limited to 'session.c') diff --git a/session.c b/session.c index 5061083a..7572ac21 100644 --- a/session.c +++ b/session.c @@ -112,10 +112,6 @@ session_create(const char *name, int argc, char **argv, const char *path, s->references = 1; s->flags = 0; - if (gettimeofday(&s->creation_time, NULL) != 0) - fatal("gettimeofday failed"); - session_update_activity(s); - s->cwd = dup(cwd); s->curw = NULL; @@ -133,6 +129,10 @@ session_create(const char *name, int argc, char **argv, const char *path, memcpy(s->tio, tio, sizeof *s->tio); } + if (gettimeofday(&s->creation_time, NULL) != 0) + fatal("gettimeofday failed"); + session_update_activity(s, &s->creation_time); + s->sx = sx; s->sy = sy; @@ -224,12 +224,17 @@ session_check_name(const char *name) return (*name != '\0' && name[strcspn(name, ":.")] == '\0'); } -/* Update session active time. */ +/* Update activity time. */ void -session_update_activity(struct session *s) +session_update_activity(struct session *s, struct timeval *from) { - if (gettimeofday(&s->activity_time, NULL) != 0) - fatal("gettimeofday"); + struct timeval *last = &s->last_activity_time; + + memcpy(last, &s->activity_time, sizeof *last); + if (from == NULL) + gettimeofday(&s->activity_time, NULL); + else + memcpy(&s->activity_time, from, sizeof s->activity_time); } /* Find the next usable session. */ -- cgit From f6a0f8730efab9c52eaccbb62b5b1d27e8be7949 Mon Sep 17 00:00:00 2001 From: nicm Date: Fri, 28 Aug 2015 13:12:20 +0000 Subject: Per-session timers for locking, and remove the global one-second timer. --- session.c | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) (limited to 'session.c') diff --git a/session.c b/session.c index 7572ac21..041adf2d 100644 --- a/session.c +++ b/session.c @@ -33,6 +33,8 @@ struct session_groups session_groups; void session_free(int, short, void *); +void session_lock_timer(int, short, void *); + struct winlink *session_next_alert(struct winlink *); struct winlink *session_previous_alert(struct winlink *); @@ -108,7 +110,7 @@ session_create(const char *name, int argc, char **argv, const char *path, struct session *s; struct winlink *wl; - s = xmalloc(sizeof *s); + s = xcalloc(1, sizeof *s); s->references = 1; s->flags = 0; @@ -149,6 +151,10 @@ session_create(const char *name, int argc, char **argv, const char *path, } RB_INSERT(sessions, &sessions, s); + if (gettimeofday(&s->creation_time, NULL) != 0) + fatal("gettimeofday failed"); + session_update_activity(s, &s->creation_time); + if (argc >= 0) { wl = session_new(s, NULL, argc, argv, path, cwd, idx, cause); if (wl == NULL) { @@ -200,6 +206,9 @@ session_destroy(struct session *s) free(s->tio); + if (event_initialized(&s->lock_timer)) + event_del(&s->lock_timer); + session_group_remove(s); environ_free(&s->environ); options_free(&s->options); @@ -224,17 +233,46 @@ session_check_name(const char *name) return (*name != '\0' && name[strcspn(name, ":.")] == '\0'); } +/* Lock session if it has timed out. */ +void +session_lock_timer(unused int fd, unused short events, void *arg) +{ + struct session *s = arg; + + if (s->flags & SESSION_UNATTACHED) + return; + + log_debug("session %s locked, activity time %lld", s->name, + (long long)s->activity_time.tv_sec); + + server_lock_session(s); + recalculate_sizes(); +} + /* Update activity time. */ void session_update_activity(struct session *s, struct timeval *from) { struct timeval *last = &s->last_activity_time; + struct timeval tv; memcpy(last, &s->activity_time, sizeof *last); if (from == NULL) gettimeofday(&s->activity_time, NULL); else memcpy(&s->activity_time, from, sizeof s->activity_time); + + if (evtimer_initialized(&s->lock_timer)) + evtimer_del(&s->lock_timer); + else + evtimer_set(&s->lock_timer, session_lock_timer, s); + + if (~s->flags & SESSION_UNATTACHED) { + timerclear(&tv); + tv.tv_sec = options_get_number(&s->options, "lock-after-time"); + if (tv.tv_sec != 0) + evtimer_add(&s->lock_timer, &tv); + } } /* Find the next usable session. */ -- cgit From ed2a486f46010559926f49b2f95fc3ceb61fe105 Mon Sep 17 00:00:00 2001 From: nicm Date: Fri, 28 Aug 2015 13:16:03 +0000 Subject: Don't leak name when freeing session, from Kuang-che Wu. --- session.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'session.c') diff --git a/session.c b/session.c index 041adf2d..c4e64e27 100644 --- a/session.c +++ b/session.c @@ -189,8 +189,10 @@ session_free(unused int fd, unused short events, void *arg) log_debug("sesson %s freed (%d references)", s->name, s->references); - if (s->references == 0) + if (s->references == 0) { + free(s->name); free(s); + } } /* Destroy a session. */ -- cgit