mirror of
https://github.com/python/cpython.git
synced 2024-11-25 09:39:56 +01:00
2e95c5ba3b
Each thread specializes a thread-local copy of the bytecode, created on the first RESUME, in free-threaded builds. All copies of the bytecode for a code object are stored in the co_tlbc array on the code object. Threads reserve a globally unique index identifying its copy of the bytecode in all co_tlbc arrays at thread creation and release the index at thread destruction. The first entry in every co_tlbc array always points to the "main" copy of the bytecode that is stored at the end of the code object. This ensures that no bytecode is copied for programs that do not use threads. Thread-local bytecode can be disabled at runtime by providing either -X tlbc=0 or PYTHON_TLBC=0. Disabling thread-local bytecode also disables specialization. Concurrent modifications to the bytecode made by the specializing interpreter and instrumentation use atomics, with specialization taking care not to overwrite an instruction that was instrumented concurrently.
62 lines
1.8 KiB
C
62 lines
1.8 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_brc.h" // struct _brc_thread_state
|
|
#include "pycore_freelist_state.h" // struct _Py_freelists
|
|
#include "pycore_mimalloc.h" // struct _mimalloc_thread_state
|
|
#include "pycore_qsbr.h" // struct qsbr
|
|
|
|
|
|
// 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;
|
|
|
|
PyObject *asyncio_running_loop; // Strong reference
|
|
|
|
struct _qsbr_thread_state *qsbr; // only used by free-threaded build
|
|
struct llist_node mem_free_queue; // delayed free queue
|
|
|
|
#ifdef Py_GIL_DISABLED
|
|
struct _gc_thread_state gc;
|
|
struct _mimalloc_thread_state mimalloc;
|
|
struct _Py_freelists freelists;
|
|
struct _brc_thread_state brc;
|
|
struct {
|
|
// The per-thread refcounts
|
|
Py_ssize_t *values;
|
|
|
|
// Size of the refcounts array.
|
|
Py_ssize_t size;
|
|
|
|
// If set, don't use per-thread refcounts
|
|
int is_finalized;
|
|
} refcounts;
|
|
|
|
// Index to use to retrieve thread-local bytecode for this thread
|
|
int32_t tlbc_index;
|
|
|
|
// When >1, code objects do not immortalize their non-string constants.
|
|
int suppress_co_const_immortalization;
|
|
#endif
|
|
|
|
#if defined(Py_REF_DEBUG) && defined(Py_GIL_DISABLED)
|
|
Py_ssize_t reftotal; // this thread's total refcount operations
|
|
#endif
|
|
|
|
} _PyThreadStateImpl;
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#endif /* !Py_INTERNAL_TSTATE_H */
|