mirror of
https://github.com/tmux/tmux.git
synced 2024-12-12 17:38:48 +00:00
Per-session timers for locking, and remove the global one-second timer.
This commit is contained in:
parent
57cc4d45d5
commit
f6a0f8730e
@ -176,7 +176,7 @@ cmd_set_option_exec(struct cmd *self, struct cmd_q *cmdq)
|
||||
return (CMD_RETURN_ERROR);
|
||||
}
|
||||
|
||||
/* Start or stop timers when name or status options changed. */
|
||||
/* Start or stop timers if necessary. */
|
||||
if (strcmp(oe->name, "automatic-rename") == 0) {
|
||||
RB_FOREACH(w, windows, &windows) {
|
||||
if (options_get_number(&w->options, "automatic-rename"))
|
||||
|
45
server.c
45
server.c
@ -46,7 +46,6 @@ struct clients clients;
|
||||
int server_fd;
|
||||
int server_shutdown;
|
||||
struct event server_ev_accept;
|
||||
struct event server_ev_second;
|
||||
|
||||
struct session *marked_session;
|
||||
struct winlink *marked_winlink;
|
||||
@ -163,9 +162,8 @@ server_create_socket(void)
|
||||
int
|
||||
server_start(int lockfd, char *lockfile)
|
||||
{
|
||||
int pair[2];
|
||||
struct timeval tv;
|
||||
char *cause;
|
||||
int pair[2];
|
||||
char *cause;
|
||||
|
||||
/* The first client is special and gets a socketpair; create it. */
|
||||
if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, pair) != 0)
|
||||
@ -243,11 +241,6 @@ server_start(int lockfd, char *lockfile)
|
||||
|
||||
server_add_accept(0);
|
||||
|
||||
memset(&tv, 0, sizeof tv);
|
||||
tv.tv_sec = 1;
|
||||
evtimer_set(&server_ev_second, server_second_callback, NULL);
|
||||
evtimer_add(&server_ev_second, &tv);
|
||||
|
||||
set_signals(server_signal_callback);
|
||||
server_loop();
|
||||
status_prompt_save_history();
|
||||
@ -498,37 +491,3 @@ server_child_stopped(pid_t pid, int status)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Handle once-per-second timer events. */
|
||||
void
|
||||
server_second_callback(unused int fd, unused short events, unused void *arg)
|
||||
{
|
||||
struct timeval tv;
|
||||
|
||||
server_lock_sessions();
|
||||
|
||||
evtimer_del(&server_ev_second);
|
||||
memset(&tv, 0, sizeof tv);
|
||||
tv.tv_sec = 1;
|
||||
evtimer_add(&server_ev_second, &tv);
|
||||
}
|
||||
|
||||
/* Lock any sessions which have timed out. */
|
||||
void
|
||||
server_lock_sessions(void)
|
||||
{
|
||||
struct session *s;
|
||||
int timeout;
|
||||
time_t t;
|
||||
|
||||
t = time(NULL);
|
||||
RB_FOREACH(s, sessions, &sessions) {
|
||||
if (s->flags & SESSION_UNATTACHED)
|
||||
continue;
|
||||
timeout = options_get_number(&s->options, "lock-after-time");
|
||||
if (timeout > 0 && t > s->activity_time.tv_sec + timeout) {
|
||||
server_lock_session(s);
|
||||
recalculate_sizes();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
40
session.c
40
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. */
|
||||
|
Loading…
Reference in New Issue
Block a user