From 16015d520c56613879ef4815381d0fe0930084de Mon Sep 17 00:00:00 2001 From: fvogel Date: Sat, 6 Jan 2024 21:38:06 +0000 Subject: Fix [b7abf0d817]: ttk::treeview shows O(n^2) destruction time --- generic/tkImage.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/generic/tkImage.c b/generic/tkImage.c index 1f62ad4..1f026b6 100644 --- a/generic/tkImage.c +++ b/generic/tkImage.c @@ -41,6 +41,8 @@ typedef struct Image { ClientData widgetClientData;/* Argument to pass to changeProc. */ struct Image *nextPtr; /* Next in list of all image instances * associated with the same name. */ + struct Image *prevPtr; /* Previous in list of all image instances + * associated with the same name. */ } Image; /* @@ -644,6 +646,10 @@ Tk_GetImage( imagePtr->changeProc = changeProc; imagePtr->widgetClientData = clientData; imagePtr->nextPtr = modelPtr->instancePtr; + if (imagePtr->nextPtr) { + imagePtr->nextPtr->prevPtr = imagePtr; + } + imagePtr->prevPtr = NULL; modelPtr->instancePtr = imagePtr; return (Tk_Image) imagePtr; @@ -694,11 +700,22 @@ Tk_FreeImage( prevPtr = modelPtr->instancePtr; if (prevPtr == imagePtr) { modelPtr->instancePtr = imagePtr->nextPtr; + if (modelPtr->instancePtr) { + modelPtr->instancePtr->prevPtr = NULL; + } } else { - while (prevPtr->nextPtr != imagePtr) { - prevPtr = prevPtr->nextPtr; + if (imagePtr->prevPtr) { + imagePtr->prevPtr->nextPtr = imagePtr->nextPtr; + if (imagePtr->nextPtr) { + imagePtr->nextPtr->prevPtr = NULL; + } + } + if (imagePtr->nextPtr) { + imagePtr->nextPtr->prevPtr = imagePtr->prevPtr; + if (imagePtr->prevPtr) { + imagePtr->prevPtr->nextPtr = NULL; + } } - prevPtr->nextPtr = imagePtr->nextPtr; } ckfree(imagePtr); -- cgit v0.12 From 786ae0bd0b5fd2063a229aa73ff11c17cdc52f12 Mon Sep 17 00:00:00 2001 From: fvogel Date: Sat, 6 Jan 2024 22:00:15 +0000 Subject: Simplify Tk_FreeImage --- generic/tkImage.c | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/generic/tkImage.c b/generic/tkImage.c index 1f026b6..4d0fd05 100644 --- a/generic/tkImage.c +++ b/generic/tkImage.c @@ -687,7 +687,6 @@ Tk_FreeImage( { Image *imagePtr = (Image *) image; ImageModel *modelPtr = imagePtr->modelPtr; - Image *prevPtr; /* * Clean up the particular instance. @@ -697,24 +696,21 @@ Tk_FreeImage( modelPtr->typePtr->freeProc(imagePtr->instanceData, imagePtr->display); } - prevPtr = modelPtr->instancePtr; - if (prevPtr == imagePtr) { + if (imagePtr->prevPtr) { + imagePtr->prevPtr->nextPtr = imagePtr->nextPtr; + if (imagePtr->nextPtr) { + imagePtr->nextPtr->prevPtr = NULL; + } + } else { modelPtr->instancePtr = imagePtr->nextPtr; if (modelPtr->instancePtr) { modelPtr->instancePtr->prevPtr = NULL; } - } else { + } + if (imagePtr->nextPtr) { + imagePtr->nextPtr->prevPtr = imagePtr->prevPtr; if (imagePtr->prevPtr) { - imagePtr->prevPtr->nextPtr = imagePtr->nextPtr; - if (imagePtr->nextPtr) { - imagePtr->nextPtr->prevPtr = NULL; - } - } - if (imagePtr->nextPtr) { - imagePtr->nextPtr->prevPtr = imagePtr->prevPtr; - if (imagePtr->prevPtr) { - imagePtr->prevPtr->nextPtr = NULL; - } + imagePtr->prevPtr->nextPtr = NULL; } } ckfree(imagePtr); -- cgit v0.12 From 1a56ba25f1ce3e2317de262e9d47bc769c7be9ae Mon Sep 17 00:00:00 2001 From: fvogel Date: Sat, 6 Jan 2024 22:28:15 +0000 Subject: Let this bugfix branch build and test at Github Actions. --- .github/workflows/linux-build.yml | 1 + .github/workflows/mac-build.yml | 1 + .github/workflows/win-build.yml | 1 + 3 files changed, 3 insertions(+) diff --git a/.github/workflows/linux-build.yml b/.github/workflows/linux-build.yml index 77d5849..e54a67e 100644 --- a/.github/workflows/linux-build.yml +++ b/.github/workflows/linux-build.yml @@ -4,6 +4,7 @@ on: branches: - "main" - "core-8-6-branch" + - "bug-b7abf0d817" tags: - "core-**" permissions: diff --git a/.github/workflows/mac-build.yml b/.github/workflows/mac-build.yml index 70af86d..5e625c9 100644 --- a/.github/workflows/mac-build.yml +++ b/.github/workflows/mac-build.yml @@ -4,6 +4,7 @@ on: branches: - "main" - "core-8-6-branch" + - "bug-b7abf0d817" tags: - "core-**" permissions: diff --git a/.github/workflows/win-build.yml b/.github/workflows/win-build.yml index 6e399be..146dd80 100644 --- a/.github/workflows/win-build.yml +++ b/.github/workflows/win-build.yml @@ -5,6 +5,7 @@ on: - "main" - "core-8-branch" - "core-8-6-branch" + - "bug-b7abf0d817" tags: - "core-**" permissions: -- cgit v0.12 From cd9b06e212567c2972aa2f89c2d2128dd0a82a2f Mon Sep 17 00:00:00 2001 From: fvogel Date: Mon, 8 Jan 2024 22:30:13 +0000 Subject: Fix and simplify Tk_FreeImage. --- generic/tkImage.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/generic/tkImage.c b/generic/tkImage.c index 4d0fd05..50c3c66 100644 --- a/generic/tkImage.c +++ b/generic/tkImage.c @@ -699,7 +699,7 @@ Tk_FreeImage( if (imagePtr->prevPtr) { imagePtr->prevPtr->nextPtr = imagePtr->nextPtr; if (imagePtr->nextPtr) { - imagePtr->nextPtr->prevPtr = NULL; + imagePtr->nextPtr->prevPtr = imagePtr->prevPtr; } } else { modelPtr->instancePtr = imagePtr->nextPtr; @@ -707,12 +707,6 @@ Tk_FreeImage( modelPtr->instancePtr->prevPtr = NULL; } } - if (imagePtr->nextPtr) { - imagePtr->nextPtr->prevPtr = imagePtr->prevPtr; - if (imagePtr->prevPtr) { - imagePtr->prevPtr->nextPtr = NULL; - } - } ckfree(imagePtr); /* -- cgit v0.12