From: Richard Oudkerk Date: Thu, 23 Jan 2014 00:11:04 +0000 (+0000) Subject: Issue #14548: Make multiprocessing finalizers check pid before X-Git-Tag: v2.7.8~96 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e8a57b98ec8f2b161d4ad68ecc1433c9e3caad57;p=python Issue #14548: Make multiprocessing finalizers check pid before running to cope with possibility of gc running just after fork. (Backport from 3.x.) --- diff --git a/Lib/multiprocessing/util.py b/Lib/multiprocessing/util.py index d1b3d2e3e8..092b61ce09 100644 --- a/Lib/multiprocessing/util.py +++ b/Lib/multiprocessing/util.py @@ -32,6 +32,7 @@ # SUCH DAMAGE. # +import os import itertools import weakref import atexit @@ -184,6 +185,7 @@ class Finalize(object): self._args = args self._kwargs = kwargs or {} self._key = (exitpriority, _finalizer_counter.next()) + self._pid = os.getpid() _finalizer_registry[self._key] = self @@ -196,9 +198,13 @@ class Finalize(object): except KeyError: sub_debug('finalizer no longer registered') else: - sub_debug('finalizer calling %s with args %s and kwargs %s', - self._callback, self._args, self._kwargs) - res = self._callback(*self._args, **self._kwargs) + if self._pid != os.getpid(): + sub_debug('finalizer ignored because different process') + res = None + else: + sub_debug('finalizer calling %s with args %s and kwargs %s', + self._callback, self._args, self._kwargs) + res = self._callback(*self._args, **self._kwargs) self._weakref = self._callback = self._args = \ self._kwargs = self._key = None return res diff --git a/Misc/NEWS b/Misc/NEWS index 35846b5a0a..54aac520c2 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -38,6 +38,10 @@ Core and Builtins Library ------- +- Issue #14548: Make multiprocessing finalizers check pid before + running to cope with possibility of gc running just after fork. + (Backport from 3.x.) + - Issue #20262: Warnings are raised now when duplicate names are added in the ZIP file or too long ZIP file comment is truncated.