]> granicus.if.org Git - python/commitdiff
On MacOSX StackSpace() may lie because it doesn't know about the stack rlimit. For...
authorJack Jansen <jack.jansen@cwi.nl>
Fri, 2 Feb 2001 22:40:28 +0000 (22:40 +0000)
committerJack Jansen <jack.jansen@cwi.nl>
Fri, 2 Feb 2001 22:40:28 +0000 (22:40 +0000)
Mac/Python/macglue.c

index 8fdbc23acba6a8f80177e490dcdffff9fc843b76..ade635ed9b4070f668e578cf0c7690c06037e168 100644 (file)
@@ -100,6 +100,16 @@ extern pascal unsigned char *PLstrrchr(unsigned char *, unsigned char);
 #endif
 #endif
 
+#if TARGET_API_MAC_CARBON
+/*
+** On MacOSX StackSpace() lies: it gives the distance from heap end to stack pointer,
+** but the stack cannot grow that far due to rlimit values. We cannot get at this value
+** from Carbon, so we set a maximum to the stack here that is based on the default
+** stack limit of 512K.
+*/
+#define MAXIMUM_STACK_SIZE (256*1024)
+#endif
+
 /*
 ** We have to be careful, since we can't handle
 ** things like updates (and they'll keep coming back if we don't
@@ -429,8 +439,15 @@ PyOS_CheckStack()
        static char *sentinel = 0;
        static PyThreadState *thread_for_sentinel = 0;
        
-       if ( sentinel == 0 ) {          
-               sentinel = &here - StackSpace() + MINIMUM_STACK_SIZE;
+       if ( sentinel == 0 ) {
+               unsigned long stackspace = StackSpace();
+               
+#ifdef MAXIMUM_STACK_SIZE
+       /* See the comment at the definition */
+       if ( stackspace > MAXIMUM_STACK_SIZE )
+               stackspace = MAXIMUM_STACK_SIZE;
+#endif 
+               sentinel = &here - stackspace + MINIMUM_STACK_SIZE;
        }
        if ( thread_for_sentinel == 0 ) {
                thread_for_sentinel = PyThreadState_Get();