]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-39947: Add PyThreadState_GetInterpreter() (GH-18981)
authorVictor Stinner <vstinner@python.org>
Fri, 13 Mar 2020 22:38:08 +0000 (23:38 +0100)
committerGitHub <noreply@github.com>
Fri, 13 Mar 2020 22:38:08 +0000 (23:38 +0100)
Add PyThreadState_GetInterpreter(tstate): get the interpreter of a
Python thread state.

Doc/c-api/init.rst
Doc/whatsnew/3.9.rst
Include/pystate.h
Misc/NEWS.d/next/C API/2020-03-13-18-10-58.bpo-39947.gmEAaU.rst [new file with mode: 0644]
Modules/faulthandler.c
Python/pystate.c

index 661ed59ceb96dbd8f79cf948515d37d705d9c2ab..f309ad0c03cce9904c2e6aa5ce0fa887f2b27b1a 100644 (file)
@@ -1064,12 +1064,21 @@ All of the following functions must be called after :c:func:`Py_Initialize`.
    :c:func:`PyThreadState_Clear`.
 
 
-   .. c:function:: void PyThreadState_DeleteCurrent()
+.. c:function:: void PyThreadState_DeleteCurrent(void)
 
-    Destroy the current thread state and release the global interpreter lock.
-    Like :c:func:`PyThreadState_Delete`, the global interpreter lock need not
-    be held. The thread state must have been reset with a previous call
-    to :c:func:`PyThreadState_Clear`.
+   Destroy the current thread state and release the global interpreter lock.
+   Like :c:func:`PyThreadState_Delete`, the global interpreter lock need not
+   be held. The thread state must have been reset with a previous call
+   to :c:func:`PyThreadState_Clear`.
+
+
+.. c:function:: PyInterpreterState* PyThreadState_GetInterpreter(PyThreadState *tstate)
+
+   Get the interpreter of the Python thread state *tstate*.
+
+   *tstate* must not be ``NULL``.
+
+   .. versionadded:: 3.9
 
 
 .. c:function:: PyInterpreterState* PyInterpreterState_Get(void)
index 4373e37f55e9c3aac7026fdfcd9045f689f2b3d3..4ef82feba19824e258750ee339114bcc79aeeb6a 100644 (file)
@@ -406,7 +406,8 @@ Optimizations
 Build and C API Changes
 =======================
 
-* New :c:func:`PyInterpreterState_Get` function.
+* New :c:func:`PyThreadState_GetInterpreter` and
+  :c:func:`PyInterpreterState_Get` functions to get the interpreter.
 
 * Add ``--with-platlibdir`` option to the ``configure`` script: name of the
   platform-specific library directory, stored in the new :attr:`sys.platlibdir`
index 57dc9e45a78f3cbe023a58424bd11cf1ed67a0ca..70d3bdc9a78913faa436c1ecdec735fa4c3b71b0 100644 (file)
@@ -87,6 +87,11 @@ PyAPI_FUNC(PyThreadState *) PyThreadState_Swap(PyThreadState *);
 PyAPI_FUNC(PyObject *) PyThreadState_GetDict(void);
 PyAPI_FUNC(int) PyThreadState_SetAsyncExc(unsigned long, PyObject *);
 
+#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03090000
+/* New in 3.9 */
+PyAPI_FUNC(PyInterpreterState *) PyThreadState_GetInterpreter(PyThreadState *tstate);
+#endif
+
 typedef
     enum {PyGILState_LOCKED, PyGILState_UNLOCKED}
         PyGILState_STATE;
diff --git a/Misc/NEWS.d/next/C API/2020-03-13-18-10-58.bpo-39947.gmEAaU.rst b/Misc/NEWS.d/next/C API/2020-03-13-18-10-58.bpo-39947.gmEAaU.rst
new file mode 100644 (file)
index 0000000..668cdbc
--- /dev/null
@@ -0,0 +1,2 @@
+Add :c:func:`PyThreadState_GetInterpreter`: get the interpreter of a Python
+thread state.
index 555e1afc9f82a63e565a78d782dc8e5b9baa4b9d..ba88d9808925f778fc98f557ff05204555da4445 100644 (file)
@@ -540,7 +540,7 @@ faulthandler_py_enable(PyObject *self, PyObject *args, PyObject *kwargs)
     Py_XSETREF(fatal_error.file, file);
     fatal_error.fd = fd;
     fatal_error.all_threads = all_threads;
-    fatal_error.interp = tstate->interp;
+    fatal_error.interp = PyThreadState_GetInterpreter(tstate);
 
     if (faulthandler_enable() < 0) {
         return NULL;
@@ -756,7 +756,7 @@ faulthandler_dump_traceback_later(PyObject *self,
     /* the downcast is safe: we check that 0 < timeout_us < PY_TIMEOUT_MAX */
     thread.timeout_us = (PY_TIMEOUT_T)timeout_us;
     thread.repeat = repeat;
-    thread.interp = tstate->interp;
+    thread.interp = PyThreadState_GetInterpreter(tstate);
     thread.exit = exit;
     thread.header = header;
     thread.header_len = header_len;
@@ -939,7 +939,7 @@ faulthandler_register_py(PyObject *self,
     user->fd = fd;
     user->all_threads = all_threads;
     user->chain = chain;
-    user->interp = tstate->interp;
+    user->interp = PyThreadState_GetInterpreter(tstate);
     user->enabled = 1;
 
     Py_RETURN_NONE;
index 28c5578664475106f5c9ce5792268a2ab9d7b632..f92c2b4c5e2664a907be18f41b77ab3d1743eb35 100644 (file)
@@ -998,6 +998,17 @@ PyThreadState_GetDict(void)
 }
 
 
+PyInterpreterState *
+PyThreadState_GetInterpreter(PyThreadState *tstate)
+{
+    assert(tstate != NULL);
+    if (tstate == NULL) {
+        return NULL;
+    }
+    return tstate->interp;
+}
+
+
 /* Asynchronously raise an exception in a thread.
    Requested by Just van Rossum and Alex Martelli.
    To prevent naive misuse, you must write your own extension