bpo-39947: Use _PyInterpreterState_GET_UNSAFE() (GH-18978)
Replace _PyInterpreterState_Get() function call with
_PyInterpreterState_GET_UNSAFE() macro which is more efficient but
don't check if tstate or interp is NULL.
_Py_GetConfigsAsDict() now uses _PyThreadState_GET().
diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c
index ee70183..19dd704 100644
--- a/Modules/_threadmodule.c
+++ b/Modules/_threadmodule.c
@@ -1061,7 +1061,7 @@
boot = PyMem_NEW(struct bootstate, 1);
if (boot == NULL)
return PyErr_NoMemory();
- boot->interp = _PyInterpreterState_Get();
+ boot->interp = _PyInterpreterState_GET_UNSAFE();
boot->func = func;
boot->args = args;
boot->keyw = keyw;
@@ -1183,7 +1183,7 @@
static PyObject *
thread__count(PyObject *self, PyObject *Py_UNUSED(ignored))
{
- PyInterpreterState *interp = _PyInterpreterState_Get();
+ PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
return PyLong_FromLong(interp->num_threads);
}
@@ -1542,7 +1542,7 @@
PyObject *m, *d, *v;
double time_max;
double timeout_max;
- PyInterpreterState *interp = _PyInterpreterState_Get();
+ PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
/* Initialize types: */
if (PyType_Ready(&localdummytype) < 0)
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index 29aeca4..dc76bb2 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -451,7 +451,7 @@
void
PyOS_BeforeFork(void)
{
- run_at_forkers(_PyInterpreterState_Get()->before_forkers, 1);
+ run_at_forkers(_PyInterpreterState_GET_UNSAFE()->before_forkers, 1);
_PyImport_AcquireLock();
}
@@ -462,7 +462,7 @@
if (_PyImport_ReleaseLock() <= 0)
Py_FatalError("failed releasing import lock after fork");
- run_at_forkers(_PyInterpreterState_Get()->after_forkers_parent, 0);
+ run_at_forkers(_PyInterpreterState_GET_UNSAFE()->after_forkers_parent, 0);
}
void
@@ -476,7 +476,7 @@
_PyRuntimeState_ReInitThreads(runtime);
_PyInterpreterState_DeleteExceptMain(runtime);
- run_at_forkers(_PyInterpreterState_Get()->after_forkers_child, 0);
+ run_at_forkers(_PyInterpreterState_GET_UNSAFE()->after_forkers_child, 0);
}
static int
@@ -6177,7 +6177,7 @@
check_null_or_callable(after_in_parent, "after_in_parent")) {
return NULL;
}
- interp = _PyInterpreterState_Get();
+ interp = _PyInterpreterState_GET_UNSAFE();
if (register_at_forker(&interp->before_forkers, before)) {
return NULL;
@@ -6208,7 +6208,7 @@
{
pid_t pid;
- if (_PyInterpreterState_Get() != PyInterpreterState_Main()) {
+ if (_PyInterpreterState_GET_UNSAFE() != PyInterpreterState_Main()) {
PyErr_SetString(PyExc_RuntimeError, "fork not supported for subinterpreters");
return NULL;
}
@@ -6243,7 +6243,7 @@
{
pid_t pid;
- if (_PyInterpreterState_Get() != PyInterpreterState_Main()) {
+ if (_PyInterpreterState_GET_UNSAFE() != PyInterpreterState_Main()) {
PyErr_SetString(PyExc_RuntimeError, "fork not supported for subinterpreters");
return NULL;
}
@@ -6851,7 +6851,7 @@
int master_fd = -1;
pid_t pid;
- if (_PyInterpreterState_Get() != PyInterpreterState_Main()) {
+ if (_PyInterpreterState_GET_UNSAFE() != PyInterpreterState_Main()) {
PyErr_SetString(PyExc_RuntimeError, "fork not supported for subinterpreters");
return NULL;
}
diff --git a/Objects/moduleobject.c b/Objects/moduleobject.c
index 30de53d..c581951 100644
--- a/Objects/moduleobject.c
+++ b/Objects/moduleobject.c
@@ -174,7 +174,7 @@
PyObject *
PyModule_Create2(struct PyModuleDef* module, int module_api_version)
{
- if (!_PyImport_IsInitialized(_PyInterpreterState_Get())) {
+ if (!_PyImport_IsInitialized(_PyInterpreterState_GET_UNSAFE())) {
PyErr_SetString(PyExc_SystemError,
"Python import machinery not initialized");
return NULL;
@@ -699,7 +699,7 @@
static PyObject *
module_repr(PyModuleObject *m)
{
- PyInterpreterState *interp = _PyInterpreterState_Get();
+ PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
return PyObject_CallMethod(interp->importlib, "_module_repr", "O", m);
}
diff --git a/Python/codecs.c b/Python/codecs.c
index e5bcdb0..bbbf774 100644
--- a/Python/codecs.c
+++ b/Python/codecs.c
@@ -32,7 +32,7 @@
int PyCodec_Register(PyObject *search_function)
{
- PyInterpreterState *interp = _PyInterpreterState_Get();
+ PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
if (interp->codec_search_path == NULL && _PyCodecRegistry_Init())
goto onError;
if (search_function == NULL) {
@@ -187,7 +187,7 @@
PyObject *v;
int result;
- PyInterpreterState *interp = _PyInterpreterState_Get();
+ PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
if (interp->codec_search_path == NULL) {
return -1;
}
@@ -620,7 +620,7 @@
Return 0 on success, -1 on error */
int PyCodec_RegisterError(const char *name, PyObject *error)
{
- PyInterpreterState *interp = _PyInterpreterState_Get();
+ PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
if (interp->codec_search_path == NULL && _PyCodecRegistry_Init())
return -1;
if (!PyCallable_Check(error)) {
@@ -1492,7 +1492,7 @@
}
};
- PyInterpreterState *interp = _PyInterpreterState_Get();
+ PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
PyObject *mod;
if (interp->codec_search_path != NULL)
diff --git a/Python/dynload_shlib.c b/Python/dynload_shlib.c
index c51f97a..3603871 100644
--- a/Python/dynload_shlib.c
+++ b/Python/dynload_shlib.c
@@ -2,7 +2,7 @@
/* Support for dynamic loading of extension modules */
#include "Python.h"
-#include "pycore_pystate.h"
+#include "pycore_pystate.h" // _PyInterpreterState_GET_UNSAFE()
#include "importdl.h"
#include <sys/types.h>
@@ -94,7 +94,7 @@
}
}
- dlopenflags = _PyInterpreterState_Get()->dlopenflags;
+ dlopenflags = _PyInterpreterState_GET_UNSAFE()->dlopenflags;
handle = dlopen(pathname, dlopenflags);
diff --git a/Python/import.c b/Python/import.c
index c4a19bc..936ad1f 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -642,7 +642,7 @@
PyImport_GetMagicNumber(void)
{
long res;
- PyInterpreterState *interp = _PyInterpreterState_Get();
+ PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
PyObject *external, *pyc_magic;
external = PyObject_GetAttrString(interp->importlib, "_bootstrap_external");
@@ -2412,7 +2412,7 @@
goto failure;
}
- const wchar_t *mode = _PyInterpreterState_Get()->config.check_hash_pycs_mode;
+ const wchar_t *mode = _PyInterpreterState_GET_UNSAFE()->config.check_hash_pycs_mode;
PyObject *pyc_mode = PyUnicode_FromWideChar(mode, -1);
if (pyc_mode == NULL) {
goto failure;
diff --git a/Python/initconfig.c b/Python/initconfig.c
index 22232ad..19070d2 100644
--- a/Python/initconfig.c
+++ b/Python/initconfig.c
@@ -2572,8 +2572,8 @@
Py_CLEAR(dict);
/* pre config */
- PyInterpreterState *interp = _PyInterpreterState_Get();
- const PyPreConfig *pre_config = &_PyRuntime.preconfig;
+ PyThreadState *tstate = _PyThreadState_GET();
+ const PyPreConfig *pre_config = &tstate->interp->runtime->preconfig;
dict = _PyPreConfig_AsDict(pre_config);
if (dict == NULL) {
goto error;
@@ -2584,7 +2584,7 @@
Py_CLEAR(dict);
/* core config */
- const PyConfig *config = &interp->config;
+ const PyConfig *config = &tstate->interp->config;
dict = config_as_dict(config);
if (dict == NULL) {
goto error;
diff --git a/Python/pythonrun.c b/Python/pythonrun.c
index f4ded2e..76bc48d 100644
--- a/Python/pythonrun.c
+++ b/Python/pythonrun.c
@@ -95,7 +95,7 @@
PyCompilerFlags local_flags = _PyCompilerFlags_INIT;
int nomem_count = 0;
#ifdef Py_REF_DEBUG
- int show_ref_count = _PyInterpreterState_Get()->config.show_ref_count;
+ int show_ref_count = _PyInterpreterState_GET_UNSAFE()->config.show_ref_count;
#endif
filename = PyUnicode_DecodeFSDefault(filename_str);
@@ -346,7 +346,7 @@
filename_obj = PyUnicode_DecodeFSDefault(filename);
if (filename_obj == NULL)
return -1;
- PyInterpreterState *interp = _PyInterpreterState_Get();
+ PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
bootstrap = PyObject_GetAttrString(interp->importlib,
"_bootstrap_external");
if (bootstrap != NULL) {
@@ -1117,7 +1117,7 @@
/* Set globals['__builtins__'] if it doesn't exist */
if (globals != NULL && PyDict_GetItemString(globals, "__builtins__") == NULL) {
- PyInterpreterState *interp = _PyInterpreterState_Get();
+ PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
if (PyDict_SetItemString(globals, "__builtins__", interp->builtins) < 0) {
return NULL;
}
diff --git a/Python/thread.c b/Python/thread.c
index c36ce6f..ec6909c 100644
--- a/Python/thread.c
+++ b/Python/thread.c
@@ -92,7 +92,7 @@
size_t
PyThread_get_stacksize(void)
{
- return _PyInterpreterState_Get()->pythread_stacksize;
+ return _PyInterpreterState_GET_UNSAFE()->pythread_stacksize;
}
/* Only platforms defining a THREAD_SET_STACKSIZE() macro