Merge Py_Cleanup() into Py_Finalize(). Call the various small Fini()
functions.
diff --git a/Python/pythonrun.c b/Python/pythonrun.c
index d0fe2fc..4d64114 100644
--- a/Python/pythonrun.c
+++ b/Python/pythonrun.c
@@ -69,6 +69,8 @@
static void err_input Py_PROTO((perrdetail *));
static void initsigs Py_PROTO((void));
static void finisigs Py_PROTO((void));
+static void call_sys_exitfunc Py_PROTO((void));
+static void call_ll_exitfuncs Py_PROTO((void));
int Py_DebugFlag; /* Needed by parser.c */
int Py_VerboseFlag; /* Needed by import.c */
@@ -162,6 +164,8 @@
PyInterpreterState *interp;
PyThreadState *tstate;
+ call_sys_exitfunc();
+
if (!initialized)
Py_FatalError("Py_Finalize: not initialized");
initialized = 0;
@@ -177,9 +181,38 @@
finisigs();
_PyImport_Fini();
_PyBuiltin_Fini();
+ PyMethod_Fini();
+ PyFrame_Fini();
+ PyCFunction_Fini();
+ PyTuple_Fini();
PyString_Fini();
+ PyInt_Fini();
+ PyFloat_Fini();
+
+ /* XXX Still allocated:
+ - various static ad-hoc pointers to interned strings
+ - int and float free list blocks
+ - whatever various modules and libraries allocate
+ */
PyGrammar_RemoveAccelerators(&_PyParser_Grammar);
+
+ call_ll_exitfuncs();
+
+#ifdef COUNT_ALLOCS
+ dump_counts();
+#endif
+
+#ifdef Py_REF_DEBUG
+ fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
+#endif
+
+#ifdef Py_TRACE_REFS
+ if (_Py_AskYesNo("Print left references?")) {
+ _Py_PrintReferences(stderr);
+ }
+ _Py_ResetReferences();
+#endif /* Py_TRACE_REFS */
}
/* Create and initialize a new interpreter and thread, and return the
@@ -297,22 +330,6 @@
return progname;
}
-/*
- Py_Initialize()
- -- do everything, no-op on second call, call fatal on failure, set path
-
- #2
- -- create new interp+tstate & make it current, return NULL on failure,
- make it current, do all setup, set path
-
- #3
- -- #2 without set path
-
- #4
- -- is there any point to #3 for caller-provided current interp+tstate?
-
-*/
-
/* Create __main__ module */
static void
@@ -831,8 +848,8 @@
return 0;
}
-void
-Py_Cleanup()
+static void
+call_sys_exitfunc()
{
PyObject *exitfunc = PySys_GetObject("exitfunc");
@@ -849,9 +866,11 @@
}
Py_FlushLine();
+}
- Py_Finalize();
-
+static void
+call_ll_exitfuncs()
+{
while (nexitfuncs > 0)
(*exitfuncs[--nexitfuncs])();
@@ -867,21 +886,7 @@
Py_Exit(sts)
int sts;
{
- Py_Cleanup();
-
-#ifdef COUNT_ALLOCS
- dump_counts();
-#endif
-
-#ifdef Py_REF_DEBUG
- fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
-#endif
-
-#ifdef Py_TRACE_REFS
- if (_Py_AskYesNo("Print left references?")) {
- _Py_PrintReferences(stderr);
- }
-#endif /* Py_TRACE_REFS */
+ Py_Finalize();
#ifdef macintosh
PyMac_Exit(sts);
@@ -896,7 +901,9 @@
int sig;
{
signal(sig, SIG_DFL); /* Don't catch recursive signals */
- Py_Cleanup(); /* Do essential clean-up */
+ /* Do essential exit processing only */
+ call_sys_exitfunc();
+ call_ll_exitfuncs();
#ifdef HAVE_KILL
kill(getpid(), sig); /* Pretend the signal killed us */
#else