Commit 52849bfa authored by Antoine Pitrou's avatar Antoine Pitrou

Issue #14308: Fix an exception when a "dummy" thread is in the threading...

Issue #14308: Fix an exception when a "dummy" thread is in the threading module's active list after a fork().
parent c45868ec
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
import test.test_support import test.test_support
from test.test_support import verbose from test.test_support import verbose
from test.script_helper import assert_python_ok
import random import random
import re import re
import sys import sys
...@@ -414,6 +416,33 @@ class ThreadTests(BaseTestCase): ...@@ -414,6 +416,33 @@ class ThreadTests(BaseTestCase):
msg=('%d references still around' % msg=('%d references still around' %
sys.getrefcount(weak_raising_cyclic_object()))) sys.getrefcount(weak_raising_cyclic_object())))
@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, '')
self.assertEqual(err, '')
class ThreadJoinOnShutdown(BaseTestCase): class ThreadJoinOnShutdown(BaseTestCase):
......
...@@ -605,6 +605,10 @@ class Thread(_Verbose): ...@@ -605,6 +605,10 @@ class Thread(_Verbose):
pass pass
def __stop(self): def __stop(self):
# DummyThreads delete self.__block, but they have no waiters to
# notify anyway (join() is forbidden on them).
if not hasattr(self, '_Thread__block'):
return
self.__block.acquire() self.__block.acquire()
self.__stopped = True self.__stopped = True
self.__block.notify_all() self.__block.notify_all()
......
...@@ -50,6 +50,9 @@ Core and Builtins ...@@ -50,6 +50,9 @@ Core and Builtins
Library 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 - Issue #14538: HTMLParser can now parse correctly start tags that contain
a bare '/'. a bare '/'.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment