summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Snow <ericsnowcurrently@gmail.com>2022-01-14 00:17:28 (GMT)
committerGitHub <noreply@github.com>2022-01-14 00:17:28 (GMT)
commit322f962f3ee31d0dbde99e36379de8488ccc6804 (patch)
tree5ff4958e37f0f556294804c2918bdfeb9ea87417
parent324908ba936d5d262026deebb81f050803848c41 (diff)
downloadcpython-322f962f3ee31d0dbde99e36379de8488ccc6804.zip
cpython-322f962f3ee31d0dbde99e36379de8488ccc6804.tar.gz
cpython-322f962f3ee31d0dbde99e36379de8488ccc6804.tar.bz2
bpo-45953: Statically initialize all the non-object PyInterpreterState fields we can. (gh-30589)
https://bugs.python.org/issue45953
-rw-r--r--Include/internal/pycore_gc.h2
-rw-r--r--Include/internal/pycore_runtime_init.h27
-rw-r--r--Modules/gcmodule.c26
-rw-r--r--Python/ceval.c2
-rw-r--r--Python/pystate.c9
5 files changed, 40 insertions, 26 deletions
diff --git a/Include/internal/pycore_gc.h b/Include/internal/pycore_gc.h
index a23dca8..56a23e9 100644
--- a/Include/internal/pycore_gc.h
+++ b/Include/internal/pycore_gc.h
@@ -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);
diff --git a/Include/internal/pycore_runtime_init.h b/Include/internal/pycore_runtime_init.h
index aa66120..72ca346 100644
--- a/Include/internal/pycore_runtime_init.h
+++ b/Include/internal/pycore_runtime_init.h
@@ -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, \
}
diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c
index e22f031..16f8c2b 100644
--- a/Modules/gcmodule.c
+++ b/Modules/gcmodule.c
@@ -139,24 +139,20 @@ get_gc_state(void)
void
_PyGC_InitState(GCState *gcstate)
{
- gcstate->enabled = 1; /* automatic collection enabled? */
-
-#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},
- };
+#define INIT_HEAD(GEN) \
+ do { \
+ GEN.head._gc_next = (uintptr_t)&GEN.head; \
+ GEN.head._gc_prev = (uintptr_t)&GEN.head; \
+ } while (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
}
diff --git a/Python/ceval.c b/Python/ceval.c
index eed902f..70a7750 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -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);
diff --git a/Python/pystate.c b/Python/pystate.c
index 2315685..4b698f2 100644
--- a/Python/pystate.c
+++ b/Python/pystate.c
@@ -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;
}