mirror of https://github.com/python/cpython
bpo-45953: Statically initialize all the non-object PyInterpreterState fields we can. (gh-30589)
https://bugs.python.org/issue45953
This commit is contained in:
parent
324908ba93
commit
322f962f3e
|
@ -134,6 +134,7 @@ struct _gc_runtime_state {
|
|||
/* Current call-stack depth of tp_dealloc calls. */
|
||||
int trash_delete_nesting;
|
||||
|
||||
/* Is automatic collection enabled? */
|
||||
int enabled;
|
||||
int debug;
|
||||
/* linked lists of container objects */
|
||||
|
@ -161,6 +162,7 @@ struct _gc_runtime_state {
|
|||
Py_ssize_t long_lived_pending;
|
||||
};
|
||||
|
||||
|
||||
extern void _PyGC_InitState(struct _gc_runtime_state *);
|
||||
|
||||
extern Py_ssize_t _PyGC_CollectNoFail(PyThreadState *tstate);
|
||||
|
|
|
@ -32,9 +32,36 @@ extern "C" {
|
|||
._main_interpreter = _PyInterpreterState_INIT, \
|
||||
}
|
||||
|
||||
#ifdef HAVE_DLOPEN
|
||||
# include <dlfcn.h>
|
||||
# if HAVE_DECL_RTLD_NOW
|
||||
# define _Py_DLOPEN_FLAGS RTLD_NOW
|
||||
# else
|
||||
# define _Py_DLOPEN_FLAGS RTLD_LAZY
|
||||
# endif
|
||||
# define DLOPENFLAGS_INIT .dlopenflags = _Py_DLOPEN_FLAGS,
|
||||
#else
|
||||
# define _Py_DLOPEN_FLAGS 0
|
||||
# define DLOPENFLAGS_INIT
|
||||
#endif
|
||||
|
||||
#define _PyInterpreterState_INIT \
|
||||
{ \
|
||||
._static = 1, \
|
||||
.id_refcount = -1, \
|
||||
DLOPENFLAGS_INIT \
|
||||
.ceval = { \
|
||||
.recursion_limit = Py_DEFAULT_RECURSION_LIMIT, \
|
||||
}, \
|
||||
.gc = { \
|
||||
.enabled = 1, \
|
||||
.generations = { \
|
||||
/* .head is set in _PyGC_InitState(). */ \
|
||||
{ .threshold = 700, }, \
|
||||
{ .threshold = 10, }, \
|
||||
{ .threshold = 10, }, \
|
||||
}, \
|
||||
}, \
|
||||
._initial_thread = _PyThreadState_INIT, \
|
||||
}
|
||||
|
||||
|
|
|
@ -139,24 +139,20 @@ get_gc_state(void)
|
|||
void
|
||||
_PyGC_InitState(GCState *gcstate)
|
||||
{
|
||||
gcstate->enabled = 1; /* automatic collection enabled? */
|
||||
#define INIT_HEAD(GEN) \
|
||||
do { \
|
||||
GEN.head._gc_next = (uintptr_t)&GEN.head; \
|
||||
GEN.head._gc_prev = (uintptr_t)&GEN.head; \
|
||||
} while (0)
|
||||
|
||||
#define _GEN_HEAD(n) GEN_HEAD(gcstate, n)
|
||||
struct gc_generation generations[NUM_GENERATIONS] = {
|
||||
/* PyGC_Head, threshold, count */
|
||||
{{(uintptr_t)_GEN_HEAD(0), (uintptr_t)_GEN_HEAD(0)}, 700, 0},
|
||||
{{(uintptr_t)_GEN_HEAD(1), (uintptr_t)_GEN_HEAD(1)}, 10, 0},
|
||||
{{(uintptr_t)_GEN_HEAD(2), (uintptr_t)_GEN_HEAD(2)}, 10, 0},
|
||||
};
|
||||
for (int i = 0; i < NUM_GENERATIONS; i++) {
|
||||
gcstate->generations[i] = generations[i];
|
||||
assert(gcstate->generations[i].count == 0);
|
||||
INIT_HEAD(gcstate->generations[i]);
|
||||
};
|
||||
gcstate->generation0 = GEN_HEAD(gcstate, 0);
|
||||
struct gc_generation permanent_generation = {
|
||||
{(uintptr_t)&gcstate->permanent_generation.head,
|
||||
(uintptr_t)&gcstate->permanent_generation.head}, 0, 0
|
||||
};
|
||||
gcstate->permanent_generation = permanent_generation;
|
||||
INIT_HEAD(gcstate->permanent_generation);
|
||||
|
||||
#undef INIT_HEAD
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -748,8 +748,6 @@ _PyEval_InitRuntimeState(struct _ceval_runtime_state *ceval)
|
|||
void
|
||||
_PyEval_InitState(struct _ceval_state *ceval, PyThread_type_lock pending_lock)
|
||||
{
|
||||
ceval->recursion_limit = Py_DEFAULT_RECURSION_LIMIT;
|
||||
|
||||
struct _pending_calls *pending = &ceval->pending;
|
||||
assert(pending->lock == NULL);
|
||||
|
||||
|
|
|
@ -281,7 +281,6 @@ init_interpreter(PyInterpreterState *interp,
|
|||
|
||||
assert(id > 0 || (id == 0 && interp == runtime->interpreters.main));
|
||||
interp->id = id;
|
||||
interp->id_refcount = -1;
|
||||
|
||||
assert(runtime->interpreters.head == interp);
|
||||
assert(next != NULL || (interp == runtime->interpreters.main));
|
||||
|
@ -291,14 +290,6 @@ init_interpreter(PyInterpreterState *interp,
|
|||
_PyGC_InitState(&interp->gc);
|
||||
PyConfig_InitPythonConfig(&interp->config);
|
||||
_PyType_InitCache(interp);
|
||||
interp->eval_frame = NULL;
|
||||
#ifdef HAVE_DLOPEN
|
||||
#if HAVE_DECL_RTLD_NOW
|
||||
interp->dlopenflags = RTLD_NOW;
|
||||
#else
|
||||
interp->dlopenflags = RTLD_LAZY;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
interp->_initialized = 1;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue