diff options
author | Pablo Galindo Salgado <Pablogsal@gmail.com> | 2023-06-08 15:59:38 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-06-08 15:59:38 (GMT) |
commit | 6a8b8623574b6d07ee6caf4d007c4778a7c2d372 (patch) | |
tree | 0ebf4b891df8cc99080a6c0ecd06006b5b8a4124 /Include | |
parent | a8eb7372eebe182fd4ef7381a742d84a368a7d1b (diff) | |
download | cpython-6a8b8623574b6d07ee6caf4d007c4778a7c2d372.zip cpython-6a8b8623574b6d07ee6caf4d007c4778a7c2d372.tar.gz cpython-6a8b8623574b6d07ee6caf4d007c4778a7c2d372.tar.bz2 |
Revert "Move observability-relevant structure fields to the top" (#105512)
Diffstat (limited to 'Include')
-rw-r--r-- | Include/internal/pycore_frame.h | 14 | ||||
-rw-r--r-- | Include/internal/pycore_interp.h | 80 | ||||
-rw-r--r-- | Include/internal/pycore_runtime.h | 20 |
3 files changed, 51 insertions, 63 deletions
diff --git a/Include/internal/pycore_frame.h b/Include/internal/pycore_frame.h index 0c72de6..a72e03f 100644 --- a/Include/internal/pycore_frame.h +++ b/Include/internal/pycore_frame.h @@ -49,20 +49,16 @@ enum _frameowner { typedef struct _PyInterpreterFrame { PyCodeObject *f_code; /* Strong reference */ struct _PyInterpreterFrame *previous; - // NOTE: This is not necessarily the last instruction started in the given - // frame. Rather, it is the code unit *prior to* the *next* instruction. For - // example, it may be an inline CACHE entry, an instruction we just jumped - // over, or (in the case of a newly-created frame) a totally invalid value: - _Py_CODEUNIT *prev_instr; - - /* The fields above this line are declared as early as possible to - facilitate out-of-process observability tools. */ - PyObject *f_funcobj; /* Strong reference. Only valid if not on C stack */ PyObject *f_globals; /* Borrowed reference. Only valid if not on C stack */ PyObject *f_builtins; /* Borrowed reference. Only valid if not on C stack */ PyObject *f_locals; /* Strong reference, may be NULL. Only valid if not on C stack */ PyFrameObject *frame_obj; /* Strong reference, may be NULL. Only valid if not on C stack */ + // NOTE: This is not necessarily the last instruction started in the given + // frame. Rather, it is the code unit *prior to* the *next* instruction. For + // example, it may be an inline CACHE entry, an instruction we just jumped + // over, or (in the case of a newly-created frame) a totally invalid value: + _Py_CODEUNIT *prev_instr; int stacktop; /* Offset of TOS from localsplus */ /* The return_offset determines where a `RETURN` should go in the caller, * relative to `prev_instr`. diff --git a/Include/internal/pycore_interp.h b/Include/internal/pycore_interp.h index 90580b7..a6f4677 100644 --- a/Include/internal/pycore_interp.h +++ b/Include/internal/pycore_interp.h @@ -47,35 +47,13 @@ struct _Py_long_state { The PyInterpreterState typedef is in Include/pytypedefs.h. */ struct _is { - 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; + struct _ceval_state ceval; + PyInterpreterState *next; uint64_t monitoring_version; uint64_t last_restart_version; - /* The fields above this line are declared as early as possible to - facilitate out-of-process observability tools. */ - - /* Set by Py_EndInterpreter(). - - Use _PyInterpreterState_GetFinalizing() - and _PyInterpreterState_SetFinalizing() - to access it, don't access it directly. */ - _Py_atomic_address _finalizing; - - PyCodeObject *interpreter_trampoline; - struct pythreads { uint64_t next_unique_id; /* The linked list of threads, newest first. */ @@ -94,22 +72,30 @@ struct _is { Get runtime from tstate: tstate->interp->runtime. */ struct pyruntimestate *runtime; - struct _gc_runtime_state gc; + int64_t id; + int64_t id_refcount; + int requires_idref; + PyThread_type_lock id_mutex; - /* 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. + /* Has been initialized to a safe state. - All other PyInterpreterState pointer fields are populated when - needed and default to NULL. + In order to be effective, this must be set to 0 during or right + after allocation. */ + int _initialized; + int finalizing; - 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. - */ + /* Set by Py_EndInterpreter(). - /* The per-interpreter GIL, which might not be used. */ - struct _gil_runtime_state _gil; + Use _PyInterpreterState_GetFinalizing() + and _PyInterpreterState_SetFinalizing() + to access it, don't access it directly. */ + _Py_atomic_address _finalizing; + + struct _obmalloc_state obmalloc; + + struct _gc_runtime_state gc; + + struct _import_state imports; // Dictionary of the sys module PyObject *sysdict; @@ -147,12 +133,6 @@ struct _is { struct _warnings_runtime_state warnings; struct atexit_state atexit; - struct _ceval_state ceval; - - struct _obmalloc_state obmalloc; - - struct _import_state imports; - PyObject *audit_hooks; PyType_WatchCallback type_watchers[TYPE_MAX_WATCHERS]; PyCode_WatchCallback code_watchers[CODE_MAX_WATCHERS]; @@ -179,6 +159,7 @@ struct _is { struct ast_state ast; struct types_state types; struct callable_cache callable_cache; + PyCodeObject *interpreter_trampoline; _PyOptimizerObject *optimizer; uint16_t optimizer_resume_threshold; uint16_t optimizer_backedge_threshold; @@ -195,6 +176,21 @@ struct _is { struct _Py_interp_cached_objects cached_objects; struct _Py_interp_static_objects static_objects; + /* 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; + /* the initial PyInterpreterState.threads.head */ PyThreadState _initial_thread; }; diff --git a/Include/internal/pycore_runtime.h b/Include/internal/pycore_runtime.h index 6e8f16a..6e06e87 100644 --- a/Include/internal/pycore_runtime.h +++ b/Include/internal/pycore_runtime.h @@ -84,6 +84,13 @@ typedef struct pyruntimestate { to access it, don't access it directly. */ _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 { PyThread_type_lock mutex; /* The linked list of interpreters, newest first. */ @@ -102,24 +109,13 @@ typedef struct pyruntimestate { using a Python int. */ int64_t next_id; } interpreters; - - unsigned long main_thread; - - /* 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. struct _xidregistry { PyThread_type_lock mutex; struct _xidregitem *head; } xidregistry; - 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; + unsigned long main_thread; /* Used for the thread state bound to the current thread. */ Py_tss_t autoTSSkey; |