This repository has been archived by the owner on May 20, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 249
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
upgpkg: libx11 1.8.3-2: try to fix FF crashes and other freezes - FS#…
…76860 + FS#76669 git-svn-id: file:///srv/repos/svn-packages/svn@464507 eb2447ed-0c53-47e4-bac8-5bc4a241df78
- Loading branch information
andyrtr
authored and
svntogit
committed
Dec 17, 2022
1 parent
d8d0677
commit 0154513
Showing
2 changed files
with
201 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,189 @@ | ||
diff --git a/include/X11/Xlibint.h b/include/X11/Xlibint.h | ||
index e20c4833c16c6d3518e4b7feb9bdbc606584bfcc..b570bd01c657f4d86f06b414a43e96da4319f729 100644 | ||
--- a/include/X11/Xlibint.h | ||
+++ b/include/X11/Xlibint.h | ||
@@ -43,6 +43,10 @@ from The Open Group. | ||
#include <X11/Xproto.h> /* to declare xEvent */ | ||
#include <X11/XlibConf.h> /* for configured options like XTHREADS */ | ||
|
||
+#ifdef XTHREADS | ||
+#include <X11/Xthreads.h> | ||
+#endif | ||
+ | ||
/* The Xlib structs are full of implicit padding to properly align members. | ||
We can't clean that up without breaking ABI, so tell clang not to bother | ||
complaining about it. */ | ||
@@ -207,7 +211,10 @@ struct _XDisplay | ||
|
||
XIOErrorExitHandler exit_handler; | ||
void *exit_handler_data; | ||
- CARD32 in_ifevent; | ||
+ CARD32 in_ifevent; | ||
+#ifdef XTHREADS | ||
+ xthread_t ifevent_thread; | ||
+#endif | ||
}; | ||
|
||
#define XAllocIDs(dpy,ids,n) (*(dpy)->idlist_alloc)(dpy,ids,n) | ||
diff --git a/src/ChkIfEv.c b/src/ChkIfEv.c | ||
index b32c2d3ebcb1aad0e704a3e5dce52dc31971afd2..666366966a0e81bf413a64e015a84da1fcf5cdf0 100644 | ||
--- a/src/ChkIfEv.c | ||
+++ b/src/ChkIfEv.c | ||
@@ -49,8 +49,11 @@ Bool XCheckIfEvent ( | ||
unsigned long qe_serial = 0; | ||
int n; /* time through count */ | ||
|
||
- dpy->in_ifevent++; | ||
LockDisplay(dpy); | ||
+#ifdef XTHREADS | ||
+ dpy->ifevent_thread = xthread_self(); | ||
+#endif | ||
+ dpy->in_ifevent++; | ||
prev = NULL; | ||
for (n = 3; --n >= 0;) { | ||
for (qelt = prev ? prev->next : dpy->head; | ||
diff --git a/src/IfEvent.c b/src/IfEvent.c | ||
index 54c37f0031b27f3d7eb629ec2ea16b615b29e734..35c592e3a54d89f1d2ac1efa40c43a04eab1c0c5 100644 | ||
--- a/src/IfEvent.c | ||
+++ b/src/IfEvent.c | ||
@@ -48,8 +48,11 @@ XIfEvent ( | ||
register _XQEvent *qelt, *prev; | ||
unsigned long qe_serial = 0; | ||
|
||
- dpy->in_ifevent++; | ||
LockDisplay(dpy); | ||
+#ifdef XTHREADS | ||
+ dpy->ifevent_thread = xthread_self(); | ||
+#endif | ||
+ dpy->in_ifevent++; | ||
prev = NULL; | ||
while (1) { | ||
for (qelt = prev ? prev->next : dpy->head; | ||
diff --git a/src/PeekIfEv.c b/src/PeekIfEv.c | ||
index 68c028b70705968c6757c1e70a238886a94adecb..754749a77c0835c0ba3c1aa6edded15dab7fb478 100644 | ||
--- a/src/PeekIfEv.c | ||
+++ b/src/PeekIfEv.c | ||
@@ -49,8 +49,11 @@ XPeekIfEvent ( | ||
register _XQEvent *prev, *qelt; | ||
unsigned long qe_serial = 0; | ||
|
||
- dpy->in_ifevent++; | ||
LockDisplay(dpy); | ||
+#ifdef XTHREADS | ||
+ dpy->ifevent_thread = xthread_self(); | ||
+#endif | ||
+ dpy->in_ifevent++; | ||
prev = NULL; | ||
while (1) { | ||
for (qelt = prev ? prev->next : dpy->head; | ||
diff --git a/src/locking.c b/src/locking.c | ||
index c550603e1f5d0601af3fa19c0b8486ef5b1bc30f..642cf9894268dfbbb79a104b42b4097cfd293d82 100644 | ||
--- a/src/locking.c | ||
+++ b/src/locking.c | ||
@@ -240,7 +240,9 @@ static void _XUnlockDisplay( | ||
if (lock_hist_loc >= LOCK_HIST_SIZE) | ||
lock_hist_loc = 0; | ||
#endif /* XTHREADS_WARN */ | ||
- xmutex_unlock(dpy->lock->mutex); | ||
+ | ||
+ if (dpy->in_ifevent == 0 || dpy->ifevent_thread != xthread_self()) | ||
+ xmutex_unlock(dpy->lock->mutex); | ||
} | ||
|
||
|
||
@@ -453,63 +455,24 @@ static void _XDisplayLockWait( | ||
} | ||
|
||
static void _XLockDisplay( | ||
- Display *dpy | ||
- XTHREADS_FILE_LINE_ARGS | ||
- ); | ||
- | ||
-static void _XIfEventLockDisplay( | ||
Display *dpy | ||
XTHREADS_FILE_LINE_ARGS | ||
) | ||
{ | ||
- /* assert(dpy->in_ifevent); */ | ||
-} | ||
+ struct _XErrorThreadInfo *ti; | ||
|
||
-static void _XInternalLockDisplay( | ||
- Display *dpy, | ||
- Bool wskip | ||
- XTHREADS_FILE_LINE_ARGS | ||
- ); | ||
+ if (dpy->in_ifevent && dpy->ifevent_thread == xthread_self()) | ||
+ return; | ||
|
||
-static void _XIfEventInternalLockDisplay( | ||
- Display *dpy, | ||
- Bool wskip | ||
- XTHREADS_FILE_LINE_ARGS | ||
- ) | ||
-{ | ||
- /* assert(dpy->in_ifevent); */ | ||
-} | ||
- | ||
-static void _XIfEventUnlockDisplay( | ||
- Display *dpy | ||
- XTHREADS_FILE_LINE_ARGS | ||
- ) | ||
-{ | ||
- if (dpy->in_ifevent == 0) { | ||
- 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 | ||
- struct _XErrorThreadInfo *ti; | ||
-#endif | ||
#ifdef XTHREADS_WARN | ||
_XLockDisplayWarn(dpy, file, line); | ||
#else | ||
xmutex_lock(dpy->lock->mutex); | ||
#endif | ||
+ | ||
if (dpy->lock->locking_level > 0) | ||
- _XDisplayLockWait(dpy); | ||
-#ifdef XTHREADS | ||
+ _XDisplayLockWait(dpy); | ||
+ | ||
/* | ||
* Skip the two function calls below which may generate requests | ||
* when LockDisplay is called from within _XError. | ||
@@ -517,14 +480,9 @@ static void _XLockDisplay( | ||
for (ti = dpy->error_threads; ti; ti = ti->next) | ||
if (ti->error_thread == xthread_self()) | ||
return; | ||
-#endif | ||
+ | ||
_XIDHandler(dpy); | ||
_XSeqSyncFunction(dpy); | ||
- if (dpy->in_ifevent) { | ||
- dpy->lock_fns->lock_display = _XIfEventLockDisplay; | ||
- dpy->lock_fns->unlock_display = _XIfEventUnlockDisplay; | ||
- dpy->lock->internal_lock_display = _XIfEventInternalLockDisplay; | ||
- } | ||
} | ||
|
||
/* | ||
@@ -537,6 +495,9 @@ static void _XInternalLockDisplay( | ||
XTHREADS_FILE_LINE_ARGS | ||
) | ||
{ | ||
+ if (dpy->in_ifevent && dpy->ifevent_thread == xthread_self()) | ||
+ return; | ||
+ | ||
#ifdef XTHREADS_WARN | ||
_XLockDisplayWarn(dpy, file, line); | ||
#else |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters