(merge 3.2) Issue #11870: Skip test_threading.test_2_join_in_forked_process()
on platforms with known OS bugs Share the list of platforms with known OS bugs with other tests. Patch written by Charles-François Natali.
This commit is contained in:
commit
2555b0aac7
|
@ -418,6 +418,13 @@ class ThreadTests(BaseTestCase):
|
||||||
|
|
||||||
class ThreadJoinOnShutdown(BaseTestCase):
|
class ThreadJoinOnShutdown(BaseTestCase):
|
||||||
|
|
||||||
|
# Between fork() and exec(), only async-safe functions are allowed (issues
|
||||||
|
# #12316 and #11870), and fork() from a worker thread is known to trigger
|
||||||
|
# problems with some operating systems (issue #3863): skip problematic tests
|
||||||
|
# on platforms known to behave badly.
|
||||||
|
platforms_to_skip = ('freebsd4', 'freebsd5', 'freebsd6', 'netbsd5',
|
||||||
|
'os2emx')
|
||||||
|
|
||||||
def _run_and_join(self, script):
|
def _run_and_join(self, script):
|
||||||
script = """if 1:
|
script = """if 1:
|
||||||
import sys, os, time, threading
|
import sys, os, time, threading
|
||||||
|
@ -448,6 +455,7 @@ class ThreadJoinOnShutdown(BaseTestCase):
|
||||||
self._run_and_join(script)
|
self._run_and_join(script)
|
||||||
|
|
||||||
@unittest.skipUnless(hasattr(os, 'fork'), "needs os.fork()")
|
@unittest.skipUnless(hasattr(os, 'fork'), "needs os.fork()")
|
||||||
|
@unittest.skipIf(sys.platform in platforms_to_skip, "due to known OS bug")
|
||||||
def test_2_join_in_forked_process(self):
|
def test_2_join_in_forked_process(self):
|
||||||
# Like the test above, but from a forked interpreter
|
# Like the test above, but from a forked interpreter
|
||||||
script = """if 1:
|
script = """if 1:
|
||||||
|
@ -464,15 +472,11 @@ class ThreadJoinOnShutdown(BaseTestCase):
|
||||||
self._run_and_join(script)
|
self._run_and_join(script)
|
||||||
|
|
||||||
@unittest.skipUnless(hasattr(os, 'fork'), "needs os.fork()")
|
@unittest.skipUnless(hasattr(os, 'fork'), "needs os.fork()")
|
||||||
|
@unittest.skipIf(sys.platform in platforms_to_skip, "due to known OS bug")
|
||||||
def test_3_join_in_forked_from_thread(self):
|
def test_3_join_in_forked_from_thread(self):
|
||||||
# Like the test above, but fork() was called from a worker thread
|
# Like the test above, but fork() was called from a worker thread
|
||||||
# In the forked process, the main Thread object must be marked as stopped.
|
# In the forked process, the main Thread object must be marked as stopped.
|
||||||
|
|
||||||
# Skip platforms with known problems forking from a worker thread.
|
|
||||||
# See http://bugs.python.org/issue3863.
|
|
||||||
if sys.platform in ('freebsd4', 'freebsd5', 'freebsd6', 'netbsd5',
|
|
||||||
'os2emx'):
|
|
||||||
raise unittest.SkipTest('due to known OS bugs on ' + sys.platform)
|
|
||||||
script = """if 1:
|
script = """if 1:
|
||||||
main_thread = threading.current_thread()
|
main_thread = threading.current_thread()
|
||||||
def worker():
|
def worker():
|
||||||
|
@ -498,15 +502,11 @@ class ThreadJoinOnShutdown(BaseTestCase):
|
||||||
self.assertEqual(data, expected_output)
|
self.assertEqual(data, expected_output)
|
||||||
|
|
||||||
@unittest.skipUnless(hasattr(os, 'fork'), "needs os.fork()")
|
@unittest.skipUnless(hasattr(os, 'fork'), "needs os.fork()")
|
||||||
|
@unittest.skipIf(sys.platform in platforms_to_skip, "due to known OS bug")
|
||||||
def test_4_joining_across_fork_in_worker_thread(self):
|
def test_4_joining_across_fork_in_worker_thread(self):
|
||||||
# There used to be a possible deadlock when forking from a child
|
# There used to be a possible deadlock when forking from a child
|
||||||
# thread. See http://bugs.python.org/issue6643.
|
# thread. See http://bugs.python.org/issue6643.
|
||||||
|
|
||||||
# Skip platforms with known problems forking from a worker thread.
|
|
||||||
# See http://bugs.python.org/issue3863.
|
|
||||||
if sys.platform in ('freebsd4', 'freebsd5', 'freebsd6', 'os2emx'):
|
|
||||||
raise unittest.SkipTest('due to known OS bugs on ' + sys.platform)
|
|
||||||
|
|
||||||
# The script takes the following steps:
|
# The script takes the following steps:
|
||||||
# - The main thread in the parent process starts a new thread and then
|
# - The main thread in the parent process starts a new thread and then
|
||||||
# tries to join it.
|
# tries to join it.
|
||||||
|
@ -575,6 +575,7 @@ class ThreadJoinOnShutdown(BaseTestCase):
|
||||||
self.assertScriptHasOutput(script, "end of main\n")
|
self.assertScriptHasOutput(script, "end of main\n")
|
||||||
|
|
||||||
@unittest.skipUnless(hasattr(os, 'fork'), "needs os.fork()")
|
@unittest.skipUnless(hasattr(os, 'fork'), "needs os.fork()")
|
||||||
|
@unittest.skipIf(sys.platform in platforms_to_skip, "due to known OS bug")
|
||||||
def test_5_clear_waiter_locks_to_avoid_crash(self):
|
def test_5_clear_waiter_locks_to_avoid_crash(self):
|
||||||
# Check that a spawned thread that forks doesn't segfault on certain
|
# Check that a spawned thread that forks doesn't segfault on certain
|
||||||
# platforms, namely OS X. This used to happen if there was a waiter
|
# platforms, namely OS X. This used to happen if there was a waiter
|
||||||
|
@ -587,10 +588,6 @@ class ThreadJoinOnShutdown(BaseTestCase):
|
||||||
# lock will be acquired, we can't know if the internal mutex will be
|
# lock will be acquired, we can't know if the internal mutex will be
|
||||||
# acquired at the time of the fork.
|
# acquired at the time of the fork.
|
||||||
|
|
||||||
# Skip platforms with known problems forking from a worker thread.
|
|
||||||
# See http://bugs.python.org/issue3863.
|
|
||||||
if sys.platform in ('freebsd4', 'freebsd5', 'freebsd6', 'os2emx'):
|
|
||||||
raise unittest.SkipTest('due to known OS bugs on ' + sys.platform)
|
|
||||||
script = """if True:
|
script = """if True:
|
||||||
import os, time, threading
|
import os, time, threading
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue