Skip to content

Commit

Permalink
Issue 3723: Fixed initialization of subinterpreters
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
tiran committed Oct 30, 2008
1 parent 5833a2f commit 6a27efa
Show file tree
Hide file tree
Showing 9 changed files with 43 additions and 3 deletions.
8 changes: 7 additions & 1 deletion Demo/embed/importexc.c
Original file line number Diff line number Diff line change
@@ -1,14 +1,20 @@
#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()
{
printf("Initialize interpreter\n");
Py_Initialize();
PyEval_InitThreads();
PyRun_SimpleString(cmd);
Py_EndInterpreter(PyThreadState_Get());

printf("\nInitialize subinterpreter\n");
Py_NewInterpreter();
PyRun_SimpleString(cmd);
Py_Finalize();
Expand Down
1 change: 1 addition & 0 deletions Include/pystate.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ typedef struct _is {
PyObject *codec_search_path;
PyObject *codec_search_cache;
PyObject *codec_error_registry;
int codecs_initialized;

#ifdef HAVE_DLOPEN
int dlopenflags;
Expand Down
2 changes: 2 additions & 0 deletions Misc/NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ What's New in Python 3.0 beta 5
Core and Builtins
-----------------

- Issue 3723: Fixed initialization of subinterpreters.

- Issue #4213: The file system encoding is now normalized by the
codec subsystem, for example UTF-8 is turned into utf-8.

Expand Down
13 changes: 13 additions & 0 deletions Objects/unicodeobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -1346,6 +1346,19 @@ PyObject *PyUnicode_AsEncodedString(PyObject *unicode,
#endif
else if (strcmp(encoding, "ascii") == 0)
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 */
Expand Down
2 changes: 1 addition & 1 deletion Python/bltinmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -2282,7 +2282,7 @@ static struct PyModuleDef builtinsmodule = {
PyModuleDef_HEAD_INIT,
"builtins",
builtin_doc,
0,
-1, /* multiple "initialization" just copies the module dict. */
builtin_methods,
NULL,
NULL,
Expand Down
1 change: 1 addition & 0 deletions Python/codecs.c
Original file line number Diff line number Diff line change
Expand Up @@ -869,5 +869,6 @@ static int _PyCodecRegistry_Init(void)
return -1;
}
Py_DECREF(mod);
interp->codecs_initialized = 1;
return 0;
}
1 change: 1 addition & 0 deletions Python/pystate.c
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ PyInterpreterState_New(void)
interp->codec_search_path = NULL;
interp->codec_search_cache = NULL;
interp->codec_error_registry = NULL;
interp->codecs_initialized = 0;
#ifdef HAVE_DLOPEN
#ifdef RTLD_NOW
interp->dlopenflags = RTLD_NOW;
Expand Down
16 changes: 16 additions & 0 deletions Python/pythonrun.c
Original file line number Diff line number Diff line change
Expand Up @@ -562,16 +562,32 @@ Py_NewInterpreter(void)
goto handle_error;
Py_INCREF(interp->builtins);
}

/* initialize builtin exceptions */
_PyExc_Init();

sysmod = _PyImport_FindExtension("sys", "sys");
if (bimod != NULL && sysmod != NULL) {
PyObject *pstderr;
interp->sysdict = PyModule_GetDict(sysmod);
if (interp->sysdict == NULL)
goto handle_error;
Py_INCREF(interp->sysdict);
PySys_SetPath(Py_GetPath());
PyDict_SetItemString(interp->sysdict, "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();
if (initstdio() < 0)
Py_FatalError(
"Py_Initialize: can't initialize sys standard streams");
initmain();
if (!Py_NoSiteFlag)
initsite();
Expand Down
2 changes: 1 addition & 1 deletion Python/sysmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -1231,7 +1231,7 @@ static struct PyModuleDef sysmodule = {
PyModuleDef_HEAD_INIT,
"sys",
sys_doc,
0,
-1, /* multiple "initialization" just copies the module dict. */
sys_methods,
NULL,
NULL,
Expand Down

0 comments on commit 6a27efa

Please sign in to comment.