]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-40513: _xxsubinterpreters.run_string() releases the GIL (GH-19944)
authorVictor Stinner <vstinner@python.org>
Tue, 5 May 2020 18:33:06 +0000 (20:33 +0200)
committerGitHub <noreply@github.com>
Tue, 5 May 2020 18:33:06 +0000 (20:33 +0200)
In the experimental isolated subinterpreters build mode,
_xxsubinterpreters.run_string() now releases the GIL.

Modules/_xxsubinterpretersmodule.c

index de11c090870f94a29f1cb8bddbefd3b91ba57864..8a6fce9e0b4bd9f6659c295da258ab2f09fc8403 100644 (file)
@@ -1939,6 +1939,20 @@ _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()) {
@@ -1956,6 +1970,7 @@ _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) {