@@ -47,6 +47,12 @@ gc_is_collecting(PyGC_Head *g)
47
47
return (g -> gc .gc_prev & MASK_COLLECTING ) != 0 ;
48
48
}
49
49
50
+ static inline void
51
+ gc_clear_masks (PyGC_Head * g )
52
+ {
53
+ g -> gc .gc_prev &= ~(MASK_COLLECTING | MASK_TENTATIVELY_UNREACHABLE );
54
+ }
55
+
50
56
static inline Py_ssize_t
51
57
gc_get_refs (PyGC_Head * g )
52
58
{
@@ -146,7 +152,6 @@ gc_refs
146
152
subtract_refs() then adjusts gc_refs so that it equals the number of
147
153
times an object is referenced directly from outside the generation
148
154
being collected.
149
- gc_refs remains >= 0 throughout these steps.
150
155
151
156
MASK_TENTATIVELY_UNREACHABLE
152
157
move_unreachable() then moves objects not reachable (whether directly or
@@ -517,7 +522,7 @@ move_legacy_finalizers(PyGC_Head *unreachable, PyGC_Head *finalizers)
517
522
518
523
if (has_legacy_finalizer (op )) {
519
524
gc_list_move (gc , finalizers );
520
- gc -> gc . gc_prev &= ~( MASK_TENTATIVELY_UNREACHABLE | MASK_COLLECTING );
525
+ gc_clear_masks ( gc );
521
526
}
522
527
}
523
528
}
@@ -530,7 +535,7 @@ visit_move(PyObject *op, PyGC_Head *tolist)
530
535
if (IS_TENTATIVELY_UNREACHABLE (op )) {
531
536
PyGC_Head * gc = AS_GC (op );
532
537
gc_list_move (gc , tolist );
533
- gc -> gc . gc_prev &= ~( MASK_TENTATIVELY_UNREACHABLE | MASK_COLLECTING );
538
+ gc_clear_masks ( gc );
534
539
}
535
540
}
536
541
return 0 ;
@@ -798,22 +803,12 @@ check_garbage(PyGC_Head *collectable)
798
803
ret = -1 ;
799
804
}
800
805
_PyGCHead_SET_PREV (gc , prev );
801
- gc -> gc . gc_prev &= ~( MASK_TENTATIVELY_UNREACHABLE | MASK_COLLECTING );
806
+ gc_clear_masks ( gc );
802
807
prev = gc ;
803
808
}
804
809
return ret ;
805
810
}
806
811
807
- static void
808
- revive_garbage (PyGC_Head * collectable )
809
- {
810
- PyGC_Head * gc ;
811
- for (gc = collectable -> gc .gc_next ; gc != collectable ;
812
- gc = gc -> gc .gc_next ) {
813
- gc -> gc .gc_prev &= ~(MASK_TENTATIVELY_UNREACHABLE | MASK_COLLECTING );
814
- }
815
- }
816
-
817
812
/* Break reference cycles by clearing the containers involved. This is
818
813
* tricky business as the lists can be changing and we don't know which
819
814
* objects may be freed. It is possible I screwed something up here.
@@ -992,7 +987,6 @@ collect(int generation, Py_ssize_t *n_collected, Py_ssize_t *n_uncollectable,
992
987
finalize_garbage (& unreachable );
993
988
994
989
if (check_garbage (& unreachable )) { // clears MASKs
995
- revive_garbage (& unreachable );
996
990
gc_list_merge (& unreachable , old );
997
991
}
998
992
else {
0 commit comments