mirror of
https://github.com/python/cpython.git
synced 2025-08-04 17:08:35 +00:00
pycore_pystate.h no longer redefines PyThreadState_GET() (GH-28921)
Redefining the PyThreadState_GET() macro in pycore_pystate.h is useless since it doesn't affect files not including it. Either use _PyThreadState_GET() directly, or don't use pycore_pystate.h internal C API. For example, the _testcapi extension don't use the internal C API, but use the public PyThreadState_Get() function instead. Replace PyThreadState_Get() with _PyThreadState_GET(). The _PyThreadState_GET() macro is more efficient than PyThreadState_Get() and PyThreadState_GET() function calls which call fail with a fatal Python error. posixmodule.c and _ctypes extension now include <windows.h> before pycore header files (like pycore_call.h). _PyTraceback_Add() now uses _PyErr_Fetch()/_PyErr_Restore() instead of PyErr_Fetch()/PyErr_Restore(). The _decimal and _xxsubinterpreters extensions are now built with the Py_BUILD_CORE_MODULE macro defined to get access to the internal C API.
This commit is contained in:
parent
7733307739
commit
7cdc2a0f4b
23 changed files with 87 additions and 77 deletions
|
@ -27,6 +27,7 @@
|
|||
|
||||
|
||||
#include <Python.h>
|
||||
#include "pycore_pystate.h" // _PyThreadState_GET()
|
||||
#include "longintrepr.h"
|
||||
#include "complexobject.h"
|
||||
#include "mpdecimal.h"
|
||||
|
@ -1511,18 +1512,20 @@ static PyGetSetDef context_getsets [] =
|
|||
static PyObject *
|
||||
current_context_from_dict(void)
|
||||
{
|
||||
PyObject *dict;
|
||||
PyObject *tl_context;
|
||||
PyThreadState *tstate;
|
||||
PyThreadState *tstate = _PyThreadState_GET();
|
||||
#ifdef Py_DEBUG
|
||||
// The caller must hold the GIL
|
||||
_Py_EnsureTstateNotNULL(tstate);
|
||||
#endif
|
||||
|
||||
dict = PyThreadState_GetDict();
|
||||
PyObject *dict = _PyThreadState_GetDict(tstate);
|
||||
if (dict == NULL) {
|
||||
PyErr_SetString(PyExc_RuntimeError,
|
||||
"cannot get thread state");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
tl_context = PyDict_GetItemWithError(dict, tls_context_key);
|
||||
PyObject *tl_context = PyDict_GetItemWithError(dict, tls_context_key);
|
||||
if (tl_context != NULL) {
|
||||
/* We already have a thread local context. */
|
||||
CONTEXT_CHECK(tl_context);
|
||||
|
@ -1548,11 +1551,8 @@ current_context_from_dict(void)
|
|||
|
||||
/* Cache the context of the current thread, assuming that it
|
||||
* will be accessed several times before a thread switch. */
|
||||
tstate = PyThreadState_GET();
|
||||
if (tstate) {
|
||||
cached_context = (PyDecContextObject *)tl_context;
|
||||
cached_context->tstate = tstate;
|
||||
}
|
||||
cached_context = (PyDecContextObject *)tl_context;
|
||||
cached_context->tstate = tstate;
|
||||
|
||||
/* Borrowed reference with refcount==1 */
|
||||
return tl_context;
|
||||
|
@ -1562,9 +1562,7 @@ current_context_from_dict(void)
|
|||
static PyObject *
|
||||
current_context(void)
|
||||
{
|
||||
PyThreadState *tstate;
|
||||
|
||||
tstate = PyThreadState_GET();
|
||||
PyThreadState *tstate = _PyThreadState_GET();
|
||||
if (cached_context && cached_context->tstate == tstate) {
|
||||
return (PyObject *)cached_context;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue