From de0a1601e3155aa0ed423768b3c85abe8718fe40 Mon Sep 17 00:00:00 2001 From: Thomas Kluyver Date: Sun, 2 Aug 2026 08:43:49 +0100 Subject: [PATCH] Don't try to close mmap in SharedMemory.__del__ --- Lib/multiprocessing/shared_memory.py | 11 +++++++---- .../2026-08-02-08-43-20.gh-issue-155003.VVy9Z_.rst | 2 ++ 2 files changed, 9 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2026-08-02-08-43-20.gh-issue-155003.VVy9Z_.rst diff --git a/Lib/multiprocessing/shared_memory.py b/Lib/multiprocessing/shared_memory.py index 99a8ce3320ad4e..a4de048bf75521 100644 --- a/Lib/multiprocessing/shared_memory.py +++ b/Lib/multiprocessing/shared_memory.py @@ -186,7 +186,7 @@ def __init__(self, name=None, create=False, size=0, *, track=True): def __del__(self): try: - self.close() + self._closefd() except OSError: pass @@ -222,6 +222,11 @@ def size(self): "Size in bytes." return self._size + def _closefd(self): + if _USE_POSIX and self._fd >= 0: + os.close(self._fd) + self._fd = -1 + def close(self): """Closes access to the shared memory from this instance but does not destroy the shared memory block.""" @@ -231,9 +236,7 @@ def close(self): if self._mmap is not None: self._mmap.close() self._mmap = None - if _USE_POSIX and self._fd >= 0: - os.close(self._fd) - self._fd = -1 + self._closefd() def unlink(self): """Requests that the underlying shared memory block be destroyed. diff --git a/Misc/NEWS.d/next/Library/2026-08-02-08-43-20.gh-issue-155003.VVy9Z_.rst b/Misc/NEWS.d/next/Library/2026-08-02-08-43-20.gh-issue-155003.VVy9Z_.rst new file mode 100644 index 00000000000000..cec5814bbd891a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2026-08-02-08-43-20.gh-issue-155003.VVy9Z_.rst @@ -0,0 +1,2 @@ +Fix an error in the finalizer of :class:`multiprocessing.shared_memory.SharedMemory` +which could leak a file descriptor.