@@ -853,7 +853,8 @@ get_time(void)
853853/* This is the main function. Read this to understand how the
854854 * collection process works. */
855855static Py_ssize_t
856- collect (int generation , Py_ssize_t * n_collected , Py_ssize_t * n_uncollectable )
856+ collect (int generation , Py_ssize_t * n_collected , Py_ssize_t * n_uncollectable ,
857+ int nofail )
857858{
858859 int i ;
859860 Py_ssize_t m = 0 ; /* # objects collected */
@@ -1000,10 +1001,15 @@ collect(int generation, Py_ssize_t *n_collected, Py_ssize_t *n_uncollectable)
10001001 }
10011002
10021003 if (PyErr_Occurred ()) {
1003- if (gc_str == NULL )
1004- gc_str = PyUnicode_FromString ("garbage collection" );
1005- PyErr_WriteUnraisable (gc_str );
1006- Py_FatalError ("unexpected exception during garbage collection" );
1004+ if (nofail ) {
1005+ PyErr_Clear ();
1006+ }
1007+ else {
1008+ if (gc_str == NULL )
1009+ gc_str = PyUnicode_FromString ("garbage collection" );
1010+ PyErr_WriteUnraisable (gc_str );
1011+ Py_FatalError ("unexpected exception during garbage collection" );
1012+ }
10071013 }
10081014
10091015 /* Update stats */
@@ -1062,7 +1068,7 @@ collect_with_callback(int generation)
10621068{
10631069 Py_ssize_t result , collected , uncollectable ;
10641070 invoke_gc_callback ("start" , generation , 0 , 0 );
1065- result = collect (generation , & collected , & uncollectable );
1071+ result = collect (generation , & collected , & uncollectable , 0 );
10661072 invoke_gc_callback ("stop" , generation , collected , uncollectable );
10671073 return result ;
10681074}
@@ -1544,6 +1550,19 @@ PyGC_Collect(void)
15441550 return n ;
15451551}
15461552
1553+ Py_ssize_t
1554+ _PyGC_CollectNoFail (void )
1555+ {
1556+ Py_ssize_t n ;
1557+
1558+ /* This function should only be called on interpreter shutdown, and
1559+ therefore not recursively. */
1560+ assert (!collecting );
1561+ collecting = 1 ;
1562+ n = collect (NUM_GENERATIONS - 1 , NULL , NULL , 1 );
1563+ collecting = 0 ;
1564+ return n ;
1565+ }
15471566
15481567void
15491568_PyGC_DumpShutdownStats (void )
0 commit comments