tk/Latest-fix-proposal-from-Christian-Werner-revert-the.patch

263 lines
8.5 KiB
Diff
Raw Normal View History

2019-09-30 11:18:32 -04:00
From 37c12f688751bcc6c13ca455d52451c2833aa457 Mon Sep 17 00:00:00 2001
From: fvogel <fvogelnew1@free.fr>
Date: Fri, 19 Jan 2018 20:54:18 +0000
Subject: [PATCH 121/693] Latest fix proposal from Christian Werner: revert the
two previous commits and add XSync() just before the garbage collector, which
minimizes the number of XSync() calls, therefore optimizing performance while
still fixing the bug.
---
generic/tkError.c | 28 ++++++++++++++++++----------
unix/tkUnixColor.c | 1 -
unix/tkUnixEmbed.c | 3 ---
unix/tkUnixFocus.c | 1 -
unix/tkUnixRFont.c | 4 ----
unix/tkUnixSelect.c | 3 ---
unix/tkUnixSend.c | 1 -
unix/tkUnixWm.c | 9 ++-------
8 files changed, 20 insertions(+), 30 deletions(-)
diff --git a/generic/tkError.c b/generic/tkError.c
index fc223e6b3..277d7f0e0 100644
--- a/generic/tkError.c
+++ b/generic/tkError.c
@@ -82,8 +82,8 @@ Tk_CreateErrorHandler(
* errors. */
ClientData clientData) /* Arbitrary value to pass to errorProc. */
{
- register TkErrorHandler *errorPtr;
- register TkDisplay *dispPtr;
+ TkErrorHandler *errorPtr;
+ TkDisplay *dispPtr;
/*
* Find the display. If Tk doesn't know about this display then it's an
@@ -147,8 +147,8 @@ Tk_DeleteErrorHandler(
Tk_ErrorHandler handler) /* Token for handler to delete; was previous
* return value from Tk_CreateErrorHandler. */
{
- register TkErrorHandler *errorPtr = (TkErrorHandler *) handler;
- register TkDisplay *dispPtr = errorPtr->dispPtr;
+ TkErrorHandler *errorPtr = (TkErrorHandler *) handler;
+ TkDisplay *dispPtr = errorPtr->dispPtr;
errorPtr->lastRequest = NextRequest(dispPtr->display) - 1;
@@ -166,12 +166,20 @@ Tk_DeleteErrorHandler(
dispPtr->deleteCount += 1;
if (dispPtr->deleteCount >= 10) {
- register TkErrorHandler *prevPtr;
+ TkErrorHandler *prevPtr;
TkErrorHandler *nextPtr;
- int lastSerial;
+ int lastSerial = LastKnownRequestProcessed(dispPtr->display);
+ /*
+ * Last chance to catch errors for this handler: if no event/error
+ * processing took place to follow up the end of this error handler
+ * we need a round trip with the X server now.
+ */
+
+ if (errorPtr->lastRequest > (unsigned long) lastSerial) {
+ XSync(dispPtr->display, False);
+ }
dispPtr->deleteCount = 0;
- lastSerial = LastKnownRequestProcessed(dispPtr->display);
errorPtr = dispPtr->errorPtr;
for (prevPtr = NULL; errorPtr != NULL; errorPtr = nextPtr) {
nextPtr = errorPtr->nextPtr;
@@ -213,11 +221,11 @@ Tk_DeleteErrorHandler(
static int
ErrorProc(
Display *display, /* Display for which error occurred. */
- register XErrorEvent *errEventPtr)
+ XErrorEvent *errEventPtr)
/* Information about error. */
{
- register TkDisplay *dispPtr;
- register TkErrorHandler *errorPtr;
+ TkDisplay *dispPtr;
+ TkErrorHandler *errorPtr;
/*
* See if we know anything about the display. If not, then invoke the
diff --git a/unix/tkUnixColor.c b/unix/tkUnixColor.c
index b11a1ebbc..43500ad5b 100644
--- a/unix/tkUnixColor.c
+++ b/unix/tkUnixColor.c
@@ -94,7 +94,6 @@ TkpFreeColor(
-1, -1, -1, NULL, NULL);
XFreeColors(DisplayOfScreen(screen), tkColPtr->colormap,
&tkColPtr->color.pixel, 1, 0L);
- XSync(DisplayOfScreen(screen), False);
Tk_DeleteErrorHandler(handler);
}
DeleteStressedCmap(DisplayOfScreen(screen), tkColPtr->colormap);
diff --git a/unix/tkUnixEmbed.c b/unix/tkUnixEmbed.c
index b285fbe73..b170ad037 100644
--- a/unix/tkUnixEmbed.c
+++ b/unix/tkUnixEmbed.c
@@ -472,7 +472,6 @@ ContainerEventProc(
Tk_DestroyWindow((Tk_Window) winPtr);
}
- XSync(eventPtr->xfocus.display, False);
Tk_DeleteErrorHandler(errHandler);
}
@@ -516,7 +515,6 @@ EmbedStructureProc(
containerPtr->wrapper, 0, 0,
(unsigned) Tk_Width((Tk_Window) containerPtr->parentPtr),
(unsigned) Tk_Height((Tk_Window) containerPtr->parentPtr));
- XSync(eventPtr->xfocus.display, False);
Tk_DeleteErrorHandler(errHandler);
}
} else if (eventPtr->type == DestroyNotify) {
@@ -566,7 +564,6 @@ EmbedFocusProc(
-1, -1, NULL, NULL);
XSetInputFocus(display, containerPtr->wrapper, RevertToParent,
CurrentTime);
- XSync(eventPtr->xfocus.display, False);
Tk_DeleteErrorHandler(errHandler);
}
}
diff --git a/unix/tkUnixFocus.c b/unix/tkUnixFocus.c
index 7f4771e9d..07676181d 100644
--- a/unix/tkUnixFocus.c
+++ b/unix/tkUnixFocus.c
@@ -112,7 +112,6 @@ TkpChangeFocus(
}
XSetInputFocus(dispPtr->display, winPtr->window, RevertToParent,
CurrentTime);
- XSync(dispPtr->display, False);
Tk_DeleteErrorHandler(errHandler);
/*
diff --git a/unix/tkUnixRFont.c b/unix/tkUnixRFont.c
index 44e733944..d43ed2460 100644
--- a/unix/tkUnixRFont.c
+++ b/unix/tkUnixRFont.c
@@ -388,7 +388,6 @@ FinishedWithFont(
if (fontPtr->fontset) {
FcFontSetDestroy(fontPtr->fontset);
}
- XSync(fontPtr->display, False);
Tk_DeleteErrorHandler(handler);
}
@@ -876,7 +875,6 @@ Tk_DrawChars(
Tk_CreateErrorHandler(display, -1, -1, -1, NULL, NULL);
XftDrawChange(fontPtr->ftDraw, drawable);
- XSync(display, False);
Tk_DeleteErrorHandler(handler);
}
XGetGCValues(display, gc, GCForeground, &values);
@@ -1010,7 +1008,6 @@ TkDrawAngledChars(
Tk_CreateErrorHandler(display, -1, -1, -1, NULL, NULL);
XftDrawChange(fontPtr->ftDraw, drawable);
- XSync(display, False);
Tk_DeleteErrorHandler(handler);
}
@@ -1100,7 +1097,6 @@ TkDrawAngledChars(
Tk_CreateErrorHandler(display, -1, -1, -1, NULL, NULL);
XftDrawChange(fontPtr->ftDraw, drawable);
- XSync(display, False);
Tk_DeleteErrorHandler(handler);
}
XGetGCValues(display, gc, GCForeground, &values);
diff --git a/unix/tkUnixSelect.c b/unix/tkUnixSelect.c
index 9313df5c0..6d379ecc8 100644
--- a/unix/tkUnixSelect.c
+++ b/unix/tkUnixSelect.c
@@ -470,7 +470,6 @@ TkSelPropProc(
ckfree(propPtr);
}
}
- XSync(eventPtr->xproperty.display, False);
Tk_DeleteErrorHandler(errorHandler);
/*
@@ -1049,7 +1048,6 @@ ConvertSelection(
reply.xsel.property = incr.multAtoms[1];
}
XSendEvent(reply.xsel.display, reply.xsel.requestor, False, 0, &reply.ev);
- XSync(reply.xsel.display, False);
Tk_DeleteErrorHandler(errorHandler);
/*
@@ -1068,7 +1066,6 @@ ConvertSelection(
errorHandler = Tk_CreateErrorHandler(winPtr->display,
-1, -1, -1, (int (*)()) NULL, NULL);
XSelectInput(reply.xsel.display, reply.xsel.requestor, 0L);
- XSync(winPtr->display, False);
Tk_DeleteErrorHandler(errorHandler);
if (tsdPtr->pendingIncrs == &incr) {
tsdPtr->pendingIncrs = incr.nextPtr;
diff --git a/unix/tkUnixSend.c b/unix/tkUnixSend.c
index 0322a78d5..bbbdd774c 100644
--- a/unix/tkUnixSend.c
+++ b/unix/tkUnixSend.c
@@ -1748,7 +1748,6 @@ AppendPropCarefully(
pendingPtr);
XChangeProperty(display, window, property, XA_STRING, 8,
PropModeAppend, (unsigned char *) value, length);
- XSync(display, False);
Tk_DeleteErrorHandler(handler);
}
diff --git a/unix/tkUnixWm.c b/unix/tkUnixWm.c
index 31e14cb72..19ac86cb5 100644
--- a/unix/tkUnixWm.c
+++ b/unix/tkUnixWm.c
@@ -4084,7 +4084,6 @@ ConfigureEvent(
XMoveResizeWindow(winPtr->display, winPtr->window, 0,
wmPtr->menuHeight, (unsigned) wrapperPtr->changes.width,
(unsigned) (wrapperPtr->changes.height - wmPtr->menuHeight));
- XSync(winPtr->display, False);
Tk_DeleteErrorHandler(handler);
if ((wmPtr->menubar != NULL)
&& ((Tk_Width(wmPtr->menubar) != wrapperPtr->changes.width)
@@ -4421,11 +4420,10 @@ WrapperEventProc(
* Tk_DestroyWindow will try to destroy the window, but of course
* it's already gone.
*/
- Display *display = wmPtr->winPtr->display;
- handler = Tk_CreateErrorHandler(display, -1, -1, -1, NULL, NULL);
+ handler = Tk_CreateErrorHandler(wmPtr->winPtr->display, -1, -1, -1,
+ NULL, NULL);
Tk_DestroyWindow((Tk_Window) wmPtr->winPtr);
- XSync(display, False);
Tk_DeleteErrorHandler(handler);
}
if (dispPtr->flags & TK_DISPLAY_WM_TRACING) {
@@ -5848,12 +5846,10 @@ Tk_CoordsToWindow(
* deleted
*/
- XSync(Tk_Display(tkwin), False);
Tk_DeleteErrorHandler(handler);
return NULL;
}
if (child == None) {
- XSync(Tk_Display(tkwin), False);
Tk_DeleteErrorHandler(handler);
return NULL;
}
@@ -5883,7 +5879,6 @@ Tk_CoordsToWindow(
* or below
*/
- XSync(Tk_Display(tkwin), False);
Tk_DeleteErrorHandler(handler);
handler = NULL;
}
--
2.19.1