do not call waitid(2) in the signal handler when Xwayland is enabled
waitid(2) is not a async-signal-safe function acording to signal-safety(7) We can stop doing this because wlroots!4926 allows compositors to install signal handlers for SIGCHLD. References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4926
This commit is contained in:
		
							
								
								
									
										16
									
								
								dwl.c
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								dwl.c
									
									
									
									
									
								
							| @@ -1486,22 +1486,10 @@ gpureset(struct wl_listener *listener, void *data) | ||||
| void | ||||
| handlesig(int signo) | ||||
| { | ||||
| 	if (signo == SIGCHLD) { | ||||
| #ifdef XWAYLAND | ||||
| 		siginfo_t in; | ||||
| 		/* wlroots expects to reap the XWayland process itself, so we | ||||
| 		 * use WNOWAIT to keep the child waitable until we know it's not | ||||
| 		 * XWayland. | ||||
| 		 */ | ||||
| 		while (!waitid(P_ALL, 0, &in, WEXITED|WNOHANG|WNOWAIT) && in.si_pid | ||||
| 				&& (!xwayland || in.si_pid != xwayland->server->pid)) | ||||
| 			waitpid(in.si_pid, NULL, 0); | ||||
| #else | ||||
| 	if (signo == SIGCHLD) | ||||
| 		while (waitpid(-1, NULL, WNOHANG) > 0); | ||||
| #endif | ||||
| 	} else if (signo == SIGINT || signo == SIGTERM) { | ||||
| 	else if (signo == SIGINT || signo == SIGTERM) | ||||
| 		quit(NULL); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void | ||||
|   | ||||
		Reference in New Issue
	
	Block a user