Merge Py_Cleanup() into Py_Finalize(). Call the various small Fini()

functions.
This commit is contained in:
Guido van Rossum 1997-08-05 02:22:03 +00:00
parent 085d269f1d
commit cc283f56a7
1 changed files with 43 additions and 36 deletions

View File

@ -69,6 +69,8 @@ static PyObject *run_pyc_file Py_PROTO((FILE *fp, char *filename,
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 @@ Py_Finalize()
PyInterpreterState *interp;
PyThreadState *tstate;
call_sys_exitfunc();
if (!initialized)
Py_FatalError("Py_Finalize: not initialized");
initialized = 0;
@ -177,9 +181,38 @@ Py_Finalize()
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 @@ Py_GetProgramName()
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 @@ int Py_AtExit(func)
return 0;
}
void
Py_Cleanup()
static void
call_sys_exitfunc()
{
PyObject *exitfunc = PySys_GetObject("exitfunc");
@ -849,9 +866,11 @@ Py_Cleanup()
}
Py_FlushLine();
}
Py_Finalize();
static void
call_ll_exitfuncs()
{
while (nexitfuncs > 0)
(*exitfuncs[--nexitfuncs])();
@ -867,21 +886,7 @@ void
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 @@ sighandler(sig)
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