Issue #14308: Fix an exception when a "dummy" thread is in the threading module's active list after a fork().

This commit is contained in:
Antoine Pitrou 2012-04-19 23:55:01 +02:00
parent 10ac77d2d8
commit 8e6e0fdb7f
3 changed files with 35 additions and 0 deletions

View File

@ -2,6 +2,8 @@
import test.support
from test.support import verbose, strip_python_stderr, import_module
from test.script_helper import assert_python_ok
import random
import re
import sys
@ -407,6 +409,33 @@ class ThreadTests(BaseTestCase):
t.daemon = True
self.assertTrue('daemon' in repr(t))
@unittest.skipUnless(hasattr(os, 'fork'), 'test needs fork()')
def test_dummy_thread_after_fork(self):
# Issue #14308: a dummy thread in the active list doesn't mess up
# the after-fork mechanism.
code = """if 1:
import _thread, threading, os, time
def background_thread(evt):
# Creates and registers the _DummyThread instance
threading.current_thread()
evt.set()
time.sleep(10)
evt = threading.Event()
_thread.start_new_thread(background_thread, (evt,))
evt.wait()
assert threading.active_count() == 2, threading.active_count()
if os.fork() == 0:
assert threading.active_count() == 1, threading.active_count()
os._exit(0)
else:
os.wait()
"""
_, out, err = assert_python_ok("-c", code)
self.assertEqual(out, b'')
self.assertEqual(err, b'')
class ThreadJoinOnShutdown(BaseTestCase):

View File

@ -1007,6 +1007,9 @@ class _DummyThread(Thread):
def _set_daemon(self):
return True
def _stop(self):
pass
def join(self, timeout=None):
assert False, "cannot join a dummy thread"

View File

@ -47,6 +47,9 @@ Core and Builtins
Library
-------
- Issue #14308: Fix an exception when a "dummy" thread is in the threading
module's active list after a fork().
- Issue #14538: HTMLParser can now parse correctly start tags that contain
a bare '/'.