mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-03 16:46:18 +00:00 
			
		
		
		
	Store sessions in an RB tree by name rather than a list, this is tidier
and allows them to easily be shown sorted in various lists (list-sessions/choose-sessions). Keep a session index which is used in a couple of places internally but make it an ever-increasing number rather than filling in gaps with new sessions.
This commit is contained in:
		
							
								
								
									
										59
									
								
								server.c
									
									
									
									
									
								
							
							
						
						
									
										59
									
								
								server.c
									
									
									
									
									
								
							@@ -147,8 +147,8 @@ server_start(void)
 | 
			
		||||
	ARRAY_INIT(&windows);
 | 
			
		||||
	ARRAY_INIT(&clients);
 | 
			
		||||
	ARRAY_INIT(&dead_clients);
 | 
			
		||||
	ARRAY_INIT(&sessions);
 | 
			
		||||
	ARRAY_INIT(&dead_sessions);
 | 
			
		||||
	RB_INIT(&sessions);
 | 
			
		||||
	RB_INIT(&dead_sessions);
 | 
			
		||||
	TAILQ_INIT(&session_groups);
 | 
			
		||||
	mode_key_init_trees();
 | 
			
		||||
	key_bindings_init();
 | 
			
		||||
@@ -174,8 +174,8 @@ server_start(void)
 | 
			
		||||
	 * If there is a session already, put the current window and pane into
 | 
			
		||||
	 * more mode.
 | 
			
		||||
	 */
 | 
			
		||||
	if (!ARRAY_EMPTY(&sessions) && !ARRAY_EMPTY(&cfg_causes)) {
 | 
			
		||||
		wp = ARRAY_FIRST(&sessions)->curw->window->active;
 | 
			
		||||
	if (!RB_EMPTY(&sessions) && !ARRAY_EMPTY(&cfg_causes)) {
 | 
			
		||||
		wp = RB_MIN(sessions, &sessions)->curw->window->active;
 | 
			
		||||
		window_pane_set_mode(wp, &window_copy_mode);
 | 
			
		||||
		window_copy_init_for_output(wp);
 | 
			
		||||
		for (i = 0; i < ARRAY_LENGTH(&cfg_causes); i++) {
 | 
			
		||||
@@ -223,10 +223,8 @@ server_should_shutdown(void)
 | 
			
		||||
	u_int	i;
 | 
			
		||||
 | 
			
		||||
	if (!options_get_number(&global_options, "exit-unattached")) {
 | 
			
		||||
		for (i = 0; i < ARRAY_LENGTH(&sessions); i++) {
 | 
			
		||||
			if (ARRAY_ITEM(&sessions, i) != NULL)
 | 
			
		||||
				return (0);
 | 
			
		||||
		}
 | 
			
		||||
		if (!RB_EMPTY(&sessions))
 | 
			
		||||
			return (0);
 | 
			
		||||
	}
 | 
			
		||||
	for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
 | 
			
		||||
		if (ARRAY_ITEM(&clients, i) != NULL)
 | 
			
		||||
@@ -240,7 +238,7 @@ void
 | 
			
		||||
server_send_shutdown(void)
 | 
			
		||||
{
 | 
			
		||||
	struct client	*c;
 | 
			
		||||
	struct session	*s;
 | 
			
		||||
	struct session	*s, *next_s;
 | 
			
		||||
	u_int		 i;
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
 | 
			
		||||
@@ -254,9 +252,11 @@ server_send_shutdown(void)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < ARRAY_LENGTH(&sessions); i++) {
 | 
			
		||||
		if ((s = ARRAY_ITEM(&sessions, i)) != NULL)
 | 
			
		||||
			session_destroy(s);
 | 
			
		||||
	s = RB_MIN(sessions, &sessions);
 | 
			
		||||
	while (s != NULL) {
 | 
			
		||||
		next_s = RB_NEXT(sessions, &sessions, s);
 | 
			
		||||
		session_destroy(s);
 | 
			
		||||
		s = next_s;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -264,16 +264,19 @@ server_send_shutdown(void)
 | 
			
		||||
void
 | 
			
		||||
server_clean_dead(void)
 | 
			
		||||
{
 | 
			
		||||
	struct session	*s;
 | 
			
		||||
	struct session	*s, *next_s;
 | 
			
		||||
	struct client	*c;
 | 
			
		||||
	u_int		 i;
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < ARRAY_LENGTH(&dead_sessions); i++) {
 | 
			
		||||
		s = ARRAY_ITEM(&dead_sessions, i);
 | 
			
		||||
		if (s == NULL || s->references != 0)
 | 
			
		||||
			continue;
 | 
			
		||||
		ARRAY_SET(&dead_sessions, i, NULL);
 | 
			
		||||
		xfree(s);
 | 
			
		||||
	s = RB_MIN(sessions, &dead_sessions);
 | 
			
		||||
	while (s != NULL) {
 | 
			
		||||
		next_s = RB_NEXT(sessions, &dead_sessions, s);
 | 
			
		||||
		if (s->references == 0) {
 | 
			
		||||
			RB_REMOVE(sessions, &dead_sessions, s);
 | 
			
		||||
			xfree(s->name);
 | 
			
		||||
			xfree(s);
 | 
			
		||||
		}
 | 
			
		||||
		s = next_s;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < ARRAY_LENGTH(&dead_clients); i++) {
 | 
			
		||||
@@ -290,15 +293,13 @@ void
 | 
			
		||||
server_update_socket(void)
 | 
			
		||||
{
 | 
			
		||||
	struct session	*s;
 | 
			
		||||
	u_int		 i;
 | 
			
		||||
	static int	 last = -1;
 | 
			
		||||
	int		 n, mode;
 | 
			
		||||
	struct stat      sb;
 | 
			
		||||
 | 
			
		||||
	n = 0;
 | 
			
		||||
	for (i = 0; i < ARRAY_LENGTH(&sessions); i++) {
 | 
			
		||||
		s = ARRAY_ITEM(&sessions, i);
 | 
			
		||||
		if (s != NULL && !(s->flags & SESSION_UNATTACHED)) {
 | 
			
		||||
	RB_FOREACH(s, sessions, &sessions) {
 | 
			
		||||
		if (!(s->flags & SESSION_UNATTACHED)) {
 | 
			
		||||
			n++;
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
@@ -485,15 +486,11 @@ void
 | 
			
		||||
server_lock_server(void)
 | 
			
		||||
{
 | 
			
		||||
	struct session  *s;
 | 
			
		||||
	u_int            i;
 | 
			
		||||
	int		 timeout;
 | 
			
		||||
	time_t           t;
 | 
			
		||||
 | 
			
		||||
	t = time(NULL);
 | 
			
		||||
	for (i = 0; i < ARRAY_LENGTH(&sessions); i++) {
 | 
			
		||||
		if ((s = ARRAY_ITEM(&sessions, i)) == NULL)
 | 
			
		||||
			continue;
 | 
			
		||||
 | 
			
		||||
	RB_FOREACH(s, sessions, &sessions) {
 | 
			
		||||
		if (s->flags & SESSION_UNATTACHED) {
 | 
			
		||||
			if (gettimeofday(&s->activity_time, NULL) != 0)
 | 
			
		||||
				fatal("gettimeofday failed");
 | 
			
		||||
@@ -514,15 +511,11 @@ void
 | 
			
		||||
server_lock_sessions(void)
 | 
			
		||||
{
 | 
			
		||||
	struct session  *s;
 | 
			
		||||
	u_int		 i;
 | 
			
		||||
	int		 timeout;
 | 
			
		||||
	time_t		 t;
 | 
			
		||||
 | 
			
		||||
	t = time(NULL);
 | 
			
		||||
	for (i = 0; i < ARRAY_LENGTH(&sessions); i++) {
 | 
			
		||||
		if ((s = ARRAY_ITEM(&sessions, i)) == NULL)
 | 
			
		||||
			continue;
 | 
			
		||||
 | 
			
		||||
	RB_FOREACH(s, sessions, &sessions) {
 | 
			
		||||
		if (s->flags & SESSION_UNATTACHED) {
 | 
			
		||||
			if (gettimeofday(&s->activity_time, NULL) != 0)
 | 
			
		||||
				fatal("gettimeofday failed");
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user