2011-04-26 03:21:07 +08:00
|
|
|
#include <Python.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
|
|
void print_subinterp(void)
|
|
|
|
{
|
|
|
|
/* Just output some debug stuff */
|
|
|
|
PyThreadState *ts = PyThreadState_Get();
|
|
|
|
printf("interp %p, thread state %p: ", ts->interp, ts);
|
|
|
|
fflush(stdout);
|
|
|
|
PyRun_SimpleString(
|
|
|
|
"import sys;"
|
|
|
|
"print('id(modules) =', id(sys.modules));"
|
|
|
|
"sys.stdout.flush()"
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
int main(int argc, char *argv[])
|
|
|
|
{
|
|
|
|
PyThreadState *mainstate, *substate;
|
2011-05-26 06:37:45 +08:00
|
|
|
#ifdef WITH_THREAD
|
2011-04-26 03:21:07 +08:00
|
|
|
PyGILState_STATE gilstate;
|
2011-05-26 06:37:45 +08:00
|
|
|
#endif
|
2011-04-26 03:21:07 +08:00
|
|
|
int i, j;
|
|
|
|
|
|
|
|
for (i=0; i<3; i++) {
|
|
|
|
printf("--- Pass %d ---\n", i);
|
|
|
|
/* HACK: the "./" at front avoids a search along the PATH in
|
|
|
|
Modules/getpath.c */
|
|
|
|
Py_SetProgramName(L"./_testembed");
|
|
|
|
Py_Initialize();
|
|
|
|
mainstate = PyThreadState_Get();
|
|
|
|
|
2011-05-26 06:37:45 +08:00
|
|
|
#ifdef WITH_THREAD
|
2011-04-26 03:21:07 +08:00
|
|
|
PyEval_InitThreads();
|
|
|
|
PyEval_ReleaseThread(mainstate);
|
|
|
|
|
|
|
|
gilstate = PyGILState_Ensure();
|
2011-05-26 06:37:45 +08:00
|
|
|
#endif
|
2011-04-26 03:21:07 +08:00
|
|
|
print_subinterp();
|
|
|
|
PyThreadState_Swap(NULL);
|
|
|
|
|
|
|
|
for (j=0; j<3; j++) {
|
|
|
|
substate = Py_NewInterpreter();
|
|
|
|
print_subinterp();
|
|
|
|
Py_EndInterpreter(substate);
|
|
|
|
}
|
|
|
|
|
|
|
|
PyThreadState_Swap(mainstate);
|
|
|
|
print_subinterp();
|
2011-05-26 06:37:45 +08:00
|
|
|
#ifdef WITH_THREAD
|
2011-04-26 03:21:07 +08:00
|
|
|
PyGILState_Release(gilstate);
|
2011-05-26 06:37:45 +08:00
|
|
|
#endif
|
2011-04-26 03:21:07 +08:00
|
|
|
|
|
|
|
PyEval_RestoreThread(mainstate);
|
|
|
|
Py_Finalize();
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|