mirror of
https://github.com/python/cpython.git
synced 2025-12-23 09:19:18 +00:00
GH-91079: Revert "GH-91079: Implement C stack limits using addresses, not counters. (GH-130007)" for now (GH130413)
Revert "GH-91079: Implement C stack limits using addresses, not counters. (GH-130007)" for now
Unfortunatlely, the change broke some buildbots.
This reverts commit 2498c22fa0.
This commit is contained in:
parent
0ff1611574
commit
ef29104f7d
47 changed files with 1466 additions and 1220 deletions
|
|
@ -487,19 +487,18 @@ PyAPI_FUNC(void) _PyTrash_thread_destroy_chain(PyThreadState *tstate);
|
|||
* we have headroom above the trigger limit */
|
||||
#define Py_TRASHCAN_HEADROOM 50
|
||||
|
||||
/* Helper function for Py_TRASHCAN_BEGIN */
|
||||
PyAPI_FUNC(int) _Py_ReachedRecursionLimitWithMargin(PyThreadState *tstate, int margin_count);
|
||||
|
||||
#define Py_TRASHCAN_BEGIN(op, dealloc) \
|
||||
do { \
|
||||
PyThreadState *tstate = PyThreadState_Get(); \
|
||||
if (_Py_ReachedRecursionLimitWithMargin(tstate, 1) && Py_TYPE(op)->tp_dealloc == (destructor)dealloc) { \
|
||||
if (tstate->c_recursion_remaining <= Py_TRASHCAN_HEADROOM && Py_TYPE(op)->tp_dealloc == (destructor)dealloc) { \
|
||||
_PyTrash_thread_deposit_object(tstate, (PyObject *)op); \
|
||||
break; \
|
||||
}
|
||||
} \
|
||||
tstate->c_recursion_remaining--;
|
||||
/* The body of the deallocator is here. */
|
||||
#define Py_TRASHCAN_END \
|
||||
if (tstate->delete_later && !_Py_ReachedRecursionLimitWithMargin(tstate, 2)) { \
|
||||
tstate->c_recursion_remaining++; \
|
||||
if (tstate->delete_later && tstate->c_recursion_remaining > (Py_TRASHCAN_HEADROOM*2)) { \
|
||||
_PyTrash_thread_destroy_chain(tstate); \
|
||||
} \
|
||||
} while (0);
|
||||
|
|
|
|||
|
|
@ -112,7 +112,7 @@ struct _ts {
|
|||
int py_recursion_remaining;
|
||||
int py_recursion_limit;
|
||||
|
||||
int c_recursion_remaining; /* Retained for backwards compatibility. Do not use */
|
||||
int c_recursion_remaining;
|
||||
int recursion_headroom; /* Allow 50 more calls to handle any errors. */
|
||||
|
||||
/* 'tracing' keeps track of the execution depth when tracing/profiling.
|
||||
|
|
@ -202,7 +202,36 @@ struct _ts {
|
|||
PyObject *threading_local_sentinel;
|
||||
};
|
||||
|
||||
# define Py_C_RECURSION_LIMIT 5000
|
||||
#ifdef Py_DEBUG
|
||||
// A debug build is likely built with low optimization level which implies
|
||||
// higher stack memory usage than a release build: use a lower limit.
|
||||
# define Py_C_RECURSION_LIMIT 500
|
||||
#elif defined(__s390x__)
|
||||
# define Py_C_RECURSION_LIMIT 800
|
||||
#elif defined(_WIN32) && defined(_M_ARM64)
|
||||
# define Py_C_RECURSION_LIMIT 1000
|
||||
#elif defined(_WIN32)
|
||||
# define Py_C_RECURSION_LIMIT 3000
|
||||
#elif defined(__ANDROID__)
|
||||
// On an ARM64 emulator, API level 34 was OK with 10000, but API level 21
|
||||
// crashed in test_compiler_recursion_limit.
|
||||
# define Py_C_RECURSION_LIMIT 3000
|
||||
#elif defined(_Py_ADDRESS_SANITIZER)
|
||||
# define Py_C_RECURSION_LIMIT 4000
|
||||
#elif defined(__sparc__)
|
||||
// test_descr crashed on sparc64 with >7000 but let's keep a margin of error.
|
||||
# define Py_C_RECURSION_LIMIT 4000
|
||||
#elif defined(__wasi__)
|
||||
// Based on wasmtime 16.
|
||||
# define Py_C_RECURSION_LIMIT 5000
|
||||
#elif defined(__hppa__) || defined(__powerpc64__)
|
||||
// test_descr crashed with >8000 but let's keep a margin of error.
|
||||
# define Py_C_RECURSION_LIMIT 5000
|
||||
#else
|
||||
// This value is duplicated in Lib/test/support/__init__.py
|
||||
# define Py_C_RECURSION_LIMIT 10000
|
||||
#endif
|
||||
|
||||
|
||||
/* other API */
|
||||
|
||||
|
|
@ -217,6 +246,7 @@ _PyThreadState_UncheckedGet(void)
|
|||
return PyThreadState_GetUnchecked();
|
||||
}
|
||||
|
||||
|
||||
// Disable tracing and profiling.
|
||||
PyAPI_FUNC(void) PyThreadState_EnterTracing(PyThreadState *tstate);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue