Patch #1454481:  Make thread stack size runtime tunable.
diff --git a/Lib/dummy_thread.py b/Lib/dummy_thread.py
index 21fd03f..7c26f9e 100644
--- a/Lib/dummy_thread.py
+++ b/Lib/dummy_thread.py
@@ -20,6 +20,7 @@
            'interrupt_main', 'LockType']
 
 import traceback as _traceback
+import warnings
 
 class error(Exception):
     """Dummy implementation of thread.error."""
@@ -75,6 +76,13 @@
     """Dummy implementation of thread.allocate_lock()."""
     return LockType()
 
+def stack_size(size=None):
+    """Dummy implementation of thread.stack_size()."""
+    if size is not None:
+        msg = "setting thread stack size not supported on this platform"
+        warnings.warn(msg, RuntimeWarning)
+    return 0
+
 class LockType(object):
     """Class implementing dummy implementation of thread.LockType.
 
diff --git a/Lib/test/output/test_thread b/Lib/test/output/test_thread
index d49651d..ec58d73 100644
--- a/Lib/test/output/test_thread
+++ b/Lib/test/output/test_thread
@@ -4,3 +4,11 @@
 
 *** Barrier Test ***
 all tasks done
+
+*** Changing thread stack size ***
+trying stack_size = 32768
+waiting for all tasks to complete
+all tasks done
+trying stack_size = 4194304
+waiting for all tasks to complete
+all tasks done
diff --git a/Lib/test/test_thread.py b/Lib/test/test_thread.py
index ea345b6..d970107 100644
--- a/Lib/test/test_thread.py
+++ b/Lib/test/test_thread.py
@@ -115,3 +115,38 @@
     thread.start_new_thread(task2, (i,))
 done.acquire()
 print 'all tasks done'
+
+# not all platforms support changing thread stack size
+print '\n*** Changing thread stack size ***'
+if thread.stack_size() != 0:
+    raise ValueError, "initial stack_size not 0"
+
+thread.stack_size(0) 
+if thread.stack_size() != 0:
+    raise ValueError, "stack_size not reset to default"
+
+from os import name as os_name
+if os_name in ("nt", "os2", "posix"):
+
+    for tss, ok in ((4096, 0), (32768, 1), (0x400000, 1), (0, 1)):
+        if ok:
+            failed = lambda s, e: s != e
+            fail_msg = "stack_size(%d) failed - should succeed"
+        else:
+            failed = lambda s, e: s == e
+            fail_msg = "stack_size(%d) succeeded - should fail"
+        thread.stack_size(tss)
+        if failed(thread.stack_size(), tss):
+            raise ValueError, fail_msg % tss
+    
+    for tss in (32768, 0x400000):
+        print 'trying stack_size = %d' % tss
+        next_ident = 0
+        for i in range(numtasks):
+            newtask()
+
+        print 'waiting for all tasks to complete'
+        done.acquire()
+        print 'all tasks done'
+
+    thread.stack_size(0)
diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py
index 7eb9758..09e84f4 100644
--- a/Lib/test/test_threading.py
+++ b/Lib/test/test_threading.py
@@ -85,6 +85,22 @@
             print 'all tasks done'
         self.assertEqual(numrunning.get(), 0)
 
+    # run with a minimum thread stack size (32kB)
+    def test_various_ops_small_stack(self):
+        if verbose:
+            print 'with 32kB thread stack size...'
+        threading.stack_size(0x8000)
+        self.test_various_ops()
+        threading.stack_size(0)
+
+    # run with a large thread stack size (16MB)
+    def test_various_ops_large_stack(self):
+        if verbose:
+            print 'with 16MB thread stack size...'
+        threading.stack_size(0x1000000)
+        self.test_various_ops()
+        threading.stack_size(0)
+
     def test_foreign_thread(self):
         # Check that a "foreign" thread can use the threading module.
         def f(mutex):
diff --git a/Lib/threading.py b/Lib/threading.py
index c27140d..5655dde 100644
--- a/Lib/threading.py
+++ b/Lib/threading.py
@@ -15,7 +15,7 @@
 # Rename some stuff so "from threading import *" is safe
 __all__ = ['activeCount', 'Condition', 'currentThread', 'enumerate', 'Event',
            'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Thread',
-           'Timer', 'setprofile', 'settrace', 'local']
+           'Timer', 'setprofile', 'settrace', 'local', 'stack_size']
 
 _start_new_thread = thread.start_new_thread
 _allocate_lock = thread.allocate_lock
@@ -713,6 +713,8 @@
     _active_limbo_lock.release()
     return active
 
+from thread import stack_size
+
 # Create the main thread object
 
 _MainThread()