mirror of
https://github.com/python/cpython.git
synced 2025-10-26 03:04:41 +00:00
The GC keeps track of the number of allocations (less deallocations) since the last GC. This buffers the count in thread-local state and uses atomic operations to modify the per-interpreter count. The thread-local buffering avoids contention on shared state. A consequence is that the GC scheduling is not as precise, so "test_sneaky_frame_object" is skipped because it requires that the GC be run exactly after allocating a frame object.
43 lines
1.1 KiB
C
43 lines
1.1 KiB
C
#ifndef Py_INTERNAL_TSTATE_H
|
|
#define Py_INTERNAL_TSTATE_H
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#ifndef Py_BUILD_CORE
|
|
# error "this header requires Py_BUILD_CORE define"
|
|
#endif
|
|
|
|
#include "pycore_freelist.h" // struct _Py_freelist_state
|
|
#include "pycore_mimalloc.h" // struct _mimalloc_thread_state
|
|
#include "pycore_brc.h" // struct _brc_thread_state
|
|
|
|
|
|
static inline void
|
|
_PyThreadState_SetWhence(PyThreadState *tstate, int whence)
|
|
{
|
|
tstate->_whence = whence;
|
|
}
|
|
|
|
|
|
// Every PyThreadState is actually allocated as a _PyThreadStateImpl. The
|
|
// PyThreadState fields are exposed as part of the C API, although most fields
|
|
// are intended to be private. The _PyThreadStateImpl fields not exposed.
|
|
typedef struct _PyThreadStateImpl {
|
|
// semi-public fields are in PyThreadState.
|
|
PyThreadState base;
|
|
|
|
#ifdef Py_GIL_DISABLED
|
|
struct _gc_thread_state gc;
|
|
struct _mimalloc_thread_state mimalloc;
|
|
struct _Py_object_freelists freelists;
|
|
struct _brc_thread_state brc;
|
|
#endif
|
|
|
|
} _PyThreadStateImpl;
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#endif /* !Py_INTERNAL_TSTATE_H */
|