[Python-checkins] cpython (2.7): Issue #17555: Fix ForkAwareThreadLock so that size of after fork
richard.oudkerk
python-checkins at python.org
Wed Apr 17 22:29:15 CEST 2013
http://hg.python.org/cpython/rev/66731a1b1aa4
changeset: 83427:66731a1b1aa4
branch: 2.7
parent: 83419:f2a744e067e0
user: Richard Oudkerk <shibturn at gmail.com>
date: Wed Apr 17 19:15:52 2013 +0100
summary:
Issue #17555: Fix ForkAwareThreadLock so that size of after fork
registry does not grow exponentially with generation of process.
files:
Lib/multiprocessing/util.py | 5 ++-
Lib/test/test_multiprocessing.py | 32 +++++++++++++++++++-
Misc/NEWS | 3 +
3 files changed, 38 insertions(+), 2 deletions(-)
diff --git a/Lib/multiprocessing/util.py b/Lib/multiprocessing/util.py
--- a/Lib/multiprocessing/util.py
+++ b/Lib/multiprocessing/util.py
@@ -329,10 +329,13 @@
class ForkAwareThreadLock(object):
def __init__(self):
+ self._reset()
+ register_after_fork(self, ForkAwareThreadLock._reset)
+
+ def _reset(self):
self._lock = threading.Lock()
self.acquire = self._lock.acquire
self.release = self._lock.release
- register_after_fork(self, ForkAwareThreadLock.__init__)
class ForkAwareLocal(threading.local):
def __init__(self):
diff --git a/Lib/test/test_multiprocessing.py b/Lib/test/test_multiprocessing.py
--- a/Lib/test/test_multiprocessing.py
+++ b/Lib/test/test_multiprocessing.py
@@ -2430,13 +2430,43 @@
[sys.executable, '-E', '-B', '-O', '-c', prog])
child_flags, grandchild_flags = json.loads(data.decode('ascii'))
self.assertEqual(child_flags, grandchild_flags)
+
+#
+# Issue #17555: ForkAwareThreadLock
+#
+
+class TestForkAwareThreadLock(unittest.TestCase):
+ # We recurisvely start processes. Issue #17555 meant that the
+ # after fork registry would get duplicate entries for the same
+ # lock. The size of the registry at generation n was ~2**n.
+
+ @classmethod
+ def child(cls, n, conn):
+ if n > 1:
+ p = multiprocessing.Process(target=cls.child, args=(n-1, conn))
+ p.start()
+ p.join()
+ else:
+ conn.send(len(util._afterfork_registry))
+ conn.close()
+
+ def test_lock(self):
+ r, w = multiprocessing.Pipe(False)
+ l = util.ForkAwareThreadLock()
+ old_size = len(util._afterfork_registry)
+ p = multiprocessing.Process(target=self.child, args=(5, w))
+ p.start()
+ new_size = r.recv()
+ p.join()
+ self.assertLessEqual(new_size, old_size)
+
#
#
#
testcases_other = [OtherTest, TestInvalidHandle, TestInitializers,
TestStdinBadfiledescriptor, TestTimeouts, TestNoForkBomb,
- TestFlags]
+ TestFlags, TestForkAwareThreadLock]
#
#
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -28,6 +28,9 @@
Library
-------
+- Issue #17555: Fix ForkAwareThreadLock so that size of after fork
+ registry does not grow exponentially with generation of process.
+
- Issue #17710: Fix cPickle raising a SystemError on bogus input.
- Issue #17341: Include the invalid name in the error messages from re about
--
Repository URL: http://hg.python.org/cpython
More information about the Python-checkins
mailing list