mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 00:56:10 +00:00 
			
		
		
		
	Per-session timers for locking, and remove the global one-second timer.
This commit is contained in:
		@@ -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. */
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user