]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Issue #9670: merge with current
authorNed Deily <nad@acm.org>
Sat, 9 Apr 2011 19:47:12 +0000 (12:47 -0700)
committerNed Deily <nad@acm.org>
Sat, 9 Apr 2011 19:47:12 +0000 (12:47 -0700)
1  2 
Lib/test/test_threading.py
Misc/NEWS
Python/thread_pthread.h

index c107652d268f4293642f213389bdcabe1d3ab14b,32f9e99c4bd964b8e10c82c237661df3f5556ed4..270e0b86e49969ea90cf79eba9d6dd21a8733343
@@@ -685,10 -677,36 +685,40 @@@ class ThreadingExceptionTests(BaseTestC
          thread.start()
          self.assertRaises(RuntimeError, setattr, thread, "daemon", True)
  
 +    def test_releasing_unacquired_lock(self):
 +        lock = threading.Lock()
 +        self.assertRaises(RuntimeError, lock.release)
 +
+     def test_recursion_limit(self):
+         # Issue 9670
+         # test that excessive recursion within a non-main thread causes
+         # an exception rather than crashing the interpreter on platforms
+         # like Mac OS X or FreeBSD which have small default stack sizes
+         # for threads
+         script = """if True:
+             import threading
+             def recurse():
+                 return recurse()
+             def outer():
+                 try:
+                     recurse()
+                 except RuntimeError:
+                     pass
+             w = threading.Thread(target=outer)
+             w.start()
+             w.join()
+             print('end of main thread')
+             """
+         expected_output = "end of main thread\n"
+         p = subprocess.Popen([sys.executable, "-c", script],
+                              stdout=subprocess.PIPE)
+         stdout, stderr = p.communicate()
+         data = stdout.decode().replace('\r', '')
+         self.assertEqual(p.returncode, 0, "Unexpected error")
+         self.assertEqual(data, expected_output)
  
  class LockTests(lock_tests.LockTests):
      locktype = staticmethod(threading.Lock)
diff --cc Misc/NEWS
Simple merge
Simple merge