From: Rok Mandeljc Date: Wed, 24 Sep 2025 10:57:00 +0000 (+0200) Subject: gh-139231: Fix estimation of available stack size for recursion limit on macOS (GH... X-Git-Tag: v3.15.0a1~213 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=7016044de919fa2f14f7c0e0d15ac076b00f16a0;p=thirdparty%2FPython%2Fcpython.git gh-139231: Fix estimation of available stack size for recursion limit on macOS (GH-139232) Use `pthread_get_stackaddr_np()` and `pthread_get_stacksize_np()` to determine the stack address and size. --- diff --git a/Python/ceval.c b/Python/ceval.c index 7abbc9e9fd12..0ccaacaf3ed5 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -451,6 +451,13 @@ _Py_InitializeRecursionLimits(PyThreadState *tstate) SetThreadStackGuarantee(&guarantee); _tstate->c_stack_hard_limit = ((uintptr_t)low) + guarantee + _PyOS_STACK_MARGIN_BYTES; _tstate->c_stack_soft_limit = _tstate->c_stack_hard_limit + _PyOS_STACK_MARGIN_BYTES; +#elif defined(__APPLE__) + pthread_t this_thread = pthread_self(); + void *stack_addr = pthread_get_stackaddr_np(this_thread); // top of the stack + size_t stack_size = pthread_get_stacksize_np(this_thread); + _tstate->c_stack_top = (uintptr_t)stack_addr; + _tstate->c_stack_hard_limit = _tstate->c_stack_top - stack_size; + _tstate->c_stack_soft_limit = _tstate->c_stack_hard_limit + _PyOS_STACK_MARGIN_BYTES; #else uintptr_t here_addr = _Py_get_machine_stack_pointer(); /// XXX musl supports HAVE_PTHRED_GETATTR_NP, but the resulting stack size