mirror of
https://github.com/python/cpython.git
synced 2025-07-07 11:25:30 +00:00
gh-130396: Move PYOS_LOG2_STACK_MARGIN to internal headers (#135928)
Move PYOS_LOG2_STACK_MARGIN, PYOS_STACK_MARGIN, PYOS_STACK_MARGIN_BYTES and PYOS_STACK_MARGIN_SHIFT macros to pycore_pythonrun.h internal header. Add underscore (_) prefix to the names to make them private. Rename _PYOS to _PyOS.
This commit is contained in:
parent
0e19db653d
commit
28940e8e48
5 changed files with 34 additions and 32 deletions
|
@ -8,6 +8,7 @@ extern "C" {
|
|||
# error "this header requires Py_BUILD_CORE define"
|
||||
#endif
|
||||
|
||||
#include "pycore_pythonrun.h" // _PyOS_STACK_MARGIN_SHIFT
|
||||
#include "pycore_typedefs.h" // _PyRuntimeState
|
||||
#include "pycore_tstate.h"
|
||||
|
||||
|
@ -325,7 +326,7 @@ _Py_RecursionLimit_GetMargin(PyThreadState *tstate)
|
|||
_PyThreadStateImpl *_tstate = (_PyThreadStateImpl *)tstate;
|
||||
assert(_tstate->c_stack_hard_limit != 0);
|
||||
intptr_t here_addr = _Py_get_machine_stack_pointer();
|
||||
return Py_ARITHMETIC_RIGHT_SHIFT(intptr_t, here_addr - (intptr_t)_tstate->c_stack_soft_limit, PYOS_STACK_MARGIN_SHIFT);
|
||||
return Py_ARITHMETIC_RIGHT_SHIFT(intptr_t, here_addr - (intptr_t)_tstate->c_stack_soft_limit, _PyOS_STACK_MARGIN_SHIFT);
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -33,6 +33,28 @@ extern const char* _Py_SourceAsString(
|
|||
PyCompilerFlags *cf,
|
||||
PyObject **cmd_copy);
|
||||
|
||||
|
||||
/* Stack size, in "pointers". This must be large enough, so
|
||||
* no two calls to check recursion depth are more than this far
|
||||
* apart. In practice, that means it must be larger than the C
|
||||
* stack consumption of PyEval_EvalDefault */
|
||||
#if defined(_Py_ADDRESS_SANITIZER) || defined(_Py_THREAD_SANITIZER)
|
||||
# define _PyOS_LOG2_STACK_MARGIN 12
|
||||
#elif defined(Py_DEBUG) && defined(WIN32)
|
||||
# define _PyOS_LOG2_STACK_MARGIN 12
|
||||
#else
|
||||
# define _PyOS_LOG2_STACK_MARGIN 11
|
||||
#endif
|
||||
#define _PyOS_STACK_MARGIN (1 << _PyOS_LOG2_STACK_MARGIN)
|
||||
#define _PyOS_STACK_MARGIN_BYTES (_PyOS_STACK_MARGIN * sizeof(void *))
|
||||
|
||||
#if SIZEOF_VOID_P == 8
|
||||
# define _PyOS_STACK_MARGIN_SHIFT (_PyOS_LOG2_STACK_MARGIN + 3)
|
||||
#else
|
||||
# define _PyOS_STACK_MARGIN_SHIFT (_PyOS_LOG2_STACK_MARGIN + 2)
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -21,36 +21,15 @@ PyAPI_FUNC(void) PyErr_DisplayException(PyObject *);
|
|||
/* Stuff with no proper home (yet) */
|
||||
PyAPI_DATA(int) (*PyOS_InputHook)(void);
|
||||
|
||||
/* Stack size, in "pointers". This must be large enough, so
|
||||
* no two calls to check recursion depth are more than this far
|
||||
* apart. In practice, that means it must be larger than the C
|
||||
* stack consumption of PyEval_EvalDefault */
|
||||
#if defined(_Py_ADDRESS_SANITIZER) || defined(_Py_THREAD_SANITIZER)
|
||||
# define PYOS_LOG2_STACK_MARGIN 12
|
||||
#elif defined(Py_DEBUG) && defined(WIN32)
|
||||
# define PYOS_LOG2_STACK_MARGIN 12
|
||||
#else
|
||||
# define PYOS_LOG2_STACK_MARGIN 11
|
||||
#endif
|
||||
#define PYOS_STACK_MARGIN (1 << PYOS_LOG2_STACK_MARGIN)
|
||||
#define PYOS_STACK_MARGIN_BYTES (PYOS_STACK_MARGIN * sizeof(void *))
|
||||
|
||||
#if SIZEOF_VOID_P == 8
|
||||
#define PYOS_STACK_MARGIN_SHIFT (PYOS_LOG2_STACK_MARGIN + 3)
|
||||
#else
|
||||
#define PYOS_STACK_MARGIN_SHIFT (PYOS_LOG2_STACK_MARGIN + 2)
|
||||
#endif
|
||||
|
||||
|
||||
#if defined(WIN32)
|
||||
#define USE_STACKCHECK
|
||||
# define USE_STACKCHECK
|
||||
#endif
|
||||
|
||||
#ifdef USE_STACKCHECK
|
||||
/* Check that we aren't overflowing our stack */
|
||||
PyAPI_FUNC(int) PyOS_CheckStack(void);
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef Py_LIMITED_API
|
||||
# define Py_CPYTHON_PYTHONRUN_H
|
||||
# include "cpython/pythonrun.h"
|
||||
|
|
|
@ -121,7 +121,7 @@ get_c_recursion_remaining(PyObject *self, PyObject *Py_UNUSED(args))
|
|||
PyThreadState *tstate = _PyThreadState_GET();
|
||||
uintptr_t here_addr = _Py_get_machine_stack_pointer();
|
||||
_PyThreadStateImpl *_tstate = (_PyThreadStateImpl *)tstate;
|
||||
int remaining = (int)((here_addr - _tstate->c_stack_soft_limit)/PYOS_STACK_MARGIN_BYTES * 50);
|
||||
int remaining = (int)((here_addr - _tstate->c_stack_soft_limit) / _PyOS_STACK_MARGIN_BYTES * 50);
|
||||
return PyLong_FromLong(remaining);
|
||||
}
|
||||
|
||||
|
|
|
@ -346,13 +346,13 @@ _Py_ReachedRecursionLimitWithMargin(PyThreadState *tstate, int margin_count)
|
|||
{
|
||||
uintptr_t here_addr = _Py_get_machine_stack_pointer();
|
||||
_PyThreadStateImpl *_tstate = (_PyThreadStateImpl *)tstate;
|
||||
if (here_addr > _tstate->c_stack_soft_limit + margin_count * PYOS_STACK_MARGIN_BYTES) {
|
||||
if (here_addr > _tstate->c_stack_soft_limit + margin_count * _PyOS_STACK_MARGIN_BYTES) {
|
||||
return 0;
|
||||
}
|
||||
if (_tstate->c_stack_hard_limit == 0) {
|
||||
_Py_InitializeRecursionLimits(tstate);
|
||||
}
|
||||
return here_addr <= _tstate->c_stack_soft_limit + margin_count * PYOS_STACK_MARGIN_BYTES;
|
||||
return here_addr <= _tstate->c_stack_soft_limit + margin_count * _PyOS_STACK_MARGIN_BYTES;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -448,8 +448,8 @@ _Py_InitializeRecursionLimits(PyThreadState *tstate)
|
|||
_tstate->c_stack_top = (uintptr_t)high;
|
||||
ULONG guarantee = 0;
|
||||
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;
|
||||
_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;
|
||||
#else
|
||||
uintptr_t here_addr = _Py_get_machine_stack_pointer();
|
||||
# if defined(HAVE_PTHREAD_GETATTR_NP) && !defined(_AIX) && !defined(__NetBSD__)
|
||||
|
@ -469,9 +469,9 @@ _Py_InitializeRecursionLimits(PyThreadState *tstate)
|
|||
// Thread sanitizer crashes if we use a bit more than half the stack.
|
||||
_tstate->c_stack_soft_limit = base + (stack_size / 2);
|
||||
#else
|
||||
_tstate->c_stack_soft_limit = base + PYOS_STACK_MARGIN_BYTES * 2;
|
||||
_tstate->c_stack_soft_limit = base + _PyOS_STACK_MARGIN_BYTES * 2;
|
||||
#endif
|
||||
_tstate->c_stack_hard_limit = base + PYOS_STACK_MARGIN_BYTES;
|
||||
_tstate->c_stack_hard_limit = base + _PyOS_STACK_MARGIN_BYTES;
|
||||
assert(_tstate->c_stack_soft_limit < here_addr);
|
||||
assert(here_addr < _tstate->c_stack_top);
|
||||
return;
|
||||
|
@ -479,7 +479,7 @@ _Py_InitializeRecursionLimits(PyThreadState *tstate)
|
|||
# endif
|
||||
_tstate->c_stack_top = _Py_SIZE_ROUND_UP(here_addr, 4096);
|
||||
_tstate->c_stack_soft_limit = _tstate->c_stack_top - Py_C_STACK_SIZE;
|
||||
_tstate->c_stack_hard_limit = _tstate->c_stack_top - (Py_C_STACK_SIZE + PYOS_STACK_MARGIN_BYTES);
|
||||
_tstate->c_stack_hard_limit = _tstate->c_stack_top - (Py_C_STACK_SIZE + _PyOS_STACK_MARGIN_BYTES);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue