~ruther/dwl

26504f9a6f93e5b14819d5ed84dd27d3fbb41f3f — Leonardo Hernández Hernández 9 months ago 6f34a6d
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
1 files changed, 2 insertions(+), 14 deletions(-)

M dwl.c
M dwl.c => dwl.c +2 -14
@@ 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