mirror of
https://github.com/python/cpython.git
synced 2025-08-02 16:13:13 +00:00
Issue #17555: Fix ForkAwareThreadLock so that size of after fork
registry does not grow exponentially with generation of process.
This commit is contained in:
commit
b147f60a38
3 changed files with 38 additions and 2 deletions
|
@ -3455,13 +3455,43 @@ class TestNoForkBomb(unittest.TestCase):
|
|||
self.assertEqual('123', out.decode('ascii').rstrip())
|
||||
self.assertEqual('', err.decode('ascii'))
|
||||
|
||||
#
|
||||
# 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, TestWait, TestInvalidFamily,
|
||||
TestFlags, TestTimeouts, TestNoForkBomb]
|
||||
TestFlags, TestTimeouts, TestNoForkBomb,
|
||||
TestForkAwareThreadLock]
|
||||
|
||||
#
|
||||
#
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue