mirror of
				https://gitlab.freedesktop.org/wayland/wayland.git
				synced 2025-11-03 09:01:42 -05:00 
			
		
		
		
	server: add a safer signal type and port wl_display to it
wl_list_for_each_safe, which is used by wl_signal_emit is not really safe. If a signal has two listeners, and the first one removes and re-inits the second one, it would enter an infinite loop, which was hit in weston on resource destruction, which emits a signal. This commit adds a new version of wl_signal, called wl_priv_signal, which is private in wayland-server.c and which does not have this problem. The old wl_signal cannot be improved without breaking backwards compatibility. Signed-off-by: Giulio Camuffo <giulio.camuffo@kdab.com> Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
This commit is contained in:
		
							parent
							
								
									23d8bc5a64
								
							
						
					
					
						commit
						5e6eb03229
					
				
					 4 changed files with 459 additions and 9 deletions
				
			
		| 
						 | 
				
			
			@ -35,6 +35,7 @@
 | 
			
		|||
#define WL_HIDE_DEPRECATED 1
 | 
			
		||||
 | 
			
		||||
#include "wayland-util.h"
 | 
			
		||||
#include "wayland-server-core.h"
 | 
			
		||||
 | 
			
		||||
/* Invalid memory address */
 | 
			
		||||
#define WL_ARRAY_POISON_PTR (void *) 4
 | 
			
		||||
| 
						 | 
				
			
			@ -233,4 +234,21 @@ zalloc(size_t s)
 | 
			
		|||
	return calloc(1, s);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct wl_priv_signal {
 | 
			
		||||
	struct wl_list listener_list;
 | 
			
		||||
	struct wl_list emit_list;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
wl_priv_signal_init(struct wl_priv_signal *signal);
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
wl_priv_signal_add(struct wl_priv_signal *signal, struct wl_listener *listener);
 | 
			
		||||
 | 
			
		||||
struct wl_listener *
 | 
			
		||||
wl_priv_signal_get(struct wl_priv_signal *signal, wl_notify_func_t notify);
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
wl_priv_signal_emit(struct wl_priv_signal *signal, void *data);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue