mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 09:26:05 +00:00 
			
		
		
		
	Unify the way sessions are used by callbacks - store the address and use
the reference count, then check it is still on the global sessions list in the callback.
This commit is contained in:
		@@ -129,20 +129,19 @@ void
 | 
			
		||||
cmd_choose_window_callback(void *data, int idx)
 | 
			
		||||
{
 | 
			
		||||
	struct cmd_choose_window_data	*cdata = data;
 | 
			
		||||
	struct session			*s = cdata->session;
 | 
			
		||||
	struct cmd_list			*cmdlist;
 | 
			
		||||
	struct cmd_ctx			 ctx;
 | 
			
		||||
	char				*target, *template, *cause;
 | 
			
		||||
 | 
			
		||||
	if (idx == -1)
 | 
			
		||||
		return;
 | 
			
		||||
	if (!session_alive(s))
 | 
			
		||||
		return;
 | 
			
		||||
	if (cdata->client->flags & CLIENT_DEAD)
 | 
			
		||||
		return;
 | 
			
		||||
	if (cdata->session->flags & SESSION_DEAD)
 | 
			
		||||
		return;
 | 
			
		||||
	if (cdata->client->session != cdata->session)
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	xasprintf(&target, "%s:%d", cdata->session->name, idx);
 | 
			
		||||
	xasprintf(&target, "%s:%d", s->name, idx);
 | 
			
		||||
	template = cmd_template_replace(cdata->template, target, 1);
 | 
			
		||||
	xfree(target);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -30,6 +30,7 @@
 | 
			
		||||
int	cmd_find_window_exec(struct cmd *, struct cmd_ctx *);
 | 
			
		||||
 | 
			
		||||
void	cmd_find_window_callback(void *, int);
 | 
			
		||||
void	cmd_find_window_free(void *);
 | 
			
		||||
 | 
			
		||||
const struct cmd_entry cmd_find_window_entry = {
 | 
			
		||||
	"find-window", "findw",
 | 
			
		||||
@@ -43,7 +44,7 @@ const struct cmd_entry cmd_find_window_entry = {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct cmd_find_window_data {
 | 
			
		||||
	u_int	session;
 | 
			
		||||
	struct session	*session;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
@@ -134,11 +135,11 @@ cmd_find_window_exec(struct cmd *self, struct cmd_ctx *ctx)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	cdata = xmalloc(sizeof *cdata);
 | 
			
		||||
	if (session_index(s, &cdata->session) != 0)
 | 
			
		||||
		fatalx("session not found");
 | 
			
		||||
	cdata->session = s;
 | 
			
		||||
	cdata->session->references++;
 | 
			
		||||
 | 
			
		||||
	window_choose_ready(
 | 
			
		||||
	    wl->window->active, 0, cmd_find_window_callback, xfree, cdata);
 | 
			
		||||
	window_choose_ready(wl->window->active,
 | 
			
		||||
	    0, cmd_find_window_callback, cmd_find_window_free, cdata);
 | 
			
		||||
 | 
			
		||||
out:
 | 
			
		||||
	ARRAY_FREE(&list_idx);
 | 
			
		||||
@@ -151,12 +152,24 @@ void
 | 
			
		||||
cmd_find_window_callback(void *data, int idx)
 | 
			
		||||
{
 | 
			
		||||
	struct cmd_find_window_data	*cdata = data;
 | 
			
		||||
	struct session			*s;
 | 
			
		||||
	struct session			*s = cdata->session;
 | 
			
		||||
 | 
			
		||||
	if (idx != -1 && cdata->session <= ARRAY_LENGTH(&sessions) - 1) {
 | 
			
		||||
		s = ARRAY_ITEM(&sessions, cdata->session);
 | 
			
		||||
		if (s != NULL && session_select(s, idx) == 0)
 | 
			
		||||
	if (idx == -1)
 | 
			
		||||
		return;
 | 
			
		||||
	if (!session_alive(s))
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	if (session_select(s, idx) == 0) {
 | 
			
		||||
		server_redraw_session(s);
 | 
			
		||||
		recalculate_sizes();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
cmd_find_window_free(void *data)
 | 
			
		||||
{
 | 
			
		||||
	struct cmd_find_window_data	*cdata = data;
 | 
			
		||||
 | 
			
		||||
	cdata->session->references--;
 | 
			
		||||
	xfree(cdata);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -81,6 +81,7 @@ cmd_load_buffer_exec(struct cmd *self, struct cmd_ctx *ctx)
 | 
			
		||||
 | 
			
		||||
		cdata = xmalloc(sizeof *cdata);
 | 
			
		||||
		cdata->session = s;
 | 
			
		||||
		cdata->session->references++;
 | 
			
		||||
		cdata->buffer = data->buffer;
 | 
			
		||||
		c->stdin_data = cdata;
 | 
			
		||||
		c->stdin_callback = cmd_load_buffer_callback;
 | 
			
		||||
@@ -144,7 +145,6 @@ cmd_load_buffer_callback(struct client *c, void *data)
 | 
			
		||||
	char				*pdata;
 | 
			
		||||
	size_t				 psize;
 | 
			
		||||
	u_int				 limit;
 | 
			
		||||
	int				 idx;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Event callback has already checked client is not dead and reduced
 | 
			
		||||
@@ -153,7 +153,7 @@ cmd_load_buffer_callback(struct client *c, void *data)
 | 
			
		||||
	c->flags |= CLIENT_EXIT;
 | 
			
		||||
 | 
			
		||||
	/* Does the target session still exist? */
 | 
			
		||||
	if (session_index(s, &idx) != 0)
 | 
			
		||||
	if (!session_alive(s))
 | 
			
		||||
		goto out;
 | 
			
		||||
 | 
			
		||||
	psize = EVBUFFER_LENGTH(c->stdin_event->input);
 | 
			
		||||
@@ -180,5 +180,6 @@ cmd_load_buffer_callback(struct client *c, void *data)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
out:
 | 
			
		||||
	cdata->session->references--;
 | 
			
		||||
	xfree(cdata);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										12
									
								
								session.c
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								session.c
									
									
									
									
									
								
							@@ -35,6 +35,18 @@ struct session_groups session_groups;
 | 
			
		||||
struct winlink *session_next_alert(struct winlink *);
 | 
			
		||||
struct winlink *session_previous_alert(struct winlink *);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Find if session is still alive. This is true if it is still on the global
 | 
			
		||||
 * sessions list.
 | 
			
		||||
 */
 | 
			
		||||
int
 | 
			
		||||
session_alive(struct session *s)
 | 
			
		||||
{
 | 
			
		||||
	u_int	idx;
 | 
			
		||||
 | 
			
		||||
	return (session_index(s, &idx) == 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Find session by name. */
 | 
			
		||||
struct session *
 | 
			
		||||
session_find(const char *name)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								tmux.h
									
									
									
									
									
								
							@@ -1968,6 +1968,7 @@ void clear_signals(int);
 | 
			
		||||
extern struct sessions sessions;
 | 
			
		||||
extern struct sessions dead_sessions;
 | 
			
		||||
extern struct session_groups session_groups;
 | 
			
		||||
int		 session_alive(struct session *);
 | 
			
		||||
struct session	*session_find(const char *);
 | 
			
		||||
struct session	*session_create(const char *, const char *, const char *,
 | 
			
		||||
		     struct environ *, struct termios *, int, u_int, u_int,
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user