From 0baf96a181d704b812f1e683d7fa8ae3e2f34a46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20Br=C3=B8ns-Pedersen?= Date: Tue, 27 May 2025 10:36:29 +0200 Subject: [PATCH] Fix: Release ImageMagick resources in `chafa.loader.Loader` --- src/chafa/loader.py | 4 ++++ tests/7_load_many.py | 15 +++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 tests/7_load_many.py diff --git a/src/chafa/loader.py b/src/chafa/loader.py index 8c59fdb..955e25f 100644 --- a/src/chafa/loader.py +++ b/src/chafa/loader.py @@ -110,6 +110,7 @@ def __init__(self, path: str): ] _MagickWand.DestroyPixelWand.argtypes = [ctypes.c_void_p] + _MagickWand.DestroyMagickWand.argtypes = [ctypes.c_void_p] _MagickWand.MagickGetImageWidth. argtypes = [ctypes.c_void_p] _MagickWand.MagickGetImageHeight.argtypes = [ctypes.c_void_p] @@ -168,6 +169,9 @@ def __init__(self, path: str): pixels ) + # Clean up wand to release resources + _MagickWand.DestroyMagickWand(magick_wand) + self._height = height self._width = width self._rowstride = rowstride diff --git a/tests/7_load_many.py b/tests/7_load_many.py new file mode 100644 index 0000000..dea744c --- /dev/null +++ b/tests/7_load_many.py @@ -0,0 +1,15 @@ +import chafa.loader + +# Uncomment to enable ImageMagick event logging: +# import ctypes +# chafa.loader._MagickWand.SetLogEventMask(ctypes.c_char_p(b'all\0')) + +# Load enough copies of 'snake.jpg' to reveal resource leaks. +for i in range(1, 10_000+1): + img = chafa.loader.Loader('snake.jpg') + print(f'\x1b[G{i}', end='', flush=True) + if img.width == 0: + print(f'\x1b[GFailed after loading {i} copies of "snake.jpg"') + break +else: + print('\nA-OK')