mirror of
https://github.com/python/cpython.git
synced 2025-08-07 10:28:42 +00:00
[3.13] gh-109746: Make _thread.start_new_thread delete state of new thread on its startup failure (GH-109761) (GH-127171)
If Python fails to start newly created thread
due to failure of underlying PyThread_start_new_thread() call,
its state should be removed from interpreter' thread states list
to avoid its double cleanup.
(cherry picked from commit ca3ea9ad05
)
Co-authored-by: Radislav Chugunov <52372310+chgnrdv@users.noreply.github.com>
This commit is contained in:
parent
950daf8765
commit
75ef92da29
4 changed files with 40 additions and 1 deletions
|
@ -1171,6 +1171,41 @@ class ThreadTests(BaseTestCase):
|
|||
self.assertEqual(out.strip(), b"OK")
|
||||
self.assertIn(b"can't create new thread at interpreter shutdown", err)
|
||||
|
||||
def test_start_new_thread_failed(self):
|
||||
# gh-109746: if Python fails to start newly created thread
|
||||
# due to failure of underlying PyThread_start_new_thread() call,
|
||||
# its state should be removed from interpreter' thread states list
|
||||
# to avoid its double cleanup
|
||||
try:
|
||||
from resource import setrlimit, RLIMIT_NPROC
|
||||
except ImportError as err:
|
||||
self.skipTest(err) # RLIMIT_NPROC is specific to Linux and BSD
|
||||
code = """if 1:
|
||||
import resource
|
||||
import _thread
|
||||
|
||||
def f():
|
||||
print("shouldn't be printed")
|
||||
|
||||
limits = resource.getrlimit(resource.RLIMIT_NPROC)
|
||||
[_, hard] = limits
|
||||
resource.setrlimit(resource.RLIMIT_NPROC, (0, hard))
|
||||
|
||||
try:
|
||||
_thread.start_new_thread(f, ())
|
||||
except RuntimeError:
|
||||
print('ok')
|
||||
else:
|
||||
print('skip')
|
||||
"""
|
||||
_, out, err = assert_python_ok("-u", "-c", code)
|
||||
out = out.strip()
|
||||
if out == b'skip':
|
||||
self.skipTest('RLIMIT_NPROC had no effect; probably superuser')
|
||||
self.assertEqual(out, b'ok')
|
||||
self.assertEqual(err, b'')
|
||||
|
||||
|
||||
class ThreadJoinOnShutdown(BaseTestCase):
|
||||
|
||||
def _run_and_join(self, script):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue