summaryrefslogtreecommitdiffstats
path: root/Include
diff options
context:
space:
mode:
authorSam Gross <colesbury@gmail.com>2023-12-07 19:11:45 (GMT)
committerGitHub <noreply@github.com>2023-12-07 19:11:45 (GMT)
commitdb460735af7503984d1b7d878069722db44b11e8 (patch)
tree5f8579b85da5f0902f5d14c8711de77256156aba /Include
parentbf0beae6a05f3266606a21e22a4d803abbb8d731 (diff)
downloadcpython-db460735af7503984d1b7d878069722db44b11e8.zip
cpython-db460735af7503984d1b7d878069722db44b11e8.tar.gz
cpython-db460735af7503984d1b7d878069722db44b11e8.tar.bz2
gh-112538: Add internal-only _PyThreadStateImpl "wrapper" for PyThreadState (gh-112560)
Every PyThreadState instance is now actually a _PyThreadStateImpl. It is safe to cast from `PyThreadState*` to `_PyThreadStateImpl*` and back. The _PyThreadStateImpl will contain fields that we do not want to expose in the public C API.
Diffstat (limited to 'Include')
-rw-r--r--Include/internal/pycore_interp.h5
-rw-r--r--Include/internal/pycore_runtime_init.h7
-rw-r--r--Include/internal/pycore_tstate.h26
3 files changed, 35 insertions, 3 deletions
diff --git a/Include/internal/pycore_interp.h b/Include/internal/pycore_interp.h
index 498db8b..2a68319 100644
--- a/Include/internal/pycore_interp.h
+++ b/Include/internal/pycore_interp.h
@@ -29,6 +29,7 @@ extern "C" {
#include "pycore_list.h" // struct _Py_list_state
#include "pycore_object_state.h" // struct _py_object_state
#include "pycore_obmalloc.h" // struct _obmalloc_state
+#include "pycore_tstate.h" // _PyThreadStateImpl
#include "pycore_tuple.h" // struct _Py_tuple_state
#include "pycore_typeobject.h" // struct types_state
#include "pycore_unicodeobject.h" // struct _Py_unicode_state
@@ -210,8 +211,8 @@ struct _is {
struct _Py_interp_cached_objects cached_objects;
struct _Py_interp_static_objects static_objects;
- /* the initial PyInterpreterState.threads.head */
- PyThreadState _initial_thread;
+ /* the initial PyInterpreterState.threads.head */
+ _PyThreadStateImpl _initial_thread;
Py_ssize_t _interactive_src_count;
};
diff --git a/Include/internal/pycore_runtime_init.h b/Include/internal/pycore_runtime_init.h
index fa5d811..d324a94 100644
--- a/Include/internal/pycore_runtime_init.h
+++ b/Include/internal/pycore_runtime_init.h
@@ -186,7 +186,12 @@ extern PyTypeObject _PyExc_MemoryError;
}, \
}, \
}, \
- ._initial_thread = _PyThreadState_INIT, \
+ ._initial_thread = _PyThreadStateImpl_INIT, \
+ }
+
+#define _PyThreadStateImpl_INIT \
+ { \
+ .base = _PyThreadState_INIT, \
}
#define _PyThreadState_INIT \
diff --git a/Include/internal/pycore_tstate.h b/Include/internal/pycore_tstate.h
new file mode 100644
index 0000000..17f3e86
--- /dev/null
+++ b/Include/internal/pycore_tstate.h
@@ -0,0 +1,26 @@
+#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
+
+
+// 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;
+
+ // TODO: add private fields here
+} _PyThreadStateImpl;
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* !Py_INTERNAL_TSTATE_H */