Upon exit, flush stdout and stderr (twice: before and after the code that
attempts to delete all modules). This makes test_subprocess work again. (I can't quite figure out why stdout/stderr don't get deleted properly, which would flush them anyway, but that's a separate issue.)
This commit is contained in:
parent
5ed033b5a2
commit
e8432ac42f
|
@ -291,6 +291,32 @@ Py_Initialize(void)
|
||||||
extern void dump_counts(FILE*);
|
extern void dump_counts(FILE*);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Flush stdout and stderr */
|
||||||
|
|
||||||
|
void
|
||||||
|
flush_std_files()
|
||||||
|
{
|
||||||
|
PyObject *fout = PySys_GetObject("stdout");
|
||||||
|
PyObject *ferr = PySys_GetObject("stderr");
|
||||||
|
PyObject *tmp;
|
||||||
|
|
||||||
|
if (fout != NULL) {
|
||||||
|
tmp = PyObject_CallMethod(fout, "flush", "");
|
||||||
|
if (tmp == NULL)
|
||||||
|
PyErr_Clear();
|
||||||
|
else
|
||||||
|
Py_DECREF(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ferr != NULL) {
|
||||||
|
tmp = PyObject_CallMethod(ferr, "flush", "");
|
||||||
|
if (tmp == NULL)
|
||||||
|
PyErr_Clear();
|
||||||
|
else
|
||||||
|
Py_DECREF(tmp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Undo the effect of Py_Initialize().
|
/* Undo the effect of Py_Initialize().
|
||||||
|
|
||||||
Beware: if multiple interpreter and/or thread states exist, these
|
Beware: if multiple interpreter and/or thread states exist, these
|
||||||
|
@ -326,6 +352,9 @@ Py_Finalize(void)
|
||||||
call_py_exitfuncs();
|
call_py_exitfuncs();
|
||||||
initialized = 0;
|
initialized = 0;
|
||||||
|
|
||||||
|
/* Flush stdout+stderr */
|
||||||
|
flush_std_files();
|
||||||
|
|
||||||
/* Get current thread state and interpreter pointer */
|
/* Get current thread state and interpreter pointer */
|
||||||
tstate = PyThreadState_GET();
|
tstate = PyThreadState_GET();
|
||||||
interp = tstate->interp;
|
interp = tstate->interp;
|
||||||
|
@ -361,6 +390,9 @@ Py_Finalize(void)
|
||||||
/* Destroy all modules */
|
/* Destroy all modules */
|
||||||
PyImport_Cleanup();
|
PyImport_Cleanup();
|
||||||
|
|
||||||
|
/* Flush stdout+stderr (again, in case more was printed) */
|
||||||
|
flush_std_files();
|
||||||
|
|
||||||
/* Collect final garbage. This disposes of cycles created by
|
/* Collect final garbage. This disposes of cycles created by
|
||||||
* new-style class definitions, for example.
|
* new-style class definitions, for example.
|
||||||
* XXX This is disabled because it caused too many problems. If
|
* XXX This is disabled because it caused too many problems. If
|
||||||
|
|
Loading…
Reference in New Issue