Module Name: xsrc Committed By: martin Date: Thu Feb 4 17:15:55 UTC 2021
Modified Files: xsrc/external/mit/libXxf86dga/dist/src [netbsd-9]: XF86DGA.c Log Message: Pull up following revision(s) (requested by tsutsui in ticket #1194): external/mit/libXxf86dga/dist/src/XF86DGA.c: revision 1.3 Fix "no output of xdpyinfo(1) on redirect or pipe" problem. XF86cleanup() in libXxf86dga invoked via atexit(3) (or __attribute__((__destructor__)) in NetBSD xsrc) calls _exit(2) directly so fflush(3) via normal exit(3) is not called. Analyzed by rin@, ryo@, and soda@: https://mail-index.netbsd.org/tech-x11/2021/01/20/msg002192.html Should be pulled up to netbsd-9. XXX1: The original XF86cleanup() is not async-signale-safe. XXX2: XF86DGAGetVideo() implicitly overrides signal handlers. To generate a diff of this commit: cvs rdiff -u -r1.2 -r1.2.2.1 xsrc/external/mit/libXxf86dga/dist/src/XF86DGA.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: xsrc/external/mit/libXxf86dga/dist/src/XF86DGA.c diff -u xsrc/external/mit/libXxf86dga/dist/src/XF86DGA.c:1.2 xsrc/external/mit/libXxf86dga/dist/src/XF86DGA.c:1.2.2.1 --- xsrc/external/mit/libXxf86dga/dist/src/XF86DGA.c:1.2 Fri Jan 4 18:59:45 2019 +++ xsrc/external/mit/libXxf86dga/dist/src/XF86DGA.c Thu Feb 4 17:15:55 2021 @@ -650,14 +650,14 @@ static void #ifdef __NetBSD__ __attribute__ ((__destructor__)) #endif -XF86cleanup(int sig) +XF86cleanup_atexit(void) { ScrPtr sp; int i; static char beenhere = 0; if (beenhere) - _exit(3); + return; beenhere = 1; for (i = 0; i < numScrs; i++) { @@ -665,6 +665,14 @@ XF86cleanup(int sig) XF86DGADirectVideo(sp->display, sp->screen, 0); XSync(sp->display, False); } +} + +static void +XF86cleanup(int sig) +{ + /* XXX FIXME XF86cleanup_atexit() is not async-signal-safe */ + XF86cleanup_atexit(); + _exit(3); } @@ -707,7 +715,7 @@ XF86DGAGetVideo( if (!beenHere) { beenHere = 1; #ifndef __NetBSD__ - atexit((void(*)(void))XF86cleanup); + atexit((void(*)(void))XF86cleanup_atexit); #endif /* one shot XF86cleanup attempts */ signal(SIGSEGV, XF86cleanup);