mirror of
https://github.com/python/cpython.git
synced 2025-07-19 09:15:34 +00:00
gh-81057: Move More Globals in Core Code to _PyRuntimeState (gh-99516)
https://github.com/python/cpython/issues/81057
This commit is contained in:
parent
5cfb7d19f5
commit
5f55067e23
24 changed files with 241 additions and 130 deletions
|
@ -1,6 +1,7 @@
|
|||
#include "Python.h"
|
||||
#include "pycore_initconfig.h"
|
||||
#include "pycore_fileutils.h" // _Py_fstat_noraise()
|
||||
#include "pycore_runtime.h" // _PyRuntime
|
||||
|
||||
#ifdef MS_WINDOWS
|
||||
# include <windows.h>
|
||||
|
@ -263,11 +264,7 @@ py_getentropy(char *buffer, Py_ssize_t size, int raise)
|
|||
#endif /* defined(HAVE_GETENTROPY) && !(defined(__sun) && defined(__SVR4)) */
|
||||
|
||||
|
||||
static struct {
|
||||
int fd;
|
||||
dev_t st_dev;
|
||||
ino_t st_ino;
|
||||
} urandom_cache = { -1 };
|
||||
#define urandom_cache (_PyRuntime.pyhash_state.urandom_cache)
|
||||
|
||||
/* Read random bytes from the /dev/urandom device:
|
||||
|
||||
|
@ -402,6 +399,9 @@ dev_urandom_close(void)
|
|||
urandom_cache.fd = -1;
|
||||
}
|
||||
}
|
||||
|
||||
#undef urandom_cache
|
||||
|
||||
#endif /* !MS_WINDOWS */
|
||||
|
||||
|
||||
|
|
|
@ -819,11 +819,10 @@ make_pending_calls(PyInterpreterState *interp)
|
|||
}
|
||||
|
||||
/* don't perform recursive pending calls */
|
||||
static int busy = 0;
|
||||
if (busy) {
|
||||
if (interp->ceval.pending.busy) {
|
||||
return 0;
|
||||
}
|
||||
busy = 1;
|
||||
interp->ceval.pending.busy = 1;
|
||||
|
||||
/* unsignal before starting to call callbacks, so that any callback
|
||||
added in-between re-signals */
|
||||
|
@ -851,11 +850,11 @@ make_pending_calls(PyInterpreterState *interp)
|
|||
}
|
||||
}
|
||||
|
||||
busy = 0;
|
||||
interp->ceval.pending.busy = 0;
|
||||
return res;
|
||||
|
||||
error:
|
||||
busy = 0;
|
||||
interp->ceval.pending.busy = 0;
|
||||
SIGNAL_PENDING_CALLS(interp);
|
||||
return res;
|
||||
}
|
||||
|
|
|
@ -191,7 +191,7 @@ extern int _Py_normalize_encoding(const char *, char *, size_t);
|
|||
Py_DecodeLocale() uses mbstowcs()
|
||||
-1: unknown, need to call check_force_ascii() to get the value
|
||||
*/
|
||||
static int force_ascii = -1;
|
||||
#define force_ascii (_PyRuntime.fileutils.force_ascii)
|
||||
|
||||
static int
|
||||
check_force_ascii(void)
|
||||
|
|
|
@ -160,6 +160,7 @@ _PyImport_LoadDynamicModuleWithSpec(PyObject *spec, FILE *fp)
|
|||
p0 = (PyModInitFunction)exportfunc;
|
||||
|
||||
/* Package context is needed for single-phase init */
|
||||
#define _Py_PackageContext (_PyRuntime.imports.pkgcontext)
|
||||
oldcontext = _Py_PackageContext;
|
||||
_Py_PackageContext = PyUnicode_AsUTF8(name_unicode);
|
||||
if (_Py_PackageContext == NULL) {
|
||||
|
@ -168,6 +169,7 @@ _PyImport_LoadDynamicModuleWithSpec(PyObject *spec, FILE *fp)
|
|||
}
|
||||
m = _PyImport_InitFunc_TrampolineCall(p0);
|
||||
_Py_PackageContext = oldcontext;
|
||||
#undef _Py_PackageContext
|
||||
|
||||
if (m == NULL) {
|
||||
if (!PyErr_Occurred()) {
|
||||
|
|
|
@ -10,9 +10,6 @@ typedef double va_double;
|
|||
static PyObject *va_build_value(const char *, va_list, int);
|
||||
static PyObject **va_build_stack(PyObject **small_stack, Py_ssize_t small_stack_len, const char *, va_list, int, Py_ssize_t*);
|
||||
|
||||
/* Package context -- the full module name for package imports */
|
||||
const char *_Py_PackageContext = NULL;
|
||||
|
||||
|
||||
int
|
||||
_Py_convert_optional_to_ssize_t(PyObject *obj, void *result)
|
||||
|
|
|
@ -77,8 +77,6 @@ static PyStatus init_sys_streams(PyThreadState *tstate);
|
|||
static void wait_for_thread_shutdown(PyThreadState *tstate);
|
||||
static void call_ll_exitfuncs(_PyRuntimeState *runtime);
|
||||
|
||||
int _Py_UnhandledKeyboardInterrupt = 0;
|
||||
|
||||
/* The following places the `_PyRuntime` structure in a location that can be
|
||||
* found without any external information. This is meant to ease access to the
|
||||
* interpreter state for various runtime debugging tools, but is *not* an
|
||||
|
|
|
@ -137,8 +137,8 @@ init_runtime(_PyRuntimeState *runtime,
|
|||
// Set it to the ID of the main thread of the main interpreter.
|
||||
runtime->main_thread = PyThread_get_thread_ident();
|
||||
|
||||
runtime->unicode_ids.next_index = unicode_next_index;
|
||||
runtime->unicode_ids.lock = unicode_ids_mutex;
|
||||
runtime->unicode_state.ids.next_index = unicode_next_index;
|
||||
runtime->unicode_state.ids.lock = unicode_ids_mutex;
|
||||
|
||||
runtime->_initialized = 1;
|
||||
}
|
||||
|
@ -154,7 +154,7 @@ _PyRuntimeState_Init(_PyRuntimeState *runtime)
|
|||
_Py_AuditHookEntry *audit_hook_head = runtime->audit_hook_head;
|
||||
// bpo-42882: Preserve next_index value if Py_Initialize()/Py_Finalize()
|
||||
// is called multiple times.
|
||||
Py_ssize_t unicode_next_index = runtime->unicode_ids.next_index;
|
||||
Py_ssize_t unicode_next_index = runtime->unicode_state.ids.next_index;
|
||||
|
||||
PyThread_type_lock lock1, lock2, lock3, lock4;
|
||||
if (alloc_for_runtime(&lock1, &lock2, &lock3, &lock4) != 0) {
|
||||
|
@ -186,7 +186,7 @@ _PyRuntimeState_Fini(_PyRuntimeState *runtime)
|
|||
|
||||
FREE_LOCK(runtime->interpreters.mutex);
|
||||
FREE_LOCK(runtime->xidregistry.mutex);
|
||||
FREE_LOCK(runtime->unicode_ids.lock);
|
||||
FREE_LOCK(runtime->unicode_state.ids.lock);
|
||||
FREE_LOCK(runtime->getargs.mutex);
|
||||
|
||||
#undef FREE_LOCK
|
||||
|
@ -209,7 +209,7 @@ _PyRuntimeState_ReInitThreads(_PyRuntimeState *runtime)
|
|||
|
||||
int reinit_interp = _PyThread_at_fork_reinit(&runtime->interpreters.mutex);
|
||||
int reinit_xidregistry = _PyThread_at_fork_reinit(&runtime->xidregistry.mutex);
|
||||
int reinit_unicode_ids = _PyThread_at_fork_reinit(&runtime->unicode_ids.lock);
|
||||
int reinit_unicode_ids = _PyThread_at_fork_reinit(&runtime->unicode_state.ids.lock);
|
||||
int reinit_getargs = _PyThread_at_fork_reinit(&runtime->getargs.mutex);
|
||||
|
||||
PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
|
||||
|
|
|
@ -1688,7 +1688,8 @@ run_eval_code_obj(PyThreadState *tstate, PyCodeObject *co, PyObject *globals, Py
|
|||
* uncaught exception to trigger an unexplained signal exit from a future
|
||||
* Py_Main() based one.
|
||||
*/
|
||||
_Py_UnhandledKeyboardInterrupt = 0;
|
||||
// XXX Isn't this dealt with by the move to _PyRuntimeState?
|
||||
_PyRuntime.signals.unhandled_keyboard_interrupt = 0;
|
||||
|
||||
/* Set globals['__builtins__'] if it doesn't exist */
|
||||
if (globals != NULL && _PyDict_GetItemStringWithError(globals, "__builtins__") == NULL) {
|
||||
|
@ -1702,7 +1703,7 @@ run_eval_code_obj(PyThreadState *tstate, PyCodeObject *co, PyObject *globals, Py
|
|||
|
||||
v = PyEval_EvalCode((PyObject*)co, globals, locals);
|
||||
if (!v && _PyErr_Occurred(tstate) == PyExc_KeyboardInterrupt) {
|
||||
_Py_UnhandledKeyboardInterrupt = 1;
|
||||
_PyRuntime.signals.unhandled_keyboard_interrupt = 1;
|
||||
}
|
||||
return v;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue