From 528190072ae840c3592f000b87a1ca64a876eb99 Mon Sep 17 00:00:00 2001 From: Daniel King Date: Tue, 22 Sep 2026 09:15:31 -0400 Subject: [PATCH 1/3] Release GIL during rank filters --- src/libImaging/RankFilter.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/libImaging/RankFilter.c b/src/libImaging/RankFilter.c index fc8ce2db96d..4237601c3cb 100644 --- a/src/libImaging/RankFilter.c +++ b/src/libImaging/RankFilter.c @@ -13,6 +13,7 @@ */ #include "Imaging.h" +#include "Python.h" /* Fast rank algorithm (due to Wirth), based on public domain code by Nicolas Devillard, available at http://ndevilla.free.fr */ @@ -97,6 +98,7 @@ MakeRankFunction(UINT8) MakeRankFunction(INT32) MakeRankFunction(FLOAT32) if (!buf) { \ goto nomemory; \ } \ + Py_BEGIN_ALLOW_THREADS \ for (y = 0; y < imOut->ysize; y++) { \ for (x = 0; x < imOut->xsize; x++) { \ for (i = 0; i < size; i++) { \ @@ -109,6 +111,7 @@ MakeRankFunction(UINT8) MakeRankFunction(INT32) MakeRankFunction(FLOAT32) IMAGING_PIXEL_##type(imOut, x, y) = Rank##type(buf, size2, rank); \ } \ } \ + Py_END_ALLOW_THREADS \ free(buf); \ } while (0) From 2a149e179c668f0ce8c29841100ffe4ca4ea9f4b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 22 Sep 2026 14:08:31 +0000 Subject: [PATCH 2/3] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/libImaging/RankFilter.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/libImaging/RankFilter.c b/src/libImaging/RankFilter.c index 4237601c3cb..50a64dcaa12 100644 --- a/src/libImaging/RankFilter.c +++ b/src/libImaging/RankFilter.c @@ -98,8 +98,7 @@ MakeRankFunction(UINT8) MakeRankFunction(INT32) MakeRankFunction(FLOAT32) if (!buf) { \ goto nomemory; \ } \ - Py_BEGIN_ALLOW_THREADS \ - for (y = 0; y < imOut->ysize; y++) { \ + Py_BEGIN_ALLOW_THREADS for (y = 0; y < imOut->ysize; y++) { \ for (x = 0; x < imOut->xsize; x++) { \ for (i = 0; i < size; i++) { \ memcpy( \ @@ -111,8 +110,7 @@ MakeRankFunction(UINT8) MakeRankFunction(INT32) MakeRankFunction(FLOAT32) IMAGING_PIXEL_##type(imOut, x, y) = Rank##type(buf, size2, rank); \ } \ } \ - Py_END_ALLOW_THREADS \ - free(buf); \ + Py_END_ALLOW_THREADS free(buf); \ } while (0) if (im->image8) { From 1b11fe6e9229dffa2125dcfe689158e7f8bd3d79 Mon Sep 17 00:00:00 2001 From: Daniel King Date: Tue, 22 Sep 2026 10:24:32 -0400 Subject: [PATCH 3/3] Use Imaging section helpers for rank filters --- src/libImaging/RankFilter.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/libImaging/RankFilter.c b/src/libImaging/RankFilter.c index 50a64dcaa12..5c0a09d877c 100644 --- a/src/libImaging/RankFilter.c +++ b/src/libImaging/RankFilter.c @@ -13,7 +13,6 @@ */ #include "Imaging.h" -#include "Python.h" /* Fast rank algorithm (due to Wirth), based on public domain code by Nicolas Devillard, available at http://ndevilla.free.fr */ @@ -62,6 +61,7 @@ MakeRankFunction(UINT8) MakeRankFunction(INT32) MakeRankFunction(FLOAT32) Imaging ImagingRankFilter(Imaging im, int size, int rank) { Imaging imOut = NULL; + ImagingSectionCookie cookie; int x, y; int i, margin, size2; @@ -98,7 +98,8 @@ MakeRankFunction(UINT8) MakeRankFunction(INT32) MakeRankFunction(FLOAT32) if (!buf) { \ goto nomemory; \ } \ - Py_BEGIN_ALLOW_THREADS for (y = 0; y < imOut->ysize; y++) { \ + ImagingSectionEnter(&cookie); \ + for (y = 0; y < imOut->ysize; y++) { \ for (x = 0; x < imOut->xsize; x++) { \ for (i = 0; i < size; i++) { \ memcpy( \ @@ -110,7 +111,8 @@ MakeRankFunction(UINT8) MakeRankFunction(INT32) MakeRankFunction(FLOAT32) IMAGING_PIXEL_##type(imOut, x, y) = Rank##type(buf, size2, rank); \ } \ } \ - Py_END_ALLOW_THREADS free(buf); \ + ImagingSectionLeave(&cookie); \ + free(buf); \ } while (0) if (im->image8) {