summaryrefslogtreecommitdiffstats
path: root/Include
diff options
context:
space:
mode:
authorPablo Galindo Salgado <Pablogsal@gmail.com>2023-06-08 15:59:38 (GMT)
committerGitHub <noreply@github.com>2023-06-08 15:59:38 (GMT)
commit6a8b8623574b6d07ee6caf4d007c4778a7c2d372 (patch)
tree0ebf4b891df8cc99080a6c0ecd06006b5b8a4124 /Include
parenta8eb7372eebe182fd4ef7381a742d84a368a7d1b (diff)
downloadcpython-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.h14
-rw-r--r--Include/internal/pycore_interp.h80
-rw-r--r--Include/internal/pycore_runtime.h20
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;