On Nov 11 2022, Matthieu Herrb wrote: > On Fri, Nov 11, 2022 at 03:17:21PM +0100, Walter Alejandro Iglesias wrote: > > On Nov 11 2022, Matthieu Herrb wrote: > > > Hi, > > > > > > So the patch provided by Adam Jackson upstreams is completely buggy. > > > > > > - the logic to setup the new locking function was busted > > > - I've observed cases where even the XGetIfEvent() function gets > > > re-rentered. So the flags does in fact need to be a counter. > > > > > > New patch which works for me with fvwm2... > > > > > > Testing is welcome... > > > > Unfortunately I still can reproduce the bug. > > > > This patch also makes firefox crash, (I'm not sure if it's because of > > firefox or cwm). After reinstalling xenocara from the snapshots > > packages I could run firefox again. > > > > fvwm is giving a lot of problems lately, there's also this drm bug I > > reported: > > > > https://marc.info/?l=openbsd-bugs&m=166332904632232&w=2 > > > > Now FvwmIcons is crashing on fvwm3... I'm giving up with fvwm, I'm more > > comfortable with cwm. > > Ok, I've figured out the cwm + firefox issue. There's also a > XInternalLock that needs to be neutered in the X*IfEvent() callbacks. > > New diff, on which I've left my debug printfs. If you get other > crashes it may be interesting to look in .xsession-errors...
This patch solved the firefox cwm issue. Firefox shows this when it starts: ~$ firefox XXX _XLockDisplay 1 XXX _XIfEventInternalLockDisplay 1 XXX _XIfEventUnlockDisplay 0 fvwm2/3 still crashing. > > Index: Makefile.bsd-wrapper > =================================================================== > RCS file: /cvs/OpenBSD/xenocara/lib/libX11/Makefile.bsd-wrapper,v > retrieving revision 1.29 > diff -u -p -u -r1.29 Makefile.bsd-wrapper > --- Makefile.bsd-wrapper 3 Sep 2022 06:55:25 -0000 1.29 > +++ Makefile.bsd-wrapper 11 Nov 2022 15:13:59 -0000 > @@ -14,7 +14,6 @@ SHARED_LIBS= X11 18.0 X11_xcb 2.0 > > CONFIGURE_ARGS= --enable-tcp-transport --enable-unix-transport --enable-ipv6 > \ > --disable-composecache \ > - --disable-thread-safety-constructor \ > --without-xmlto --without-fop --without-xsltproc > > .include <bsd.xorg.mk> > Index: include/X11/Xlibint.h > =================================================================== > RCS file: /cvs/OpenBSD/xenocara/lib/libX11/include/X11/Xlibint.h,v > retrieving revision 1.15 > diff -u -p -u -r1.15 Xlibint.h > --- include/X11/Xlibint.h 21 Feb 2022 08:01:24 -0000 1.15 > +++ include/X11/Xlibint.h 11 Nov 2022 15:14:00 -0000 > @@ -207,6 +207,7 @@ struct _XDisplay > > XIOErrorExitHandler exit_handler; > void *exit_handler_data; > + CARD32 in_ifevent; > }; > > #define XAllocIDs(dpy,ids,n) (*(dpy)->idlist_alloc)(dpy,ids,n) > Index: src/ChkIfEv.c > =================================================================== > RCS file: /cvs/OpenBSD/xenocara/lib/libX11/src/ChkIfEv.c,v > retrieving revision 1.4 > diff -u -p -u -r1.4 ChkIfEv.c > --- src/ChkIfEv.c 30 May 2011 19:19:38 -0000 1.4 > +++ src/ChkIfEv.c 11 Nov 2022 15:14:00 -0000 > @@ -49,6 +49,7 @@ Bool XCheckIfEvent ( > unsigned long qe_serial = 0; > int n; /* time through count */ > > + dpy->in_ifevent++; > LockDisplay(dpy); > prev = NULL; > for (n = 3; --n >= 0;) { > @@ -60,6 +61,7 @@ Bool XCheckIfEvent ( > *event = qelt->event; > _XDeq(dpy, prev, qelt); > _XStoreEventCookie(dpy, event); > + dpy->in_ifevent = False; > UnlockDisplay(dpy); > return True; > } > @@ -78,6 +80,7 @@ Bool XCheckIfEvent ( > /* another thread has snatched this event */ > prev = NULL; > } > + dpy->in_ifevent--; > UnlockDisplay(dpy); > return False; > } > Index: src/IfEvent.c > =================================================================== > RCS file: /cvs/OpenBSD/xenocara/lib/libX11/src/IfEvent.c,v > retrieving revision 1.4 > diff -u -p -u -r1.4 IfEvent.c > --- src/IfEvent.c 30 May 2011 19:19:38 -0000 1.4 > +++ src/IfEvent.c 11 Nov 2022 15:14:00 -0000 > @@ -48,6 +48,7 @@ XIfEvent ( > register _XQEvent *qelt, *prev; > unsigned long qe_serial = 0; > > + dpy->in_ifevent++; > LockDisplay(dpy); > prev = NULL; > while (1) { > @@ -59,6 +60,7 @@ XIfEvent ( > *event = qelt->event; > _XDeq(dpy, prev, qelt); > _XStoreEventCookie(dpy, event); > + dpy->in_ifevent--; > UnlockDisplay(dpy); > return 0; > } > Index: src/OpenDis.c > =================================================================== > RCS file: /cvs/OpenBSD/xenocara/lib/libX11/src/OpenDis.c,v > retrieving revision 1.12 > diff -u -p -u -r1.12 OpenDis.c > --- src/OpenDis.c 28 Nov 2020 14:39:48 -0000 1.12 > +++ src/OpenDis.c 11 Nov 2022 15:14:00 -0000 > @@ -189,6 +189,7 @@ XOpenDisplay ( > dpy->xcmisc_opcode = 0; > dpy->xkb_info = NULL; > dpy->exit_handler_data = NULL; > + dpy->in_ifevent = 0; > > /* > * Setup other information in this display structure. > Index: src/PeekIfEv.c > =================================================================== > RCS file: /cvs/OpenBSD/xenocara/lib/libX11/src/PeekIfEv.c,v > retrieving revision 1.3 > diff -u -p -u -r1.3 PeekIfEv.c > --- src/PeekIfEv.c 30 May 2011 19:19:38 -0000 1.3 > +++ src/PeekIfEv.c 11 Nov 2022 15:14:00 -0000 > @@ -49,6 +49,7 @@ XPeekIfEvent ( > register _XQEvent *prev, *qelt; > unsigned long qe_serial = 0; > > + dpy->in_ifevent++; > LockDisplay(dpy); > prev = NULL; > while (1) { > @@ -63,6 +64,7 @@ XPeekIfEvent ( > _XStoreEventCookie(dpy, ©); > *event = copy; > } > + dpy->in_ifevent--; > UnlockDisplay(dpy); > return 0; > } > Index: src/locking.c > =================================================================== > RCS file: /cvs/OpenBSD/xenocara/lib/libX11/src/locking.c,v > retrieving revision 1.8 > diff -u -p -u -r1.8 locking.c > --- src/locking.c 28 Nov 2020 14:39:48 -0000 1.8 > +++ src/locking.c 11 Nov 2022 15:14:00 -0000 > @@ -40,6 +40,7 @@ in this Software without prior written a > #undef _XFreeMutex > > #ifdef XTHREADS > +#include <stdio.h> > > #ifdef __UNIXWARE__ > #include <dlfcn.h> > @@ -455,6 +456,51 @@ static void _XDisplayLockWait( > static void _XLockDisplay( > Display *dpy > XTHREADS_FILE_LINE_ARGS > + ); > + > +static void _XIfEventLockDisplay( > + Display *dpy > + XTHREADS_FILE_LINE_ARGS > + ) > +{ > + printf("XXX %s %d\n", __func__, dpy->in_ifevent); > + /* assert(dpy->in_ifevent); */ > +} > + > +static void _XInternalLockDisplay( > + Display *dpy, > + Bool wskip > + XTHREADS_FILE_LINE_ARGS > + ); > + > +static void _XIfEventInternalLockDisplay( > + Display *dpy, > + Bool wskip > + XTHREADS_FILE_LINE_ARGS > + ) > +{ > + printf("XXX %s %d\n", __func__, dpy->in_ifevent); > +} > + > +static void _XIfEventUnlockDisplay( > + Display *dpy > + XTHREADS_FILE_LINE_ARGS > + ) > +{ > + setbuf(stdout, NULL); > + if (dpy->in_ifevent == 0) { > + printf("XXX %s %d\n", __func__, dpy->in_ifevent); > + dpy->lock_fns->lock_display = _XLockDisplay; > + dpy->lock_fns->unlock_display = _XUnlockDisplay; > + dpy->lock->internal_lock_display = _XInternalLockDisplay; > + UnlockDisplay(dpy); > + } else > + return; > +} > + > +static void _XLockDisplay( > + Display *dpy > + XTHREADS_FILE_LINE_ARGS > ) > { > #ifdef XTHREADS > @@ -478,6 +524,12 @@ static void _XLockDisplay( > #endif > _XIDHandler(dpy); > _XSeqSyncFunction(dpy); > + if (dpy->in_ifevent) { > + printf("XXX %s %d\n", __func__, dpy->in_ifevent); > + dpy->lock_fns->lock_display = _XIfEventLockDisplay; > + dpy->lock_fns->unlock_display = _XIfEventUnlockDisplay; > + dpy->lock->internal_lock_display = _XIfEventInternalLockDisplay; > + } > } > > /* > > -- > Matthieu Herrb -- Walter