File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -673,6 +673,37 @@ class SemaphoreTests(lock_tests.SemaphoreTests):
673673class BoundedSemaphoreTests (lock_tests .BoundedSemaphoreTests ):
674674 semtype = staticmethod (threading .BoundedSemaphore )
675675
676+ @unittest .skipUnless (sys .platform == 'darwin' , 'test macosx problem' )
677+ def test_recursion_limit (self ):
678+ # Issue 9670
679+ # test that excessive recursion within a non-main thread causes
680+ # an exception rather than crashing the interpreter on platforms
681+ # like Mac OS X or FreeBSD which have small default stack sizes
682+ # for threads
683+ script = """if True:
684+ import threading
685+
686+ def recurse():
687+ return recurse()
688+
689+ def outer():
690+ try:
691+ recurse()
692+ except RuntimeError:
693+ pass
694+
695+ w = threading.Thread(target=outer)
696+ w.start()
697+ w.join()
698+ print('end of main thread')
699+ """
700+ expected_output = "end of main thread\n "
701+ p = subprocess .Popen ([sys .executable , "-c" , script ],
702+ stdout = subprocess .PIPE )
703+ stdout , stderr = p .communicate ()
704+ data = stdout .decode ().replace ('\r ' , '' )
705+ self .assertEqual (p .returncode , 0 , "Unexpected error" )
706+ self .assertEqual (data , expected_output )
676707
677708def test_main ():
678709 test .support .run_unittest (LockTests , RLockTests , EventTests ,
Original file line number Diff line number Diff line change @@ -10,6 +10,11 @@ What's New in Python 3.1.4?
1010Core and Builtins
1111-----------------
1212
13+ - Issue #9670: Increase the default stack size for secondary threads on
14+ Mac OS X and FreeBSD to reduce the chances of a crash instead of a
15+ "maximum recursion depth" RuntimeError exception.
16+ (patch by Ronald Oussoren)
17+
1318- Correct lookup of __dir__ on objects. Among other things, this causes errors
1419 besides AttributeError found on lookup to be propagated.
1520
Original file line number Diff line number Diff line change 1818#ifndef THREAD_STACK_SIZE
1919#define THREAD_STACK_SIZE 0 /* use default stack size */
2020#endif
21+
22+ #if (defined(__APPLE__ ) || defined(__FreeBSD__ )) && defined(THREAD_STACK_SIZE ) && THREAD_STACK_SIZE == 0
23+ /* The default stack size for new threads on OSX is small enough that
24+ * we'll get hard crashes instead of 'maximum recursion depth exceeded'
25+ * exceptions.
26+ *
27+ * The default stack size below is the minimal stack size where a
28+ * simple recursive function doesn't cause a hard crash.
29+ */
30+ #undef THREAD_STACK_SIZE
31+ #define THREAD_STACK_SIZE 0x400000
32+ #endif
2133/* for safety, ensure a viable minimum stacksize */
2234#define THREAD_STACK_MIN 0x8000 /* 32kB */
2335#else /* !_POSIX_THREAD_ATTR_STACKSIZE */
You can’t perform that action at this time.
0 commit comments