mirror of
				https://github.com/tmux/tmux.git
				synced 2025-10-26 12:27:15 +00:00 
			
		
		
		
	Sync OpenBSD patchset 535:
Destroy panes immediately rather than checking them all every loop.
This commit is contained in:
		| @@ -1,4 +1,4 @@ | ||||
| /* $Id: cmd-respawn-window.c,v 1.22 2009-09-16 12:36:27 nicm Exp $ */ | ||||
| /* $Id: cmd-respawn-window.c,v 1.23 2009-11-14 17:48:39 tcunha Exp $ */ | ||||
|  | ||||
| /* | ||||
|  * Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net> | ||||
| @@ -80,6 +80,7 @@ cmd_respawn_window_exec(struct cmd *self, struct cmd_ctx *ctx) | ||||
| 		ctx->error(ctx, "respawn window failed: %s", cause); | ||||
| 		xfree(cause); | ||||
| 		environ_free(&env); | ||||
| 		server_destroy_pane(wp); | ||||
| 		return (-1); | ||||
| 	} | ||||
| 	layout_init(w); | ||||
|   | ||||
							
								
								
									
										23
									
								
								server-fn.c
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								server-fn.c
									
									
									
									
									
								
							| @@ -1,4 +1,4 @@ | ||||
| /* $Id: server-fn.c,v 1.96 2009-11-08 23:11:23 tcunha Exp $ */ | ||||
| /* $Id: server-fn.c,v 1.97 2009-11-14 17:48:39 tcunha Exp $ */ | ||||
|  | ||||
| /* | ||||
|  * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> | ||||
| @@ -316,6 +316,27 @@ server_unlink_window(struct session *s, struct winlink *wl) | ||||
| 		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 | ||||
| server_destroy_session_group(struct session *s) | ||||
| { | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| /* $Id: server-window.c,v 1.11 2009-11-08 23:35:53 tcunha Exp $ */ | ||||
| /* $Id: server-window.c,v 1.12 2009-11-14 17:48:39 tcunha Exp $ */ | ||||
|  | ||||
| /* | ||||
|  * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> | ||||
| @@ -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_content( | ||||
| 	    struct session *, struct window *, struct window_pane *); | ||||
| void	server_window_check_alive(struct window *); | ||||
|  | ||||
| /* Check if this window should suspend reading. */ | ||||
| int | ||||
| @@ -90,8 +89,6 @@ server_window_loop(void) | ||||
| 				server_window_check_content(s, w, wp); | ||||
| 		} | ||||
| 		w->flags &= ~(WINDOW_BELL|WINDOW_ACTIVITY|WINDOW_CONTENT); | ||||
|  | ||||
| 		server_window_check_alive(w); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @@ -228,62 +225,3 @@ server_window_check_content( | ||||
|  | ||||
| 	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(); | ||||
| } | ||||
|   | ||||
							
								
								
									
										8
									
								
								server.c
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								server.c
									
									
									
									
									
								
							| @@ -1,4 +1,4 @@ | ||||
| /* $Id: server.c,v 1.228 2009-11-13 16:52:46 tcunha Exp $ */ | ||||
| /* $Id: server.c,v 1.229 2009-11-14 17:48:39 tcunha Exp $ */ | ||||
|  | ||||
| /* | ||||
|  * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> | ||||
| @@ -353,7 +353,6 @@ server_accept_callback(int fd, short events, unused void *data) | ||||
| 		return; | ||||
| 	} | ||||
| 	server_client_create(newfd); | ||||
|  | ||||
| } | ||||
|  | ||||
| /* Set up server signal handling. */ | ||||
| @@ -467,9 +466,8 @@ server_child_exited(pid_t pid, int status) | ||||
| 			continue; | ||||
| 		TAILQ_FOREACH(wp, &w->panes, entry) { | ||||
| 			if (wp->pid == pid) { | ||||
| 				close(wp->fd); | ||||
| 				bufferevent_free(wp->event); | ||||
| 				wp->fd = -1; | ||||
| 				server_destroy_pane(wp); | ||||
| 				break; | ||||
| 			} | ||||
| 		} | ||||
| 	}		 | ||||
|   | ||||
							
								
								
									
										3
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								tmux.h
									
									
									
									
									
								
							| @@ -1,4 +1,4 @@ | ||||
| /* $Id: tmux.h,v 1.514 2009-11-13 16:58:24 tcunha Exp $ */ | ||||
| /* $Id: tmux.h,v 1.515 2009-11-14 17:48:39 tcunha Exp $ */ | ||||
|  | ||||
| /* | ||||
|  * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> | ||||
| @@ -1589,6 +1589,7 @@ void	 server_kill_window(struct window *); | ||||
| int	 server_link_window(struct session *, | ||||
| 	     struct winlink *, struct session *, int, int, int, char **); | ||||
| 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(struct session *); | ||||
| void	 server_set_identify(struct client *); | ||||
|   | ||||
							
								
								
									
										6
									
								
								window.c
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								window.c
									
									
									
									
									
								
							| @@ -1,4 +1,4 @@ | ||||
| /* $Id: window.c,v 1.121 2009-11-08 23:22:24 tcunha Exp $ */ | ||||
| /* $Id: window.c,v 1.122 2009-11-14 17:48:39 tcunha Exp $ */ | ||||
|  | ||||
| /* | ||||
|  * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> | ||||
| @@ -592,9 +592,7 @@ window_pane_error_callback( | ||||
| { | ||||
| 	struct window_pane *wp = data; | ||||
|  | ||||
| 	close(wp->fd); | ||||
| 	bufferevent_free(wp->event); | ||||
| 	wp->fd = -1; | ||||
| 	server_destroy_pane(wp); | ||||
| } | ||||
|  | ||||
| void | ||||
|   | ||||
		Reference in New Issue
	
	Block a user