[3.12] gh-109593: Fix reentrancy issue in multiprocessing resource_tracker (GH-109629) (#109898)

gh-109593: Fix reentrancy issue in multiprocessing resource_tracker (GH-109629)

---------

(cherry picked from commit 0eb98837b6)

Co-authored-by: Antoine Pitrou <antoine@python.org>
Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com>
This commit is contained in:
Miss Islington (bot) 2023-10-02 08:37:40 -07:00 committed by GitHub
parent 84f9da9ab5
commit b723b8a13d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 95 additions and 2 deletions

View file

@ -330,6 +330,42 @@ class RLockTests(BaseLockTests):
lock.release()
self.assertRaises(RuntimeError, lock._release_save)
def test_recursion_count(self):
lock = self.locktype()
self.assertEqual(0, lock._recursion_count())
lock.acquire()
self.assertEqual(1, lock._recursion_count())
lock.acquire()
lock.acquire()
self.assertEqual(3, lock._recursion_count())
lock.release()
self.assertEqual(2, lock._recursion_count())
lock.release()
lock.release()
self.assertEqual(0, lock._recursion_count())
phase = []
def f():
lock.acquire()
phase.append(None)
while len(phase) == 1:
_wait()
lock.release()
phase.append(None)
with threading_helper.wait_threads_exit():
start_new_thread(f, ())
while len(phase) == 0:
_wait()
self.assertEqual(len(phase), 1)
self.assertEqual(0, lock._recursion_count())
phase.append(None)
while len(phase) == 2:
_wait()
self.assertEqual(len(phase), 3)
self.assertEqual(0, lock._recursion_count())
def test_different_thread(self):
# Cannot release from a different thread
lock = self.locktype()