mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	Merge Py_Cleanup() into Py_Finalize(). Call the various small Fini()
functions.
This commit is contained in:
		
							parent
							
								
									085d269f1d
								
							
						
					
					
						commit
						cc283f56a7
					
				
					 1 changed files with 43 additions and 36 deletions
				
			
		| 
						 | 
					@ -69,6 +69,8 @@ static PyObject *run_pyc_file Py_PROTO((FILE *fp, char *filename,
 | 
				
			||||||
static void err_input Py_PROTO((perrdetail *));
 | 
					static void err_input Py_PROTO((perrdetail *));
 | 
				
			||||||
static void initsigs Py_PROTO((void));
 | 
					static void initsigs Py_PROTO((void));
 | 
				
			||||||
static void finisigs 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_DebugFlag; /* Needed by parser.c */
 | 
				
			||||||
int Py_VerboseFlag; /* Needed by import.c */
 | 
					int Py_VerboseFlag; /* Needed by import.c */
 | 
				
			||||||
| 
						 | 
					@ -162,6 +164,8 @@ Py_Finalize()
 | 
				
			||||||
	PyInterpreterState *interp;
 | 
						PyInterpreterState *interp;
 | 
				
			||||||
	PyThreadState *tstate;
 | 
						PyThreadState *tstate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						call_sys_exitfunc();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!initialized)
 | 
						if (!initialized)
 | 
				
			||||||
		Py_FatalError("Py_Finalize: not initialized");
 | 
							Py_FatalError("Py_Finalize: not initialized");
 | 
				
			||||||
	initialized = 0;
 | 
						initialized = 0;
 | 
				
			||||||
| 
						 | 
					@ -177,9 +181,38 @@ Py_Finalize()
 | 
				
			||||||
	finisigs();
 | 
						finisigs();
 | 
				
			||||||
	_PyImport_Fini();
 | 
						_PyImport_Fini();
 | 
				
			||||||
	_PyBuiltin_Fini();
 | 
						_PyBuiltin_Fini();
 | 
				
			||||||
 | 
						PyMethod_Fini();
 | 
				
			||||||
 | 
						PyFrame_Fini();
 | 
				
			||||||
 | 
						PyCFunction_Fini();
 | 
				
			||||||
 | 
						PyTuple_Fini();
 | 
				
			||||||
	PyString_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);
 | 
						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
 | 
					/* Create and initialize a new interpreter and thread, and return the
 | 
				
			||||||
| 
						 | 
					@ -297,22 +330,6 @@ Py_GetProgramName()
 | 
				
			||||||
	return progname;
 | 
						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 */
 | 
					/* Create __main__ module */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
| 
						 | 
					@ -831,8 +848,8 @@ int Py_AtExit(func)
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					static void
 | 
				
			||||||
Py_Cleanup()
 | 
					call_sys_exitfunc()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	PyObject *exitfunc = PySys_GetObject("exitfunc");
 | 
						PyObject *exitfunc = PySys_GetObject("exitfunc");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -849,9 +866,11 @@ Py_Cleanup()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Py_FlushLine();
 | 
						Py_FlushLine();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Py_Finalize();
 | 
					static void
 | 
				
			||||||
 | 
					call_ll_exitfuncs()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
	while (nexitfuncs > 0)
 | 
						while (nexitfuncs > 0)
 | 
				
			||||||
		(*exitfuncs[--nexitfuncs])();
 | 
							(*exitfuncs[--nexitfuncs])();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -867,21 +886,7 @@ void
 | 
				
			||||||
Py_Exit(sts)
 | 
					Py_Exit(sts)
 | 
				
			||||||
	int sts;
 | 
						int sts;
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Py_Cleanup();
 | 
						Py_Finalize();
 | 
				
			||||||
 | 
					 | 
				
			||||||
#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 */
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef macintosh
 | 
					#ifdef macintosh
 | 
				
			||||||
	PyMac_Exit(sts);
 | 
						PyMac_Exit(sts);
 | 
				
			||||||
| 
						 | 
					@ -896,7 +901,9 @@ sighandler(sig)
 | 
				
			||||||
	int sig;
 | 
						int sig;
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	signal(sig, SIG_DFL); /* Don't catch recursive signals */
 | 
						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
 | 
					#ifdef HAVE_KILL
 | 
				
			||||||
	kill(getpid(), sig); /* Pretend the signal killed us */
 | 
						kill(getpid(), sig); /* Pretend the signal killed us */
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue