Commit 6a27efa2 authored by Christian Heimes's avatar Christian Heimes

Issue 3723: Fixed initialization of subinterpreters

The patch fixes several issues with Py_NewInterpreter as well as the demo for multiple subinterpreters.
Most of the patch was written by MvL with help from Benjamin, Amaury and me. Graham Dumpleton has verified that this patch fixes an issue with mod_wsgi.
parent 5833a2f6
#include <Python.h> #include <Python.h>
char* cmd = "import exceptions"; #if 0
char* cmd = "import codecs, encodings.utf_8, types; print(types)";
#else
char* cmd = "import types; print(types)";
#endif
int main() int main()
{ {
printf("Initialize interpreter\n");
Py_Initialize(); Py_Initialize();
PyEval_InitThreads(); PyEval_InitThreads();
PyRun_SimpleString(cmd); PyRun_SimpleString(cmd);
Py_EndInterpreter(PyThreadState_Get()); Py_EndInterpreter(PyThreadState_Get());
printf("\nInitialize subinterpreter\n");
Py_NewInterpreter(); Py_NewInterpreter();
PyRun_SimpleString(cmd); PyRun_SimpleString(cmd);
Py_Finalize(); Py_Finalize();
......
...@@ -27,6 +27,7 @@ typedef struct _is { ...@@ -27,6 +27,7 @@ typedef struct _is {
PyObject *codec_search_path; PyObject *codec_search_path;
PyObject *codec_search_cache; PyObject *codec_search_cache;
PyObject *codec_error_registry; PyObject *codec_error_registry;
int codecs_initialized;
#ifdef HAVE_DLOPEN #ifdef HAVE_DLOPEN
int dlopenflags; int dlopenflags;
......
...@@ -15,6 +15,8 @@ What's New in Python 3.0 beta 5 ...@@ -15,6 +15,8 @@ What's New in Python 3.0 beta 5
Core and Builtins Core and Builtins
----------------- -----------------
- Issue 3723: Fixed initialization of subinterpreters.
- Issue #4213: The file system encoding is now normalized by the - Issue #4213: The file system encoding is now normalized by the
codec subsystem, for example UTF-8 is turned into utf-8. codec subsystem, for example UTF-8 is turned into utf-8.
......
...@@ -1346,6 +1346,19 @@ PyObject *PyUnicode_AsEncodedString(PyObject *unicode, ...@@ -1346,6 +1346,19 @@ PyObject *PyUnicode_AsEncodedString(PyObject *unicode,
#endif #endif
else if (strcmp(encoding, "ascii") == 0) else if (strcmp(encoding, "ascii") == 0)
return PyUnicode_AsASCIIString(unicode); return PyUnicode_AsASCIIString(unicode);
/* During bootstrap, we may need to find the encodings
package, to load the file system encoding, and require the
file system encoding in order to load the encodings
package.
Break out of this dependency by assuming that the path to
the encodings module is ASCII-only. XXX could try wcstombs
instead, if the file system encoding is the locale's
encoding. */
else if (Py_FileSystemDefaultEncoding &&
strcmp(encoding, Py_FileSystemDefaultEncoding) == 0 &&
!PyThreadState_GET()->interp->codecs_initialized)
return PyUnicode_AsASCIIString(unicode);
} }
/* Encode via the codec registry */ /* Encode via the codec registry */
......
...@@ -2282,7 +2282,7 @@ static struct PyModuleDef builtinsmodule = { ...@@ -2282,7 +2282,7 @@ static struct PyModuleDef builtinsmodule = {
PyModuleDef_HEAD_INIT, PyModuleDef_HEAD_INIT,
"builtins", "builtins",
builtin_doc, builtin_doc,
0, -1, /* multiple "initialization" just copies the module dict. */
builtin_methods, builtin_methods,
NULL, NULL,
NULL, NULL,
......
...@@ -869,5 +869,6 @@ static int _PyCodecRegistry_Init(void) ...@@ -869,5 +869,6 @@ static int _PyCodecRegistry_Init(void)
return -1; return -1;
} }
Py_DECREF(mod); Py_DECREF(mod);
interp->codecs_initialized = 1;
return 0; return 0;
} }
...@@ -76,6 +76,7 @@ PyInterpreterState_New(void) ...@@ -76,6 +76,7 @@ PyInterpreterState_New(void)
interp->codec_search_path = NULL; interp->codec_search_path = NULL;
interp->codec_search_cache = NULL; interp->codec_search_cache = NULL;
interp->codec_error_registry = NULL; interp->codec_error_registry = NULL;
interp->codecs_initialized = 0;
#ifdef HAVE_DLOPEN #ifdef HAVE_DLOPEN
#ifdef RTLD_NOW #ifdef RTLD_NOW
interp->dlopenflags = RTLD_NOW; interp->dlopenflags = RTLD_NOW;
......
...@@ -562,8 +562,13 @@ Py_NewInterpreter(void) ...@@ -562,8 +562,13 @@ Py_NewInterpreter(void)
goto handle_error; goto handle_error;
Py_INCREF(interp->builtins); Py_INCREF(interp->builtins);
} }
/* initialize builtin exceptions */
_PyExc_Init();
sysmod = _PyImport_FindExtension("sys", "sys"); sysmod = _PyImport_FindExtension("sys", "sys");
if (bimod != NULL && sysmod != NULL) { if (bimod != NULL && sysmod != NULL) {
PyObject *pstderr;
interp->sysdict = PyModule_GetDict(sysmod); interp->sysdict = PyModule_GetDict(sysmod);
if (interp->sysdict == NULL) if (interp->sysdict == NULL)
goto handle_error; goto handle_error;
...@@ -571,7 +576,18 @@ Py_NewInterpreter(void) ...@@ -571,7 +576,18 @@ Py_NewInterpreter(void)
PySys_SetPath(Py_GetPath()); PySys_SetPath(Py_GetPath());
PyDict_SetItemString(interp->sysdict, "modules", PyDict_SetItemString(interp->sysdict, "modules",
interp->modules); interp->modules);
/* Set up a preliminary stderr printer until we have enough
infrastructure for the io module in place. */
pstderr = PyFile_NewStdPrinter(fileno(stderr));
if (pstderr == NULL)
Py_FatalError("Py_Initialize: can't set preliminary stderr");
PySys_SetObject("stderr", pstderr);
PySys_SetObject("__stderr__", pstderr);
_PyImportHooks_Init(); _PyImportHooks_Init();
if (initstdio() < 0)
Py_FatalError(
"Py_Initialize: can't initialize sys standard streams");
initmain(); initmain();
if (!Py_NoSiteFlag) if (!Py_NoSiteFlag)
initsite(); initsite();
......
...@@ -1231,7 +1231,7 @@ static struct PyModuleDef sysmodule = { ...@@ -1231,7 +1231,7 @@ static struct PyModuleDef sysmodule = {
PyModuleDef_HEAD_INIT, PyModuleDef_HEAD_INIT,
"sys", "sys",
sys_doc, sys_doc,
0, -1, /* multiple "initialization" just copies the module dict. */
sys_methods, sys_methods,
NULL, NULL,
NULL, NULL,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment