mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 09:44:18 +00:00 
			
		
		
		
	Destroy panes immediately rather than checking them all every loop.
This commit is contained in:
		@@ -80,6 +80,7 @@ cmd_respawn_window_exec(struct cmd *self, struct cmd_ctx *ctx)
 | 
				
			|||||||
		ctx->error(ctx, "respawn window failed: %s", cause);
 | 
							ctx->error(ctx, "respawn window failed: %s", cause);
 | 
				
			||||||
		xfree(cause);
 | 
							xfree(cause);
 | 
				
			||||||
		environ_free(&env);
 | 
							environ_free(&env);
 | 
				
			||||||
 | 
							server_destroy_pane(wp);
 | 
				
			||||||
		return (-1);
 | 
							return (-1);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	layout_init(w);
 | 
						layout_init(w);
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										21
									
								
								server-fn.c
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								server-fn.c
									
									
									
									
									
								
							@@ -316,6 +316,27 @@ server_unlink_window(struct session *s, struct winlink *wl)
 | 
				
			|||||||
		server_redraw_session_group(s);
 | 
							server_redraw_session_group(s);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					server_destroy_pane(struct window_pane *wp)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct window	*w = wp->window;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						close(wp->fd);
 | 
				
			||||||
 | 
						bufferevent_free(wp->event);
 | 
				
			||||||
 | 
						wp->fd = -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (options_get_number(&w->options, "remain-on-exit"))
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						layout_close_pane(wp);
 | 
				
			||||||
 | 
						window_remove_pane(w, wp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (TAILQ_EMPTY(&w->panes))
 | 
				
			||||||
 | 
							server_kill_window(w);
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							server_redraw_window(w);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
server_destroy_session_group(struct session *s)
 | 
					server_destroy_session_group(struct session *s)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,7 +28,6 @@ int	server_window_check_bell(struct session *, struct window *);
 | 
				
			|||||||
int	server_window_check_activity(struct session *, struct window *);
 | 
					int	server_window_check_activity(struct session *, struct window *);
 | 
				
			||||||
int	server_window_check_content(
 | 
					int	server_window_check_content(
 | 
				
			||||||
	    struct session *, struct window *, struct window_pane *);
 | 
						    struct session *, struct window *, struct window_pane *);
 | 
				
			||||||
void	server_window_check_alive(struct window *);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Check if this window should suspend reading. */
 | 
					/* Check if this window should suspend reading. */
 | 
				
			||||||
int
 | 
					int
 | 
				
			||||||
@@ -90,8 +89,6 @@ server_window_loop(void)
 | 
				
			|||||||
				server_window_check_content(s, w, wp);
 | 
									server_window_check_content(s, w, wp);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		w->flags &= ~(WINDOW_BELL|WINDOW_ACTIVITY|WINDOW_CONTENT);
 | 
							w->flags &= ~(WINDOW_BELL|WINDOW_ACTIVITY|WINDOW_CONTENT);
 | 
				
			||||||
 | 
					 | 
				
			||||||
		server_window_check_alive(w);
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -228,62 +225,3 @@ server_window_check_content(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	return (1);
 | 
						return (1);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Check if window still exists. */
 | 
					 | 
				
			||||||
void
 | 
					 | 
				
			||||||
server_window_check_alive(struct window *w)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	struct window_pane	*wp, *wq;
 | 
					 | 
				
			||||||
	struct options		*oo = &w->options;
 | 
					 | 
				
			||||||
	struct session		*s;
 | 
					 | 
				
			||||||
	struct winlink		*wl;
 | 
					 | 
				
			||||||
	u_int		 	 i;
 | 
					 | 
				
			||||||
	int		 	 destroyed;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	destroyed = 1;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	wp = TAILQ_FIRST(&w->panes);
 | 
					 | 
				
			||||||
	while (wp != NULL) {
 | 
					 | 
				
			||||||
		wq = TAILQ_NEXT(wp, entry);
 | 
					 | 
				
			||||||
		/*
 | 
					 | 
				
			||||||
		 * If the pane has died and the remain-on-exit flag is not set,
 | 
					 | 
				
			||||||
		 * remove the pane; otherwise, if the flag is set, don't allow
 | 
					 | 
				
			||||||
		 * the window to be destroyed (or it'll close when the last
 | 
					 | 
				
			||||||
		 * pane dies).
 | 
					 | 
				
			||||||
		 */
 | 
					 | 
				
			||||||
		if (wp->fd == -1 && !options_get_number(oo, "remain-on-exit")) {
 | 
					 | 
				
			||||||
			layout_close_pane(wp);
 | 
					 | 
				
			||||||
			window_remove_pane(w, wp);
 | 
					 | 
				
			||||||
			server_redraw_window(w);
 | 
					 | 
				
			||||||
		} else 
 | 
					 | 
				
			||||||
			destroyed = 0;
 | 
					 | 
				
			||||||
		wp = wq;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (!destroyed)
 | 
					 | 
				
			||||||
		return;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	for (i = 0; i < ARRAY_LENGTH(&sessions); i++) {
 | 
					 | 
				
			||||||
		s = ARRAY_ITEM(&sessions, i);
 | 
					 | 
				
			||||||
		if (s == NULL)
 | 
					 | 
				
			||||||
			continue;
 | 
					 | 
				
			||||||
		if (!session_has(s, w))
 | 
					 | 
				
			||||||
			continue;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	restart:
 | 
					 | 
				
			||||||
		/* Detach window and either redraw or kill clients. */
 | 
					 | 
				
			||||||
		RB_FOREACH(wl, winlinks, &s->windows) {
 | 
					 | 
				
			||||||
			if (wl->window != w)
 | 
					 | 
				
			||||||
				continue;
 | 
					 | 
				
			||||||
			if (session_detach(s, wl)) {
 | 
					 | 
				
			||||||
				server_destroy_session_group(s);
 | 
					 | 
				
			||||||
				break;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			server_redraw_session(s);
 | 
					 | 
				
			||||||
			server_status_session_group(s);
 | 
					 | 
				
			||||||
			goto restart;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	recalculate_sizes();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										6
									
								
								server.c
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								server.c
									
									
									
									
									
								
							@@ -335,7 +335,6 @@ server_accept_callback(int fd, short events, unused void *data)
 | 
				
			|||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	server_client_create(newfd);
 | 
						server_client_create(newfd);
 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Set up server signal handling. */
 | 
					/* Set up server signal handling. */
 | 
				
			||||||
@@ -449,9 +448,8 @@ server_child_exited(pid_t pid, int status)
 | 
				
			|||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		TAILQ_FOREACH(wp, &w->panes, entry) {
 | 
							TAILQ_FOREACH(wp, &w->panes, entry) {
 | 
				
			||||||
			if (wp->pid == pid) {
 | 
								if (wp->pid == pid) {
 | 
				
			||||||
				close(wp->fd);
 | 
									server_destroy_pane(wp);
 | 
				
			||||||
				bufferevent_free(wp->event);
 | 
									break;
 | 
				
			||||||
				wp->fd = -1;
 | 
					 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}		
 | 
						}		
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								tmux.h
									
									
									
									
									
								
							@@ -1590,6 +1590,7 @@ void	 server_kill_window(struct window *);
 | 
				
			|||||||
int	 server_link_window(struct session *,
 | 
					int	 server_link_window(struct session *,
 | 
				
			||||||
	     struct winlink *, struct session *, int, int, int, char **);
 | 
						     struct winlink *, struct session *, int, int, int, char **);
 | 
				
			||||||
void	 server_unlink_window(struct session *, struct winlink *);
 | 
					void	 server_unlink_window(struct session *, struct winlink *);
 | 
				
			||||||
 | 
					void	 server_destroy_pane(struct window_pane *);
 | 
				
			||||||
void	 server_destroy_session_group(struct session *);
 | 
					void	 server_destroy_session_group(struct session *);
 | 
				
			||||||
void	 server_destroy_session(struct session *);
 | 
					void	 server_destroy_session(struct session *);
 | 
				
			||||||
void	 server_set_identify(struct client *);
 | 
					void	 server_set_identify(struct client *);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user