From 0bab76a80fd27486940d5c0c9e7414ffd6597c65 Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Tue, 24 May 2022 14:27:59 -0600 Subject: [PATCH 1/5] Drop the EXPERIMENTAL_ISOLATED_SUBINTERPRETERS macro. --- Include/internal/pycore_ceval.h | 4 --- Include/internal/pycore_interp.h | 3 -- Include/internal/pycore_pystate.h | 12 ------- Include/internal/pycore_runtime.h | 2 -- Modules/_xxsubinterpretersmodule.c | 15 -------- Modules/gcmodule.c | 8 ----- Objects/typeobject.c | 25 ++------------ Objects/unicodeobject.c | 17 --------- Python/ceval.c | 55 ------------------------------ Python/ceval_gil.h | 18 ---------- Python/preconfig.c | 10 ------ Python/pylifecycle.c | 2 -- Python/pystate.c | 17 --------- 13 files changed, 3 insertions(+), 185 deletions(-) diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h index 3efd6beb035a1a..d969a5e6eb99bb 100644 --- a/Include/internal/pycore_ceval.h +++ b/Include/internal/pycore_ceval.h @@ -80,11 +80,7 @@ _PyEval_Vector(PyThreadState *tstate, PyObject* const* args, size_t argcount, PyObject *kwnames); -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS -extern int _PyEval_ThreadsInitialized(PyInterpreterState *interp); -#else extern int _PyEval_ThreadsInitialized(struct pyruntimestate *runtime); -#endif extern PyStatus _PyEval_InitGIL(PyThreadState *tstate); extern void _PyEval_FiniGIL(PyInterpreterState *interp); diff --git a/Include/internal/pycore_interp.h b/Include/internal/pycore_interp.h index d55627908a28f8..bcfcd88d84492d 100644 --- a/Include/internal/pycore_interp.h +++ b/Include/internal/pycore_interp.h @@ -51,9 +51,6 @@ struct _ceval_state { /* Request for dropping the GIL */ _Py_atomic_int gil_drop_request; struct _pending_calls pending; -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - struct _gil_runtime_state gil; -#endif }; diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index c4bc53c707fdaf..e2d7c5bee28b92 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -64,18 +64,10 @@ _Py_ThreadCanHandlePendingCalls(void) /* Variable and macro for in-line access to current thread and interpreter state */ -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS -PyAPI_FUNC(PyThreadState*) _PyThreadState_GetTSS(void); -#endif - static inline PyThreadState* _PyRuntimeState_GetThreadState(_PyRuntimeState *runtime) { -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - return _PyThreadState_GetTSS(); -#else return (PyThreadState*)_Py_atomic_load_relaxed(&runtime->gilstate.tstate_current); -#endif } /* Get the current Python thread state. @@ -90,11 +82,7 @@ _PyRuntimeState_GetThreadState(_PyRuntimeState *runtime) static inline PyThreadState* _PyThreadState_GET(void) { -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - return _PyThreadState_GetTSS(); -#else return _PyRuntimeState_GetThreadState(&_PyRuntime); -#endif } PyAPI_FUNC(void) _Py_NO_RETURN _Py_FatalError_TstateNULL(const char *func); diff --git a/Include/internal/pycore_runtime.h b/Include/internal/pycore_runtime.h index 18191c3771dfcc..ae63ae74afa5fe 100644 --- a/Include/internal/pycore_runtime.h +++ b/Include/internal/pycore_runtime.h @@ -23,9 +23,7 @@ struct _ceval_runtime_state { the main thread of the main interpreter can handle signals: see _Py_ThreadCanHandleSignals(). */ _Py_atomic_int signals_pending; -#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS struct _gil_runtime_state gil; -#endif }; /* GIL state */ diff --git a/Modules/_xxsubinterpretersmodule.c b/Modules/_xxsubinterpretersmodule.c index 9b1f186c5b6c7c..d1df00111cf541 100644 --- a/Modules/_xxsubinterpretersmodule.c +++ b/Modules/_xxsubinterpretersmodule.c @@ -1932,20 +1932,6 @@ _run_script_in_interpreter(PyInterpreterState *interp, const char *codestr, return -1; } -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - // Switch to interpreter. - PyThreadState *new_tstate = PyInterpreterState_ThreadHead(interp); - PyThreadState *save1 = PyEval_SaveThread(); - - (void)PyThreadState_Swap(new_tstate); - - // Run the script. - _sharedexception *exc = NULL; - int result = _run_script(interp, codestr, shared, &exc); - - // Switch back. - PyEval_RestoreThread(save1); -#else // Switch to interpreter. PyThreadState *save_tstate = NULL; if (interp != PyInterpreterState_Get()) { @@ -1963,7 +1949,6 @@ _run_script_in_interpreter(PyInterpreterState *interp, const char *codestr, if (save_tstate != NULL) { PyThreadState_Swap(save_tstate); } -#endif // Propagate any exception out to the caller. if (exc != NULL) { diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index 45dad8f0824df8..3bda6e4bb8c021 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -1195,14 +1195,6 @@ gc_collect_main(PyThreadState *tstate, int generation, assert(gcstate->garbage != NULL); assert(!_PyErr_Occurred(tstate)); -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - if (tstate->interp->config._isolated_interpreter) { - // bpo-40533: The garbage collector must not be run on parallel on - // Python objects shared by multiple interpreters. - return 0; - } -#endif - if (gcstate->debug & DEBUG_STATS) { PySys_WriteStderr("gc: collecting generation %d...\n", generation); show_stats_each_generations(gcstate); diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 1daf2b8d3b0ff8..c896f390026733 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -54,11 +54,6 @@ typedef struct PySlot_Offset { } PySlot_Offset; -/* bpo-40521: Interned strings are shared by all subinterpreters */ -#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS -# define INTERN_NAME_STRINGS -#endif - static PyObject * slot_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds); @@ -4009,7 +4004,7 @@ type_setattro(PyTypeObject *type, PyObject *name, PyObject *value) if (name == NULL) return -1; } -#ifdef INTERN_NAME_STRINGS + /* bpo-40521: Interned strings are shared by all subinterpreters */ if (!PyUnicode_CHECK_INTERNED(name)) { PyUnicode_InternInPlace(&name); if (!PyUnicode_CHECK_INTERNED(name)) { @@ -4019,7 +4014,6 @@ type_setattro(PyTypeObject *type, PyObject *name, PyObject *value) return -1; } } -#endif } else { /* Will fail in _PyObject_GenericSetAttrWithDict. */ @@ -8456,17 +8450,11 @@ _PyTypes_InitSlotDefs(void) for (slotdef *p = slotdefs; p->name; p++) { /* Slots must be ordered by their offset in the PyHeapTypeObject. */ assert(!p[1].name || p->offset <= p[1].offset); -#ifdef INTERN_NAME_STRINGS + /* bpo-40521: Interned strings are shared by all subinterpreters */ p->name_strobj = PyUnicode_InternFromString(p->name); if (!p->name_strobj || !PyUnicode_CHECK_INTERNED(p->name_strobj)) { return _PyStatus_NO_MEMORY(); } -#else - p->name_strobj = PyUnicode_FromString(p->name); - if (!p->name_strobj) { - return _PyStatus_NO_MEMORY(); - } -#endif } slotdefs_initialized = 1; return _PyStatus_OK(); @@ -8491,24 +8479,17 @@ update_slot(PyTypeObject *type, PyObject *name) int offset; assert(PyUnicode_CheckExact(name)); -#ifdef INTERN_NAME_STRINGS assert(PyUnicode_CHECK_INTERNED(name)); -#endif assert(slotdefs_initialized); pp = ptrs; for (p = slotdefs; p->name; p++) { assert(PyUnicode_CheckExact(p->name_strobj)); assert(PyUnicode_CheckExact(name)); -#ifdef INTERN_NAME_STRINGS + /* bpo-40521: Using interned strings. */ if (p->name_strobj == name) { *pp++ = p; } -#else - if (p->name_strobj == name || _PyUnicode_EQ(p->name_strobj, name)) { - *pp++ = p; - } -#endif } *pp = NULL; for (pp = ptrs; *pp; pp++) { diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index e9358290724832..6099ab40ecf6b9 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -190,11 +190,6 @@ extern "C" { # define OVERALLOCATE_FACTOR 4 #endif -/* bpo-40521: Interned strings are shared by all interpreters. */ -#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS -# define INTERNED_STRINGS -#endif - /* This dictionary holds all interned unicode strings. Note that references to strings in this dictionary are *not* counted in the string's ob_refcnt. When the interned string reaches a refcnt of 0 the string deallocation @@ -203,9 +198,7 @@ extern "C" { Another way to look at this is that to say that the actual reference count of a string is: s->ob_refcnt + (s->state ? 2 : 0) */ -#ifdef INTERNED_STRINGS static PyObject *interned = NULL; -#endif /* Forward declaration */ static inline int @@ -1516,7 +1509,6 @@ unicode_dealloc(PyObject *unicode) } #endif -#ifdef INTERNED_STRINGS if (PyUnicode_CHECK_INTERNED(unicode)) { /* Revive the dead object temporarily. PyDict_DelItem() removes two references (key and value) which were ignored by @@ -1532,7 +1524,6 @@ unicode_dealloc(PyObject *unicode) assert(Py_REFCNT(unicode) == 1); Py_SET_REFCNT(unicode, 0); } -#endif if (_PyUnicode_HAS_UTF8_MEMORY(unicode)) { PyObject_Free(_PyUnicode_UTF8(unicode)); @@ -10558,13 +10549,11 @@ _PyUnicode_EqualToASCIIId(PyObject *left, _Py_Identifier *right) if (PyUnicode_CHECK_INTERNED(left)) return 0; -#ifdef INTERNED_STRINGS assert(_PyUnicode_HASH(right_uni) != -1); Py_hash_t hash = _PyUnicode_HASH(left); if (hash != -1 && hash != _PyUnicode_HASH(right_uni)) { return 0; } -#endif return unicode_compare_eq(left, right_uni); } @@ -14635,7 +14624,6 @@ PyUnicode_InternInPlace(PyObject **p) return; } -#ifdef INTERNED_STRINGS if (interned == NULL) { interned = PyDict_New(); if (interned == NULL) { @@ -14661,11 +14649,6 @@ PyUnicode_InternInPlace(PyObject **p) this. */ Py_SET_REFCNT(s, Py_REFCNT(s) - 2); _PyUnicode_STATE(s).interned = 1; -#else - // PyDict expects that interned strings have their hash - // (PyASCIIObject.hash) already computed. - (void)unicode_hash(s); -#endif } // Function kept for the stable ABI. diff --git a/Python/ceval.c b/Python/ceval.c index 230198b41f6a54..b78e024cce8321 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -353,21 +353,6 @@ _Py_FatalError_TstateNULL(const char *func) "(the current Python thread state is NULL)"); } -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS -int -_PyEval_ThreadsInitialized(PyInterpreterState *interp) -{ - return gil_created(&interp->ceval.gil); -} - -int -PyEval_ThreadsInitialized(void) -{ - // Fatal error if there is no current interpreter - PyInterpreterState *interp = PyInterpreterState_Get(); - return _PyEval_ThreadsInitialized(interp); -} -#else int _PyEval_ThreadsInitialized(_PyRuntimeState *runtime) { @@ -380,25 +365,18 @@ PyEval_ThreadsInitialized(void) _PyRuntimeState *runtime = &_PyRuntime; return _PyEval_ThreadsInitialized(runtime); } -#endif PyStatus _PyEval_InitGIL(PyThreadState *tstate) { -#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS if (!_Py_IsMainInterpreter(tstate->interp)) { /* Currently, the GIL is shared by all interpreters, and only the main interpreter is responsible to create and destroy it. */ return _PyStatus_OK(); } -#endif -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - struct _gil_runtime_state *gil = &tstate->interp->ceval.gil; -#else struct _gil_runtime_state *gil = &tstate->interp->runtime->ceval.gil; -#endif assert(!gil_created(gil)); PyThread_init_thread(); @@ -413,20 +391,14 @@ _PyEval_InitGIL(PyThreadState *tstate) void _PyEval_FiniGIL(PyInterpreterState *interp) { -#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS if (!_Py_IsMainInterpreter(interp)) { /* Currently, the GIL is shared by all interpreters, and only the main interpreter is responsible to create and destroy it. */ return; } -#endif -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - struct _gil_runtime_state *gil = &interp->ceval.gil; -#else struct _gil_runtime_state *gil = &interp->runtime->ceval.gil; -#endif if (!gil_created(gil)) { /* First Py_InitializeFromConfig() call: the GIL doesn't exist yet: do nothing. */ @@ -490,13 +462,9 @@ PyEval_AcquireThread(PyThreadState *tstate) take_gil(tstate); struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate; -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - (void)_PyThreadState_Swap(gilstate, tstate); -#else if (_PyThreadState_Swap(gilstate, tstate) != NULL) { Py_FatalError("non-NULL old thread state"); } -#endif } void @@ -523,11 +491,7 @@ _PyEval_ReInitThreads(PyThreadState *tstate) { _PyRuntimeState *runtime = tstate->interp->runtime; -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - struct _gil_runtime_state *gil = &tstate->interp->ceval.gil; -#else struct _gil_runtime_state *gil = &runtime->ceval.gil; -#endif if (!gil_created(gil)) { return _PyStatus_OK(); } @@ -559,21 +523,12 @@ PyThreadState * PyEval_SaveThread(void) { _PyRuntimeState *runtime = &_PyRuntime; -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - PyThreadState *old_tstate = _PyThreadState_GET(); - PyThreadState *tstate = _PyThreadState_Swap(&runtime->gilstate, old_tstate); -#else PyThreadState *tstate = _PyThreadState_Swap(&runtime->gilstate, NULL); -#endif _Py_EnsureTstateNotNULL(tstate); struct _ceval_runtime_state *ceval = &runtime->ceval; struct _ceval_state *ceval2 = &tstate->interp->ceval; -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - assert(gil_created(&ceval2->gil)); -#else assert(gil_created(&ceval->gil)); -#endif drop_gil(ceval, ceval2, tstate); return tstate; } @@ -837,9 +792,7 @@ Py_MakePendingCalls(void) void _PyEval_InitRuntimeState(struct _ceval_runtime_state *ceval) { -#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS _gil_initialize(&ceval->gil); -#endif } void @@ -849,10 +802,6 @@ _PyEval_InitState(struct _ceval_state *ceval, PyThread_type_lock pending_lock) assert(pending->lock == NULL); pending->lock = pending_lock; - -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - _gil_initialize(&ceval->gil); -#endif } void @@ -1267,13 +1216,9 @@ eval_frame_handle_pending(PyThreadState *tstate) take_gil(tstate); -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - (void)_PyThreadState_Swap(&runtime->gilstate, tstate); -#else if (_PyThreadState_Swap(&runtime->gilstate, tstate) != NULL) { Py_FatalError("orphan tstate"); } -#endif } /* Check for asynchronous exception. */ diff --git a/Python/ceval_gil.h b/Python/ceval_gil.h index 9b8b43253f04d2..1b2dc7f8e1dc31 100644 --- a/Python/ceval_gil.h +++ b/Python/ceval_gil.h @@ -144,11 +144,7 @@ static void drop_gil(struct _ceval_runtime_state *ceval, struct _ceval_state *ceval2, PyThreadState *tstate) { -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - struct _gil_runtime_state *gil = &ceval2->gil; -#else struct _gil_runtime_state *gil = &ceval->gil; -#endif if (!_Py_atomic_load_relaxed(&gil->locked)) { Py_FatalError("drop_gil: GIL is not locked"); } @@ -232,11 +228,7 @@ take_gil(PyThreadState *tstate) PyInterpreterState *interp = tstate->interp; struct _ceval_runtime_state *ceval = &interp->runtime->ceval; struct _ceval_state *ceval2 = &interp->ceval; -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - struct _gil_runtime_state *gil = &ceval2->gil; -#else struct _gil_runtime_state *gil = &ceval->gil; -#endif /* Check that _PyEval_InitThreads() was called to create the lock */ assert(gil_created(gil)); @@ -328,22 +320,12 @@ take_gil(PyThreadState *tstate) void _PyEval_SetSwitchInterval(unsigned long microseconds) { -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - PyInterpreterState *interp = PyInterpreterState_Get(); - struct _gil_runtime_state *gil = &interp->ceval.gil; -#else struct _gil_runtime_state *gil = &_PyRuntime.ceval.gil; -#endif gil->interval = microseconds; } unsigned long _PyEval_GetSwitchInterval() { -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - PyInterpreterState *interp = PyInterpreterState_Get(); - struct _gil_runtime_state *gil = &interp->ceval.gil; -#else struct _gil_runtime_state *gil = &_PyRuntime.ceval.gil; -#endif return gil->interval; } diff --git a/Python/preconfig.c b/Python/preconfig.c index afa16cccf32e96..0deb07a893ddf9 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -294,17 +294,7 @@ _PyPreConfig_InitCompatConfig(PyPreConfig *config) config->coerce_c_locale_warn = 0; config->dev_mode = -1; -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - /* bpo-40512: pymalloc is not compatible with subinterpreters, - force usage of libc malloc() which is thread-safe. */ -#ifdef Py_DEBUG - config->allocator = PYMEM_ALLOCATOR_MALLOC_DEBUG; -#else - config->allocator = PYMEM_ALLOCATOR_MALLOC; -#endif -#else config->allocator = PYMEM_ALLOCATOR_NOT_SET; -#endif #ifdef MS_WINDOWS config->legacy_windows_fs_encoding = -1; #endif diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 8644b5b68b6c57..2b002e61417657 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -1981,12 +1981,10 @@ new_interpreter(PyThreadState **tstate_p, int isolated_subinterpreter) /* Copy the current interpreter config into the new interpreter */ const PyConfig *config; -#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS if (save_tstate != NULL) { config = _PyInterpreterState_GetConfig(save_tstate->interp); } else -#endif { /* No current thread state, copy from the main interpreter */ PyInterpreterState *main_interp = _PyInterpreterState_Main(); diff --git a/Python/pystate.c b/Python/pystate.c index 3e28a6ab69a989..df56c0530f05b0 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -1165,14 +1165,6 @@ _PyThreadState_DeleteExcept(_PyRuntimeState *runtime, PyThreadState *tstate) } -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS -PyThreadState* -_PyThreadState_GetTSS(void) { - return PyThread_tss_get(&_PyRuntime.gilstate.autoTSSkey); -} -#endif - - PyThreadState * _PyThreadState_UncheckedGet(void) { @@ -1192,11 +1184,7 @@ PyThreadState_Get(void) PyThreadState * _PyThreadState_Swap(struct _gilstate_runtime_state *gilstate, PyThreadState *newts) { -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - PyThreadState *oldts = _PyThreadState_GetTSS(); -#else PyThreadState *oldts = _PyRuntimeGILState_GetThreadState(gilstate); -#endif _PyRuntimeGILState_SetThreadState(gilstate, newts); /* It should not be possible for more than one thread state @@ -1214,9 +1202,6 @@ _PyThreadState_Swap(struct _gilstate_runtime_state *gilstate, PyThreadState *new Py_FatalError("Invalid thread state for this thread"); errno = err; } -#endif -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - PyThread_tss_set(&gilstate->autoTSSkey, newts); #endif return oldts; } @@ -1665,9 +1650,7 @@ PyGILState_Ensure(void) /* Ensure that _PyEval_InitThreads() and _PyGILState_Init() have been called by Py_Initialize() */ -#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS assert(_PyEval_ThreadsInitialized(runtime)); -#endif assert(gilstate->autoInterpreterState); PyThreadState *tcur = (PyThreadState *)PyThread_tss_get(&gilstate->autoTSSkey); From 8a244ecd301664650a0f311616b8ad6d849e2c20 Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Tue, 24 May 2022 14:33:54 -0600 Subject: [PATCH 2/5] Drop configure --with-experimental-isolated-subinterpreters. --- configure | 27 --------------------------- configure.ac | 17 ----------------- pyconfig.h.in | 3 --- 3 files changed, 47 deletions(-) diff --git a/configure b/configure index 6fa4051310b124..2cfd870d68ec22 100755 --- a/configure +++ b/configure @@ -1061,7 +1061,6 @@ with_openssl with_openssl_rpath with_ssl_default_suites with_builtin_hashlib_hashes -with_experimental_isolated_subinterpreters enable_test_modules ' ac_precious_vars='build_alias @@ -1861,9 +1860,6 @@ Optional Packages: --with-builtin-hashlib-hashes=md5,sha1,sha256,sha512,sha3,blake2 builtin hash modules, md5, sha1, sha256, sha512, sha3 (with shake), blake2 - --with-experimental-isolated-subinterpreters - better isolate subinterpreters, experimental build - mode (default is no) Some influential environment variables: PKG_CONFIG path to pkg-config utility @@ -22475,29 +22471,6 @@ fi fi -# --with-experimental-isolated-subinterpreters - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-experimental-isolated-subinterpreters" >&5 -$as_echo_n "checking for --with-experimental-isolated-subinterpreters... " >&6; } - -# Check whether --with-experimental-isolated-subinterpreters was given. -if test "${with_experimental_isolated_subinterpreters+set}" = set; then : - withval=$with_experimental_isolated_subinterpreters; -if test "$withval" != no -then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; }; - $as_echo "#define EXPERIMENTAL_ISOLATED_SUBINTERPRETERS 1" >>confdefs.h - -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; }; -fi -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - # Check whether to disable test modules. Once set, setup.py will not build # test extension modules and "make install" will not install test suites. diff --git a/configure.ac b/configure.ac index bef4904325b521..b5cf0679a1b24a 100644 --- a/configure.ac +++ b/configure.ac @@ -6607,23 +6607,6 @@ AS_VAR_IF([with_builtin_blake2], [yes], [ ], [have_libb2=no]) ]) -# --with-experimental-isolated-subinterpreters -AH_TEMPLATE(EXPERIMENTAL_ISOLATED_SUBINTERPRETERS, - [Better isolate subinterpreters, experimental build mode.]) -AC_MSG_CHECKING(for --with-experimental-isolated-subinterpreters) -AC_ARG_WITH(experimental-isolated-subinterpreters, - AS_HELP_STRING([--with-experimental-isolated-subinterpreters], - [better isolate subinterpreters, experimental build mode (default is no)]), -[ -if test "$withval" != no -then - AC_MSG_RESULT(yes); - AC_DEFINE(EXPERIMENTAL_ISOLATED_SUBINTERPRETERS) -else - AC_MSG_RESULT(no); -fi], -[AC_MSG_RESULT(no)]) - # Check whether to disable test modules. Once set, setup.py will not build # test extension modules and "make install" will not install test suites. AC_MSG_CHECKING([for --disable-test-modules]) diff --git a/pyconfig.h.in b/pyconfig.h.in index 383fd47dd43c81..b325ef259c8c0b 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -44,9 +44,6 @@ /* Define if --enable-ipv6 is specified */ #undef ENABLE_IPV6 -/* Better isolate subinterpreters, experimental build mode. */ -#undef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - /* Define to 1 if your system stores words within floats with the most significant word first */ #undef FLOAT_WORDS_BIGENDIAN From 27c36053f1b1c55315522e8bc83600b2ceaafb4e Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Wed, 25 May 2022 12:30:23 -0600 Subject: [PATCH 3/5] Add a NEWS entry. --- .../2022-05-25-12-30-12.gh-issue-84694.5sjy2w.rst | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2022-05-25-12-30-12.gh-issue-84694.5sjy2w.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-25-12-30-12.gh-issue-84694.5sjy2w.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-25-12-30-12.gh-issue-84694.5sjy2w.rst new file mode 100644 index 00000000000000..c062d28b294868 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-25-12-30-12.gh-issue-84694.5sjy2w.rst @@ -0,0 +1,2 @@ +The ``--experimental-isolated-subinterpreters`` configure option and +``EXPERIMENTAL_ISOLATED_SUBINTERPRETERS`` macro have been removed. From 23e3ee30e6d3a767e149f9b289b228a7d632846c Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Wed, 25 May 2022 12:30:35 -0600 Subject: [PATCH 4/5] Add a whatsnew entry. --- Doc/whatsnew/3.12.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 033de1780b3d18..aa070330891888 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -115,6 +115,10 @@ Removed (Contributed by Erlend E. Aasland in :gh:`92548`) +* The ``--experimental-isolated-subinterpreters`` configure flag + (and corresponding ``EXPERIMENTAL_ISOLATED_SUBINTERPRETERS``) + have been removed. + Porting to Python 3.12 ====================== From 612fc6205dcf451fde60cfef0412aa46d4b107e8 Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Wed, 25 May 2022 12:34:36 -0600 Subject: [PATCH 5/5] Regen configure. --- configure | 1 - 1 file changed, 1 deletion(-) diff --git a/configure b/configure index 2cfd870d68ec22..3da3306efbbf98 100755 --- a/configure +++ b/configure @@ -22471,7 +22471,6 @@ fi fi - # Check whether to disable test modules. Once set, setup.py will not build # test extension modules and "make install" will not install test suites. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --disable-test-modules" >&5