mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
gh-106140: Reorder some fields to facilitate out-of-process inspection (#106143)
Signed-off-by: Pablo Galindo <pablogsal@gmail.com>
This commit is contained in:
parent
bb578a0c30
commit
2d5a1c2811
2 changed files with 52 additions and 41 deletions
|
@ -48,12 +48,22 @@ struct _Py_long_state {
|
||||||
*/
|
*/
|
||||||
struct _is {
|
struct _is {
|
||||||
|
|
||||||
struct _ceval_state ceval;
|
|
||||||
PyInterpreterState *next;
|
PyInterpreterState *next;
|
||||||
|
|
||||||
|
int64_t id;
|
||||||
|
int64_t id_refcount;
|
||||||
|
int requires_idref;
|
||||||
|
PyThread_type_lock id_mutex;
|
||||||
|
|
||||||
|
/* Has been initialized to a safe state.
|
||||||
|
|
||||||
|
In order to be effective, this must be set to 0 during or right
|
||||||
|
after allocation. */
|
||||||
|
int _initialized;
|
||||||
|
int finalizing;
|
||||||
|
|
||||||
uint64_t monitoring_version;
|
uint64_t monitoring_version;
|
||||||
uint64_t last_restart_version;
|
uint64_t last_restart_version;
|
||||||
|
|
||||||
struct pythreads {
|
struct pythreads {
|
||||||
uint64_t next_unique_id;
|
uint64_t next_unique_id;
|
||||||
/* The linked list of threads, newest first. */
|
/* The linked list of threads, newest first. */
|
||||||
|
@ -72,18 +82,6 @@ struct _is {
|
||||||
Get runtime from tstate: tstate->interp->runtime. */
|
Get runtime from tstate: tstate->interp->runtime. */
|
||||||
struct pyruntimestate *runtime;
|
struct pyruntimestate *runtime;
|
||||||
|
|
||||||
int64_t id;
|
|
||||||
int64_t id_refcount;
|
|
||||||
int requires_idref;
|
|
||||||
PyThread_type_lock id_mutex;
|
|
||||||
|
|
||||||
/* Has been initialized to a safe state.
|
|
||||||
|
|
||||||
In order to be effective, this must be set to 0 during or right
|
|
||||||
after allocation. */
|
|
||||||
int _initialized;
|
|
||||||
int finalizing;
|
|
||||||
|
|
||||||
/* Set by Py_EndInterpreter().
|
/* Set by Py_EndInterpreter().
|
||||||
|
|
||||||
Use _PyInterpreterState_GetFinalizing()
|
Use _PyInterpreterState_GetFinalizing()
|
||||||
|
@ -91,17 +89,33 @@ struct _is {
|
||||||
to access it, don't access it directly. */
|
to access it, don't access it directly. */
|
||||||
_Py_atomic_address _finalizing;
|
_Py_atomic_address _finalizing;
|
||||||
|
|
||||||
struct _obmalloc_state obmalloc;
|
|
||||||
|
|
||||||
struct _gc_runtime_state gc;
|
struct _gc_runtime_state gc;
|
||||||
|
|
||||||
struct _import_state imports;
|
/* The following fields are here to avoid allocation during init.
|
||||||
|
The data is exposed through PyInterpreterState pointer fields.
|
||||||
|
These fields should not be accessed directly outside of init.
|
||||||
|
|
||||||
|
All other PyInterpreterState pointer fields are populated when
|
||||||
|
needed and default to NULL.
|
||||||
|
|
||||||
|
For now there are some exceptions to that rule, which require
|
||||||
|
allocation during init. These will be addressed on a case-by-case
|
||||||
|
basis. Also see _PyRuntimeState regarding the various mutex fields.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* The per-interpreter GIL, which might not be used. */
|
||||||
|
struct _gil_runtime_state _gil;
|
||||||
|
|
||||||
// Dictionary of the sys module
|
// Dictionary of the sys module
|
||||||
PyObject *sysdict;
|
PyObject *sysdict;
|
||||||
// Dictionary of the builtins module
|
// Dictionary of the builtins module
|
||||||
PyObject *builtins;
|
PyObject *builtins;
|
||||||
|
|
||||||
|
/* ---------- IMPORTANT ---------------------------
|
||||||
|
The fields above this line are declared as early as
|
||||||
|
possible to facilitate out-of-process observability
|
||||||
|
tools. */
|
||||||
|
|
||||||
PyObject *codec_search_path;
|
PyObject *codec_search_path;
|
||||||
PyObject *codec_search_cache;
|
PyObject *codec_search_cache;
|
||||||
PyObject *codec_error_registry;
|
PyObject *codec_error_registry;
|
||||||
|
@ -133,6 +147,12 @@ struct _is {
|
||||||
struct _warnings_runtime_state warnings;
|
struct _warnings_runtime_state warnings;
|
||||||
struct atexit_state atexit;
|
struct atexit_state atexit;
|
||||||
|
|
||||||
|
struct _ceval_state ceval;
|
||||||
|
|
||||||
|
struct _obmalloc_state obmalloc;
|
||||||
|
|
||||||
|
struct _import_state imports;
|
||||||
|
|
||||||
PyObject *audit_hooks;
|
PyObject *audit_hooks;
|
||||||
PyType_WatchCallback type_watchers[TYPE_MAX_WATCHERS];
|
PyType_WatchCallback type_watchers[TYPE_MAX_WATCHERS];
|
||||||
PyCode_WatchCallback code_watchers[CODE_MAX_WATCHERS];
|
PyCode_WatchCallback code_watchers[CODE_MAX_WATCHERS];
|
||||||
|
@ -175,22 +195,7 @@ struct _is {
|
||||||
struct _Py_interp_cached_objects cached_objects;
|
struct _Py_interp_cached_objects cached_objects;
|
||||||
struct _Py_interp_static_objects static_objects;
|
struct _Py_interp_static_objects static_objects;
|
||||||
|
|
||||||
/* The following fields are here to avoid allocation during init.
|
/* the initial PyInterpreterState.threads.head */
|
||||||
The data is exposed through PyInterpreterState pointer fields.
|
|
||||||
These fields should not be accessed directly outside of init.
|
|
||||||
|
|
||||||
All other PyInterpreterState pointer fields are populated when
|
|
||||||
needed and default to NULL.
|
|
||||||
|
|
||||||
For now there are some exceptions to that rule, which require
|
|
||||||
allocation during init. These will be addressed on a case-by-case
|
|
||||||
basis. Also see _PyRuntimeState regarding the various mutex fields.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* The per-interpreter GIL, which might not be used. */
|
|
||||||
struct _gil_runtime_state _gil;
|
|
||||||
|
|
||||||
/* the initial PyInterpreterState.threads.head */
|
|
||||||
PyThreadState _initial_thread;
|
PyThreadState _initial_thread;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -84,13 +84,6 @@ typedef struct pyruntimestate {
|
||||||
to access it, don't access it directly. */
|
to access it, don't access it directly. */
|
||||||
_Py_atomic_address _finalizing;
|
_Py_atomic_address _finalizing;
|
||||||
|
|
||||||
struct _pymem_allocators allocators;
|
|
||||||
struct _obmalloc_global_state obmalloc;
|
|
||||||
struct pyhash_runtime_state pyhash_state;
|
|
||||||
struct _time_runtime_state time;
|
|
||||||
struct _pythread_runtime_state threads;
|
|
||||||
struct _signals_runtime_state signals;
|
|
||||||
|
|
||||||
struct pyinterpreters {
|
struct pyinterpreters {
|
||||||
PyThread_type_lock mutex;
|
PyThread_type_lock mutex;
|
||||||
/* The linked list of interpreters, newest first. */
|
/* The linked list of interpreters, newest first. */
|
||||||
|
@ -109,13 +102,26 @@ typedef struct pyruntimestate {
|
||||||
using a Python int. */
|
using a Python int. */
|
||||||
int64_t next_id;
|
int64_t next_id;
|
||||||
} interpreters;
|
} interpreters;
|
||||||
|
|
||||||
|
unsigned long main_thread;
|
||||||
|
|
||||||
|
/* ---------- IMPORTANT ---------------------------
|
||||||
|
The fields above this line are declared as early as
|
||||||
|
possible to facilitate out-of-process observability
|
||||||
|
tools. */
|
||||||
|
|
||||||
// XXX Remove this field once we have a tp_* slot.
|
// XXX Remove this field once we have a tp_* slot.
|
||||||
struct _xidregistry {
|
struct _xidregistry {
|
||||||
PyThread_type_lock mutex;
|
PyThread_type_lock mutex;
|
||||||
struct _xidregitem *head;
|
struct _xidregitem *head;
|
||||||
} xidregistry;
|
} xidregistry;
|
||||||
|
|
||||||
unsigned long main_thread;
|
struct _pymem_allocators allocators;
|
||||||
|
struct _obmalloc_global_state obmalloc;
|
||||||
|
struct pyhash_runtime_state pyhash_state;
|
||||||
|
struct _time_runtime_state time;
|
||||||
|
struct _pythread_runtime_state threads;
|
||||||
|
struct _signals_runtime_state signals;
|
||||||
|
|
||||||
/* Used for the thread state bound to the current thread. */
|
/* Used for the thread state bound to the current thread. */
|
||||||
Py_tss_t autoTSSkey;
|
Py_tss_t autoTSSkey;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue