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:
		
							
								
								
									
										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();
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user