blob: fdbba6a7afc29db1e45b2876afa0d7cf62517bee [file] [log] [blame]
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001/*
Tim Peters88396172002-06-30 17:56:40 +00002
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00003 Reference Cycle Garbage Collection
4 ==================================
5
Neil Schemenauerb2c2c9e2000-10-04 16:34:09 +00006 Neil Schemenauer <nas@arctrix.com>
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00007
8 Based on a post on the python-dev list. Ideas from Guido van Rossum,
9 Eric Tiedemann, and various others.
10
Neil Schemenauer43411b52001-08-30 00:05:51 +000011 http://www.arctrix.com/nas/python/gc/
Neil Schemenauera7024e92008-07-15 19:24:01 +000012
13 The following mailing list threads provide a historical perspective on
14 the design of this module. Note that a fair amount of refinement has
15 occurred since those discussions.
16
17 http://mail.python.org/pipermail/python-dev/2000-March/002385.html
18 http://mail.python.org/pipermail/python-dev/2000-March/002434.html
19 http://mail.python.org/pipermail/python-dev/2000-March/002497.html
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000020
21 For a highlevel view of the collection process, read the collect
22 function.
23
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000024*/
25
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000026#include "Python.h"
Victor Stinner27e2d1f2018-11-01 00:52:28 +010027#include "pycore_context.h"
Victor Stinner444b39b2019-11-20 01:18:11 +010028#include "pycore_initconfig.h"
Victor Stinnere5014be2020-04-14 17:52:15 +020029#include "pycore_interp.h" // PyInterpreterState.gc
Victor Stinnerbcda8f12018-11-21 22:27:47 +010030#include "pycore_object.h"
Victor Stinner2e969062019-11-20 01:49:32 +010031#include "pycore_pyerrors.h"
Victor Stinnere5014be2020-04-14 17:52:15 +020032#include "pycore_pystate.h" // _PyThreadState_GET()
Łukasz Langaa785c872016-09-09 17:37:37 -070033#include "pydtrace.h"
Victor Stinnere5014be2020-04-14 17:52:15 +020034#include "pytime.h" // _PyTime_GetMonotonicClock()
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000035
Victor Stinner67e0de62019-11-20 11:48:18 +010036typedef struct _gc_runtime_state GCState;
37
Serhiy Storchaka93260282017-02-04 11:19:59 +020038/*[clinic input]
39module gc
40[clinic start generated code]*/
41/*[clinic end generated code: output=da39a3ee5e6b4b0d input=b5c9690ecc842d79]*/
42
Pablo Galindo320dd502019-10-10 22:45:17 +010043
44#ifdef Py_DEBUG
45# define GC_DEBUG
46#endif
INADA Naoki5ac9e6e2018-07-10 17:19:53 +090047
48#define GC_NEXT _PyGCHead_NEXT
49#define GC_PREV _PyGCHead_PREV
50
51// update_refs() set this bit for all objects in current generation.
52// subtract_refs() and move_unreachable() uses this to distinguish
53// visited object is in GCing or not.
54//
55// move_unreachable() removes this flag from reachable objects.
56// Only unreachable objects have this flag.
57//
58// No objects in interpreter have this flag after GC ends.
59#define PREV_MASK_COLLECTING _PyGC_PREV_MASK_COLLECTING
60
61// Lowest bit of _gc_next is used for UNREACHABLE flag.
62//
63// This flag represents the object is in unreachable list in move_unreachable()
64//
65// Although this flag is used only in move_unreachable(), move_unreachable()
66// doesn't clear this flag to skip unnecessary iteration.
67// move_legacy_finalizers() removes this flag instead.
68// Between them, unreachable list is not normal list and we can not use
69// most gc_list_* functions for it.
70#define NEXT_MASK_UNREACHABLE (1)
71
Victor Stinner626bff82018-10-25 17:31:10 +020072/* Get an object's GC head */
73#define AS_GC(o) ((PyGC_Head *)(o)-1)
74
75/* Get the object given the GC head */
76#define FROM_GC(g) ((PyObject *)(((PyGC_Head *)g)+1))
77
INADA Naoki5ac9e6e2018-07-10 17:19:53 +090078static inline int
79gc_is_collecting(PyGC_Head *g)
80{
81 return (g->_gc_prev & PREV_MASK_COLLECTING) != 0;
82}
83
84static inline void
85gc_clear_collecting(PyGC_Head *g)
86{
87 g->_gc_prev &= ~PREV_MASK_COLLECTING;
88}
89
90static inline Py_ssize_t
91gc_get_refs(PyGC_Head *g)
92{
93 return (Py_ssize_t)(g->_gc_prev >> _PyGC_PREV_SHIFT);
94}
95
96static inline void
97gc_set_refs(PyGC_Head *g, Py_ssize_t refs)
98{
99 g->_gc_prev = (g->_gc_prev & ~_PyGC_PREV_MASK)
100 | ((uintptr_t)(refs) << _PyGC_PREV_SHIFT);
101}
102
103static inline void
104gc_reset_refs(PyGC_Head *g, Py_ssize_t refs)
105{
106 g->_gc_prev = (g->_gc_prev & _PyGC_PREV_MASK_FINALIZED)
107 | PREV_MASK_COLLECTING
108 | ((uintptr_t)(refs) << _PyGC_PREV_SHIFT);
109}
110
111static inline void
112gc_decref(PyGC_Head *g)
113{
Victor Stinner626bff82018-10-25 17:31:10 +0200114 _PyObject_ASSERT_WITH_MSG(FROM_GC(g),
115 gc_get_refs(g) > 0,
116 "refcount is too small");
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900117 g->_gc_prev -= 1 << _PyGC_PREV_SHIFT;
118}
119
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000120/* set for debugging information */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000121#define DEBUG_STATS (1<<0) /* print collection statistics */
122#define DEBUG_COLLECTABLE (1<<1) /* print collectable objects */
123#define DEBUG_UNCOLLECTABLE (1<<2) /* print uncollectable objects */
124#define DEBUG_SAVEALL (1<<5) /* save all garbage in gc.garbage */
125#define DEBUG_LEAK DEBUG_COLLECTABLE | \
126 DEBUG_UNCOLLECTABLE | \
127 DEBUG_SAVEALL
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000128
Victor Stinner67e0de62019-11-20 11:48:18 +0100129#define GEN_HEAD(gcstate, n) (&(gcstate)->generations[n].head)
Antoine Pitroud4156c12012-10-30 22:43:19 +0100130
Victor Stinner1bcc32f2020-06-10 20:08:26 +0200131
132static GCState *
133get_gc_state(void)
134{
135 PyInterpreterState *interp = _PyInterpreterState_GET();
136 return &interp->gc;
137}
138
139
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600140void
Victor Stinner72474072019-11-20 12:25:50 +0100141_PyGC_InitState(GCState *gcstate)
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600142{
Victor Stinner67e0de62019-11-20 11:48:18 +0100143 gcstate->enabled = 1; /* automatic collection enabled? */
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600144
Victor Stinner67e0de62019-11-20 11:48:18 +0100145#define _GEN_HEAD(n) GEN_HEAD(gcstate, n)
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600146 struct gc_generation generations[NUM_GENERATIONS] = {
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900147 /* PyGC_Head, threshold, count */
148 {{(uintptr_t)_GEN_HEAD(0), (uintptr_t)_GEN_HEAD(0)}, 700, 0},
149 {{(uintptr_t)_GEN_HEAD(1), (uintptr_t)_GEN_HEAD(1)}, 10, 0},
150 {{(uintptr_t)_GEN_HEAD(2), (uintptr_t)_GEN_HEAD(2)}, 10, 0},
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600151 };
152 for (int i = 0; i < NUM_GENERATIONS; i++) {
Victor Stinner67e0de62019-11-20 11:48:18 +0100153 gcstate->generations[i] = generations[i];
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600154 };
Victor Stinner67e0de62019-11-20 11:48:18 +0100155 gcstate->generation0 = GEN_HEAD(gcstate, 0);
brainfvckc75edab2017-10-16 12:49:41 -0700156 struct gc_generation permanent_generation = {
Victor Stinner67e0de62019-11-20 11:48:18 +0100157 {(uintptr_t)&gcstate->permanent_generation.head,
158 (uintptr_t)&gcstate->permanent_generation.head}, 0, 0
brainfvckc75edab2017-10-16 12:49:41 -0700159 };
Victor Stinner67e0de62019-11-20 11:48:18 +0100160 gcstate->permanent_generation = permanent_generation;
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600161}
Antoine Pitroud4156c12012-10-30 22:43:19 +0100162
Victor Stinner444b39b2019-11-20 01:18:11 +0100163
164PyStatus
Victor Stinner01b1cc12019-11-20 02:27:56 +0100165_PyGC_Init(PyThreadState *tstate)
Victor Stinner444b39b2019-11-20 01:18:11 +0100166{
Victor Stinner72474072019-11-20 12:25:50 +0100167 GCState *gcstate = &tstate->interp->gc;
Christian Heimes646d7fd2020-11-19 15:08:34 +0100168
169 gcstate->garbage = PyList_New(0);
Victor Stinner67e0de62019-11-20 11:48:18 +0100170 if (gcstate->garbage == NULL) {
Christian Heimes646d7fd2020-11-19 15:08:34 +0100171 return _PyStatus_NO_MEMORY();
Victor Stinner444b39b2019-11-20 01:18:11 +0100172 }
Christian Heimes646d7fd2020-11-19 15:08:34 +0100173
174 gcstate->callbacks = PyList_New(0);
175 if (gcstate->callbacks == NULL) {
176 return _PyStatus_NO_MEMORY();
177 }
178
Victor Stinner444b39b2019-11-20 01:18:11 +0100179 return _PyStatus_OK();
180}
181
182
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900183/*
184_gc_prev values
185---------------
Neil Schemenauer43411b52001-08-30 00:05:51 +0000186
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900187Between collections, _gc_prev is used for doubly linked list.
Tim Peters6fc13d92002-07-02 18:12:35 +0000188
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900189Lowest two bits of _gc_prev are used for flags.
190PREV_MASK_COLLECTING is used only while collecting and cleared before GC ends
191or _PyObject_GC_UNTRACK() is called.
Tim Peters6fc13d92002-07-02 18:12:35 +0000192
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900193During a collection, _gc_prev is temporary used for gc_refs, and the gc list
194is singly linked until _gc_prev is restored.
Tim Peters6fc13d92002-07-02 18:12:35 +0000195
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900196gc_refs
Tim Peters6fc13d92002-07-02 18:12:35 +0000197 At the start of a collection, update_refs() copies the true refcount
198 to gc_refs, for each object in the generation being collected.
199 subtract_refs() then adjusts gc_refs so that it equals the number of
200 times an object is referenced directly from outside the generation
201 being collected.
Tim Peters6fc13d92002-07-02 18:12:35 +0000202
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900203PREV_MASK_COLLECTING
204 Objects in generation being collected are marked PREV_MASK_COLLECTING in
205 update_refs().
206
207
208_gc_next values
209---------------
210
211_gc_next takes these values:
212
2130
214 The object is not tracked
215
216!= 0
217 Pointer to the next object in the GC list.
218 Additionally, lowest bit is used temporary for
219 NEXT_MASK_UNREACHABLE flag described below.
220
221NEXT_MASK_UNREACHABLE
Tim Peters6fc13d92002-07-02 18:12:35 +0000222 move_unreachable() then moves objects not reachable (whether directly or
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900223 indirectly) from outside the generation into an "unreachable" set and
224 set this flag.
Tim Peters6fc13d92002-07-02 18:12:35 +0000225
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900226 Objects that are found to be reachable have gc_refs set to 1.
227 When this flag is set for the reachable object, the object must be in
228 "unreachable" set.
229 The flag is unset and the object is moved back to "reachable" set.
230
231 move_legacy_finalizers() will remove this flag from "unreachable" set.
Tim Peters6fc13d92002-07-02 18:12:35 +0000232*/
Neil Schemenauera2b11ec2002-05-21 15:53:24 +0000233
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000234/*** list functions ***/
235
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900236static inline void
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000237gc_list_init(PyGC_Head *list)
238{
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900239 // List header must not have flags.
240 // We can assign pointer by simple cast.
241 list->_gc_prev = (uintptr_t)list;
242 list->_gc_next = (uintptr_t)list;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000243}
244
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900245static inline int
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000246gc_list_is_empty(PyGC_Head *list)
247{
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900248 return (list->_gc_next == (uintptr_t)list);
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000249}
250
Tim Peterse2d59182004-11-01 01:39:08 +0000251/* Append `node` to `list`. */
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900252static inline void
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000253gc_list_append(PyGC_Head *node, PyGC_Head *list)
254{
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900255 PyGC_Head *last = (PyGC_Head *)list->_gc_prev;
256
257 // last <-> node
258 _PyGCHead_SET_PREV(node, last);
259 _PyGCHead_SET_NEXT(last, node);
260
261 // node <-> list
262 _PyGCHead_SET_NEXT(node, list);
263 list->_gc_prev = (uintptr_t)node;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000264}
265
Tim Peterse2d59182004-11-01 01:39:08 +0000266/* Remove `node` from the gc list it's currently in. */
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900267static inline void
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000268gc_list_remove(PyGC_Head *node)
269{
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900270 PyGC_Head *prev = GC_PREV(node);
271 PyGC_Head *next = GC_NEXT(node);
272
273 _PyGCHead_SET_NEXT(prev, next);
274 _PyGCHead_SET_PREV(next, prev);
275
276 node->_gc_next = 0; /* object is not currently tracked */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000277}
278
Tim Peterse2d59182004-11-01 01:39:08 +0000279/* Move `node` from the gc list it's currently in (which is not explicitly
280 * named here) to the end of `list`. This is semantically the same as
281 * gc_list_remove(node) followed by gc_list_append(node, list).
282 */
283static void
284gc_list_move(PyGC_Head *node, PyGC_Head *list)
285{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000286 /* Unlink from current list. */
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900287 PyGC_Head *from_prev = GC_PREV(node);
288 PyGC_Head *from_next = GC_NEXT(node);
289 _PyGCHead_SET_NEXT(from_prev, from_next);
290 _PyGCHead_SET_PREV(from_next, from_prev);
291
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000292 /* Relink at end of new list. */
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900293 // list must not have flags. So we can skip macros.
294 PyGC_Head *to_prev = (PyGC_Head*)list->_gc_prev;
295 _PyGCHead_SET_PREV(node, to_prev);
296 _PyGCHead_SET_NEXT(to_prev, node);
297 list->_gc_prev = (uintptr_t)node;
298 _PyGCHead_SET_NEXT(node, list);
Tim Peterse2d59182004-11-01 01:39:08 +0000299}
300
301/* append list `from` onto list `to`; `from` becomes an empty list */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000302static void
303gc_list_merge(PyGC_Head *from, PyGC_Head *to)
304{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000305 assert(from != to);
306 if (!gc_list_is_empty(from)) {
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900307 PyGC_Head *to_tail = GC_PREV(to);
308 PyGC_Head *from_head = GC_NEXT(from);
309 PyGC_Head *from_tail = GC_PREV(from);
310 assert(from_head != from);
311 assert(from_tail != from);
312
313 _PyGCHead_SET_NEXT(to_tail, from_head);
314 _PyGCHead_SET_PREV(from_head, to_tail);
315
316 _PyGCHead_SET_NEXT(from_tail, to);
317 _PyGCHead_SET_PREV(to, from_tail);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000318 }
319 gc_list_init(from);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000320}
321
Neal Norwitz7b216c52006-03-04 20:01:53 +0000322static Py_ssize_t
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000323gc_list_size(PyGC_Head *list)
324{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000325 PyGC_Head *gc;
326 Py_ssize_t n = 0;
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900327 for (gc = GC_NEXT(list); gc != list; gc = GC_NEXT(gc)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000328 n++;
329 }
330 return n;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000331}
332
Pablo Galindo466326d2019-10-13 16:48:59 +0100333/* Walk the list and mark all objects as non-collecting */
334static inline void
335gc_list_clear_collecting(PyGC_Head *collectable)
336{
337 PyGC_Head *gc;
338 for (gc = GC_NEXT(collectable); gc != collectable; gc = GC_NEXT(gc)) {
339 gc_clear_collecting(gc);
340 }
341}
342
Tim Peters259272b2003-04-06 19:41:39 +0000343/* Append objects in a GC list to a Python list.
Pablo Galindo466326d2019-10-13 16:48:59 +0100344 * Return 0 if all OK, < 0 if error (out of memory for list)
Tim Peters259272b2003-04-06 19:41:39 +0000345 */
346static int
347append_objects(PyObject *py_list, PyGC_Head *gc_list)
348{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000349 PyGC_Head *gc;
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900350 for (gc = GC_NEXT(gc_list); gc != gc_list; gc = GC_NEXT(gc)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000351 PyObject *op = FROM_GC(gc);
352 if (op != py_list) {
353 if (PyList_Append(py_list, op)) {
354 return -1; /* exception */
355 }
356 }
357 }
358 return 0;
Tim Peters259272b2003-04-06 19:41:39 +0000359}
360
Tim Petersea55c512019-10-18 20:59:14 -0500361// Constants for validate_list's flags argument.
362enum flagstates {collecting_clear_unreachable_clear,
363 collecting_clear_unreachable_set,
364 collecting_set_unreachable_clear,
365 collecting_set_unreachable_set};
366
Pablo Galindo320dd502019-10-10 22:45:17 +0100367#ifdef GC_DEBUG
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900368// validate_list checks list consistency. And it works as document
Tim Peters95bfc8a2019-10-13 16:47:04 -0500369// describing when flags are expected to be set / unset.
370// `head` must be a doubly-linked gc list, although it's fine (expected!) if
371// the prev and next pointers are "polluted" with flags.
372// What's checked:
373// - The `head` pointers are not polluted.
Tim Petersea55c512019-10-18 20:59:14 -0500374// - The objects' PREV_MASK_COLLECTING and NEXT_MASK_UNREACHABLE flags are all
375// `set or clear, as specified by the 'flags' argument.
Tim Peters95bfc8a2019-10-13 16:47:04 -0500376// - The prev and next pointers are mutually consistent.
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900377static void
Tim Petersea55c512019-10-18 20:59:14 -0500378validate_list(PyGC_Head *head, enum flagstates flags)
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900379{
Tim Peters95bfc8a2019-10-13 16:47:04 -0500380 assert((head->_gc_prev & PREV_MASK_COLLECTING) == 0);
381 assert((head->_gc_next & NEXT_MASK_UNREACHABLE) == 0);
Tim Petersea55c512019-10-18 20:59:14 -0500382 uintptr_t prev_value = 0, next_value = 0;
383 switch (flags) {
384 case collecting_clear_unreachable_clear:
385 break;
386 case collecting_set_unreachable_clear:
387 prev_value = PREV_MASK_COLLECTING;
388 break;
389 case collecting_clear_unreachable_set:
390 next_value = NEXT_MASK_UNREACHABLE;
391 break;
392 case collecting_set_unreachable_set:
393 prev_value = PREV_MASK_COLLECTING;
394 next_value = NEXT_MASK_UNREACHABLE;
395 break;
396 default:
397 assert(! "bad internal flags argument");
398 }
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900399 PyGC_Head *prev = head;
400 PyGC_Head *gc = GC_NEXT(head);
401 while (gc != head) {
Tim Peters95bfc8a2019-10-13 16:47:04 -0500402 PyGC_Head *trueprev = GC_PREV(gc);
403 PyGC_Head *truenext = (PyGC_Head *)(gc->_gc_next & ~NEXT_MASK_UNREACHABLE);
404 assert(truenext != NULL);
405 assert(trueprev == prev);
406 assert((gc->_gc_prev & PREV_MASK_COLLECTING) == prev_value);
407 assert((gc->_gc_next & NEXT_MASK_UNREACHABLE) == next_value);
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900408 prev = gc;
Tim Peters95bfc8a2019-10-13 16:47:04 -0500409 gc = truenext;
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900410 }
411 assert(prev == GC_PREV(head));
412}
413#else
Tim Petersea55c512019-10-18 20:59:14 -0500414#define validate_list(x, y) do{}while(0)
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900415#endif
416
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000417/*** end of list stuff ***/
418
419
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900420/* Set all gc_refs = ob_refcnt. After this, gc_refs is > 0 and
421 * PREV_MASK_COLLECTING bit is set for all objects in containers.
Tim Peters88396172002-06-30 17:56:40 +0000422 */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000423static void
424update_refs(PyGC_Head *containers)
425{
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900426 PyGC_Head *gc = GC_NEXT(containers);
427 for (; gc != containers; gc = GC_NEXT(gc)) {
428 gc_reset_refs(gc, Py_REFCNT(FROM_GC(gc)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000429 /* Python's cyclic gc should never see an incoming refcount
430 * of 0: if something decref'ed to 0, it should have been
431 * deallocated immediately at that time.
432 * Possible cause (if the assert triggers): a tp_dealloc
433 * routine left a gc-aware object tracked during its teardown
434 * phase, and did something-- or allowed something to happen --
435 * that called back into Python. gc can trigger then, and may
436 * see the still-tracked dying object. Before this assert
437 * was added, such mistakes went on to allow gc to try to
438 * delete the object again. In a debug build, that caused
439 * a mysterious segfault, when _Py_ForgetReference tried
440 * to remove the object from the doubly-linked list of all
441 * objects a second time. In a release build, an actual
442 * double deallocation occurred, which leads to corruption
443 * of the allocator's internal bookkeeping pointers. That's
444 * so serious that maybe this should be a release-build
445 * check instead of an assert?
446 */
Victor Stinnera4b2bc72018-10-26 18:00:13 +0200447 _PyObject_ASSERT(FROM_GC(gc), gc_get_refs(gc) != 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000448 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000449}
450
Tim Peters19b74c72002-07-01 03:52:19 +0000451/* A traversal callback for subtract_refs. */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000452static int
Victor Stinner4d5f94b2019-10-08 02:37:38 +0200453visit_decref(PyObject *op, void *parent)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000454{
Victor Stinner4d5f94b2019-10-08 02:37:38 +0200455 _PyObject_ASSERT(_PyObject_CAST(parent), !_PyObject_IsFreed(op));
Victor Stinnerd91d4de2019-09-09 17:44:59 +0200456
Hai Shi675d9a32020-04-15 02:11:20 +0800457 if (_PyObject_IS_GC(op)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000458 PyGC_Head *gc = AS_GC(op);
459 /* We're only interested in gc_refs for objects in the
460 * generation being collected, which can be recognized
461 * because only they have positive gc_refs.
462 */
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900463 if (gc_is_collecting(gc)) {
464 gc_decref(gc);
465 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000466 }
467 return 0;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000468}
469
Tim Peters19b74c72002-07-01 03:52:19 +0000470/* Subtract internal references from gc_refs. After this, gc_refs is >= 0
471 * for all objects in containers, and is GC_REACHABLE for all tracked gc
472 * objects not in containers. The ones with gc_refs > 0 are directly
473 * reachable from outside containers, and so can't be collected.
474 */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000475static void
476subtract_refs(PyGC_Head *containers)
477{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000478 traverseproc traverse;
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900479 PyGC_Head *gc = GC_NEXT(containers);
480 for (; gc != containers; gc = GC_NEXT(gc)) {
Victor Stinner4d5f94b2019-10-08 02:37:38 +0200481 PyObject *op = FROM_GC(gc);
482 traverse = Py_TYPE(op)->tp_traverse;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000483 (void) traverse(FROM_GC(gc),
484 (visitproc)visit_decref,
Victor Stinner4d5f94b2019-10-08 02:37:38 +0200485 op);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000486 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000487}
488
Tim Peters19b74c72002-07-01 03:52:19 +0000489/* A traversal callback for move_unreachable. */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000490static int
Tim Peters19b74c72002-07-01 03:52:19 +0000491visit_reachable(PyObject *op, PyGC_Head *reachable)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000492{
Hai Shi675d9a32020-04-15 02:11:20 +0800493 if (!_PyObject_IS_GC(op)) {
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900494 return 0;
495 }
Tim Peters19b74c72002-07-01 03:52:19 +0000496
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900497 PyGC_Head *gc = AS_GC(op);
498 const Py_ssize_t gc_refs = gc_get_refs(gc);
499
Tim Peters1e739452019-10-21 11:21:35 -0500500 // Ignore objects in other generation.
Tim Peters95bfc8a2019-10-13 16:47:04 -0500501 // This also skips objects "to the left" of the current position in
502 // move_unreachable's scan of the 'young' list - they've already been
503 // traversed, and no longer have the PREV_MASK_COLLECTING flag.
Tim Peters1e739452019-10-21 11:21:35 -0500504 if (! gc_is_collecting(gc)) {
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900505 return 0;
506 }
Tim Peters1e739452019-10-21 11:21:35 -0500507 // It would be a logic error elsewhere if the collecting flag were set on
508 // an untracked object.
509 assert(gc->_gc_next != 0);
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900510
511 if (gc->_gc_next & NEXT_MASK_UNREACHABLE) {
512 /* This had gc_refs = 0 when move_unreachable got
513 * to it, but turns out it's reachable after all.
514 * Move it back to move_unreachable's 'young' list,
515 * and move_unreachable will eventually get to it
516 * again.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000517 */
Tim Peters95bfc8a2019-10-13 16:47:04 -0500518 // Manually unlink gc from unreachable list because the list functions
519 // don't work right in the presence of NEXT_MASK_UNREACHABLE flags.
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900520 PyGC_Head *prev = GC_PREV(gc);
521 PyGC_Head *next = (PyGC_Head*)(gc->_gc_next & ~NEXT_MASK_UNREACHABLE);
Victor Stinnera4b2bc72018-10-26 18:00:13 +0200522 _PyObject_ASSERT(FROM_GC(prev),
523 prev->_gc_next & NEXT_MASK_UNREACHABLE);
524 _PyObject_ASSERT(FROM_GC(next),
525 next->_gc_next & NEXT_MASK_UNREACHABLE);
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900526 prev->_gc_next = gc->_gc_next; // copy NEXT_MASK_UNREACHABLE
527 _PyGCHead_SET_PREV(next, prev);
528
529 gc_list_append(gc, reachable);
530 gc_set_refs(gc, 1);
531 }
532 else if (gc_refs == 0) {
533 /* This is in move_unreachable's 'young' list, but
534 * the traversal hasn't yet gotten to it. All
535 * we need to do is tell move_unreachable that it's
536 * reachable.
537 */
538 gc_set_refs(gc, 1);
539 }
540 /* Else there's nothing to do.
541 * If gc_refs > 0, it must be in move_unreachable's 'young'
542 * list, and move_unreachable will eventually get to it.
543 */
544 else {
Victor Stinnera4b2bc72018-10-26 18:00:13 +0200545 _PyObject_ASSERT_WITH_MSG(op, gc_refs > 0, "refcount is too small");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000546 }
547 return 0;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000548}
549
Tim Peters19b74c72002-07-01 03:52:19 +0000550/* Move the unreachable objects from young to unreachable. After this,
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900551 * all objects in young don't have PREV_MASK_COLLECTING flag and
552 * unreachable have the flag.
Tim Peters19b74c72002-07-01 03:52:19 +0000553 * All objects in young after this are directly or indirectly reachable
554 * from outside the original young; and all objects in unreachable are
555 * not.
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900556 *
557 * This function restores _gc_prev pointer. young and unreachable are
558 * doubly linked list after this function.
559 * But _gc_next in unreachable list has NEXT_MASK_UNREACHABLE flag.
560 * So we can not gc_list_* functions for unreachable until we remove the flag.
Tim Peters88396172002-06-30 17:56:40 +0000561 */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000562static void
Tim Peters19b74c72002-07-01 03:52:19 +0000563move_unreachable(PyGC_Head *young, PyGC_Head *unreachable)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000564{
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900565 // previous elem in the young list, used for restore gc_prev.
566 PyGC_Head *prev = young;
567 PyGC_Head *gc = GC_NEXT(young);
Tim Peters19b74c72002-07-01 03:52:19 +0000568
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900569 /* Invariants: all objects "to the left" of us in young are reachable
570 * (directly or indirectly) from outside the young list as it was at entry.
571 *
572 * All other objects from the original young "to the left" of us are in
573 * unreachable now, and have NEXT_MASK_UNREACHABLE. All objects to the
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000574 * left of us in 'young' now have been scanned, and no objects here
575 * or to the right have been scanned yet.
576 */
Tim Peters19b74c72002-07-01 03:52:19 +0000577
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000578 while (gc != young) {
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900579 if (gc_get_refs(gc)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000580 /* gc is definitely reachable from outside the
581 * original 'young'. Mark it as such, and traverse
582 * its pointers to find any other objects that may
583 * be directly reachable from it. Note that the
584 * call to tp_traverse may append objects to young,
585 * so we have to wait until it returns to determine
586 * the next object to visit.
587 */
588 PyObject *op = FROM_GC(gc);
589 traverseproc traverse = Py_TYPE(op)->tp_traverse;
Victor Stinnera4b2bc72018-10-26 18:00:13 +0200590 _PyObject_ASSERT_WITH_MSG(op, gc_get_refs(gc) > 0,
591 "refcount is too small");
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900592 // NOTE: visit_reachable may change gc->_gc_next when
593 // young->_gc_prev == gc. Don't do gc = GC_NEXT(gc) before!
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000594 (void) traverse(op,
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900595 (visitproc)visit_reachable,
596 (void *)young);
597 // relink gc_prev to prev element.
598 _PyGCHead_SET_PREV(gc, prev);
Quan Tian3bd0d622018-10-20 05:30:03 +0800599 // gc is not COLLECTING state after here.
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900600 gc_clear_collecting(gc);
601 prev = gc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000602 }
603 else {
604 /* This *may* be unreachable. To make progress,
605 * assume it is. gc isn't directly reachable from
606 * any object we've already traversed, but may be
607 * reachable from an object we haven't gotten to yet.
608 * visit_reachable will eventually move gc back into
609 * young if that's so, and we'll see it again.
610 */
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900611 // Move gc to unreachable.
612 // No need to gc->next->prev = prev because it is single linked.
613 prev->_gc_next = gc->_gc_next;
614
615 // We can't use gc_list_append() here because we use
616 // NEXT_MASK_UNREACHABLE here.
617 PyGC_Head *last = GC_PREV(unreachable);
618 // NOTE: Since all objects in unreachable set has
619 // NEXT_MASK_UNREACHABLE flag, we set it unconditionally.
Tim Peters95bfc8a2019-10-13 16:47:04 -0500620 // But this may pollute the unreachable list head's 'next' pointer
621 // too. That's semantically senseless but expedient here - the
Pablo Galindo97f12672020-01-13 12:25:05 +0000622 // damage is repaired when this function ends.
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900623 last->_gc_next = (NEXT_MASK_UNREACHABLE | (uintptr_t)gc);
624 _PyGCHead_SET_PREV(gc, last);
625 gc->_gc_next = (NEXT_MASK_UNREACHABLE | (uintptr_t)unreachable);
626 unreachable->_gc_prev = (uintptr_t)gc;
627 }
628 gc = (PyGC_Head*)prev->_gc_next;
629 }
630 // young->_gc_prev must be last element remained in the list.
631 young->_gc_prev = (uintptr_t)prev;
Tim Peters95bfc8a2019-10-13 16:47:04 -0500632 // don't let the pollution of the list head's next pointer leak
633 unreachable->_gc_next &= ~NEXT_MASK_UNREACHABLE;
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900634}
635
636static void
637untrack_tuples(PyGC_Head *head)
638{
639 PyGC_Head *next, *gc = GC_NEXT(head);
640 while (gc != head) {
641 PyObject *op = FROM_GC(gc);
642 next = GC_NEXT(gc);
643 if (PyTuple_CheckExact(op)) {
644 _PyTuple_MaybeUntrack(op);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 }
646 gc = next;
647 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000648}
649
Antoine Pitroue1ad3da2012-05-28 22:22:34 +0200650/* Try to untrack all currently tracked dictionaries */
651static void
652untrack_dicts(PyGC_Head *head)
653{
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900654 PyGC_Head *next, *gc = GC_NEXT(head);
Antoine Pitroue1ad3da2012-05-28 22:22:34 +0200655 while (gc != head) {
656 PyObject *op = FROM_GC(gc);
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900657 next = GC_NEXT(gc);
658 if (PyDict_CheckExact(op)) {
Antoine Pitroue1ad3da2012-05-28 22:22:34 +0200659 _PyDict_MaybeUntrack(op);
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900660 }
Antoine Pitroue1ad3da2012-05-28 22:22:34 +0200661 gc = next;
662 }
663}
664
Antoine Pitrou796564c2013-07-30 19:59:21 +0200665/* Return true if object has a pre-PEP 442 finalization method. */
Neil Schemenauera765c122001-11-01 17:35:23 +0000666static int
Antoine Pitrou796564c2013-07-30 19:59:21 +0200667has_legacy_finalizer(PyObject *op)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000668{
Victor Stinnerdaa97562020-02-07 03:37:06 +0100669 return Py_TYPE(op)->tp_del != NULL;
Neil Schemenauera765c122001-11-01 17:35:23 +0000670}
671
Antoine Pitrou796564c2013-07-30 19:59:21 +0200672/* Move the objects in unreachable with tp_del slots into `finalizers`.
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900673 *
674 * This function also removes NEXT_MASK_UNREACHABLE flag
675 * from _gc_next in unreachable.
Jeremy Hyltonce136e92003-04-04 19:59:06 +0000676 */
Neil Schemenauera765c122001-11-01 17:35:23 +0000677static void
Antoine Pitrou796564c2013-07-30 19:59:21 +0200678move_legacy_finalizers(PyGC_Head *unreachable, PyGC_Head *finalizers)
Neil Schemenauera765c122001-11-01 17:35:23 +0000679{
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900680 PyGC_Head *gc, *next;
Tim Peters95bfc8a2019-10-13 16:47:04 -0500681 assert((unreachable->_gc_next & NEXT_MASK_UNREACHABLE) == 0);
Tim Petersf6b80452003-04-07 19:21:15 +0000682
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000683 /* March over unreachable. Move objects with finalizers into
684 * `finalizers`.
685 */
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900686 for (gc = GC_NEXT(unreachable); gc != unreachable; gc = next) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000687 PyObject *op = FROM_GC(gc);
Jeremy Hyltonce136e92003-04-04 19:59:06 +0000688
Victor Stinnera4b2bc72018-10-26 18:00:13 +0200689 _PyObject_ASSERT(op, gc->_gc_next & NEXT_MASK_UNREACHABLE);
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900690 gc->_gc_next &= ~NEXT_MASK_UNREACHABLE;
691 next = (PyGC_Head*)gc->_gc_next;
Tim Petersf6ae7a42003-04-05 18:40:50 +0000692
Antoine Pitrou796564c2013-07-30 19:59:21 +0200693 if (has_legacy_finalizer(op)) {
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900694 gc_clear_collecting(gc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000695 gc_list_move(gc, finalizers);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000696 }
697 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000698}
699
Pablo Galindo466326d2019-10-13 16:48:59 +0100700static inline void
701clear_unreachable_mask(PyGC_Head *unreachable)
702{
703 /* Check that the list head does not have the unreachable bit set */
704 assert(((uintptr_t)unreachable & NEXT_MASK_UNREACHABLE) == 0);
705
706 PyGC_Head *gc, *next;
Tim Peters95bfc8a2019-10-13 16:47:04 -0500707 assert((unreachable->_gc_next & NEXT_MASK_UNREACHABLE) == 0);
Pablo Galindo466326d2019-10-13 16:48:59 +0100708 for (gc = GC_NEXT(unreachable); gc != unreachable; gc = next) {
709 _PyObject_ASSERT((PyObject*)FROM_GC(gc), gc->_gc_next & NEXT_MASK_UNREACHABLE);
710 gc->_gc_next &= ~NEXT_MASK_UNREACHABLE;
711 next = (PyGC_Head*)gc->_gc_next;
712 }
Tim Petersea55c512019-10-18 20:59:14 -0500713 validate_list(unreachable, collecting_set_unreachable_clear);
Pablo Galindo466326d2019-10-13 16:48:59 +0100714}
715
Antoine Pitrou796564c2013-07-30 19:59:21 +0200716/* A traversal callback for move_legacy_finalizer_reachable. */
Tim Peters19b74c72002-07-01 03:52:19 +0000717static int
718visit_move(PyObject *op, PyGC_Head *tolist)
719{
Hai Shi675d9a32020-04-15 02:11:20 +0800720 if (_PyObject_IS_GC(op)) {
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900721 PyGC_Head *gc = AS_GC(op);
722 if (gc_is_collecting(gc)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000723 gc_list_move(gc, tolist);
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900724 gc_clear_collecting(gc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000725 }
726 }
727 return 0;
Tim Peters19b74c72002-07-01 03:52:19 +0000728}
729
730/* Move objects that are reachable from finalizers, from the unreachable set
Tim Petersf6b80452003-04-07 19:21:15 +0000731 * into finalizers set.
Tim Peters19b74c72002-07-01 03:52:19 +0000732 */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000733static void
Antoine Pitrou796564c2013-07-30 19:59:21 +0200734move_legacy_finalizer_reachable(PyGC_Head *finalizers)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000735{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000736 traverseproc traverse;
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900737 PyGC_Head *gc = GC_NEXT(finalizers);
738 for (; gc != finalizers; gc = GC_NEXT(gc)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000739 /* Note that the finalizers list may grow during this. */
740 traverse = Py_TYPE(FROM_GC(gc))->tp_traverse;
741 (void) traverse(FROM_GC(gc),
742 (visitproc)visit_move,
743 (void *)finalizers);
744 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000745}
746
Tim Petersead8b7a2004-10-30 23:09:22 +0000747/* Clear all weakrefs to unreachable objects, and if such a weakref has a
748 * callback, invoke it if necessary. Note that it's possible for such
749 * weakrefs to be outside the unreachable set -- indeed, those are precisely
750 * the weakrefs whose callbacks must be invoked. See gc_weakref.txt for
751 * overview & some details. Some weakrefs with callbacks may be reclaimed
752 * directly by this routine; the number reclaimed is the return value. Other
753 * weakrefs with callbacks may be moved into the `old` generation. Objects
754 * moved into `old` have gc_refs set to GC_REACHABLE; the objects remaining in
755 * unreachable are left at GC_TENTATIVELY_UNREACHABLE. When this returns,
756 * no object in `unreachable` is weakly referenced anymore.
Tim Peters403a2032003-11-20 21:21:46 +0000757 */
758static int
Tim Petersead8b7a2004-10-30 23:09:22 +0000759handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
Tim Peters403a2032003-11-20 21:21:46 +0000760{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000761 PyGC_Head *gc;
762 PyObject *op; /* generally FROM_GC(gc) */
763 PyWeakReference *wr; /* generally a cast of op */
764 PyGC_Head wrcb_to_call; /* weakrefs with callbacks to call */
765 PyGC_Head *next;
766 int num_freed = 0;
Tim Peters403a2032003-11-20 21:21:46 +0000767
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000768 gc_list_init(&wrcb_to_call);
Tim Peters403a2032003-11-20 21:21:46 +0000769
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000770 /* Clear all weakrefs to the objects in unreachable. If such a weakref
771 * also has a callback, move it into `wrcb_to_call` if the callback
772 * needs to be invoked. Note that we cannot invoke any callbacks until
773 * all weakrefs to unreachable objects are cleared, lest the callback
774 * resurrect an unreachable object via a still-active weakref. We
775 * make another pass over wrcb_to_call, invoking callbacks, after this
776 * pass completes.
777 */
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900778 for (gc = GC_NEXT(unreachable); gc != unreachable; gc = next) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000779 PyWeakReference **wrlist;
Tim Petersead8b7a2004-10-30 23:09:22 +0000780
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000781 op = FROM_GC(gc);
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900782 next = GC_NEXT(gc);
Tim Petersead8b7a2004-10-30 23:09:22 +0000783
Neil Schemenauerbcda4602019-09-30 10:06:45 -0700784 if (PyWeakref_Check(op)) {
785 /* A weakref inside the unreachable set must be cleared. If we
786 * allow its callback to execute inside delete_garbage(), it
787 * could expose objects that have tp_clear already called on
788 * them. Or, it could resurrect unreachable objects. One way
789 * this can happen is if some container objects do not implement
790 * tp_traverse. Then, wr_object can be outside the unreachable
791 * set but can be deallocated as a result of breaking the
792 * reference cycle. If we don't clear the weakref, the callback
793 * will run and potentially cause a crash. See bpo-38006 for
794 * one example.
795 */
796 _PyWeakref_ClearRef((PyWeakReference *)op);
797 }
798
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000799 if (! PyType_SUPPORTS_WEAKREFS(Py_TYPE(op)))
800 continue;
Tim Petersead8b7a2004-10-30 23:09:22 +0000801
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000802 /* It supports weakrefs. Does it have any? */
803 wrlist = (PyWeakReference **)
Victor Stinner38aefc52020-04-06 14:07:02 +0200804 _PyObject_GET_WEAKREFS_LISTPTR(op);
Tim Petersead8b7a2004-10-30 23:09:22 +0000805
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000806 /* `op` may have some weakrefs. March over the list, clear
807 * all the weakrefs, and move the weakrefs with callbacks
808 * that must be called into wrcb_to_call.
809 */
810 for (wr = *wrlist; wr != NULL; wr = *wrlist) {
811 PyGC_Head *wrasgc; /* AS_GC(wr) */
Tim Petersead8b7a2004-10-30 23:09:22 +0000812
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000813 /* _PyWeakref_ClearRef clears the weakref but leaves
814 * the callback pointer intact. Obscure: it also
815 * changes *wrlist.
816 */
Victor Stinnera4b2bc72018-10-26 18:00:13 +0200817 _PyObject_ASSERT((PyObject *)wr, wr->wr_object == op);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000818 _PyWeakref_ClearRef(wr);
Victor Stinnera4b2bc72018-10-26 18:00:13 +0200819 _PyObject_ASSERT((PyObject *)wr, wr->wr_object == Py_None);
820 if (wr->wr_callback == NULL) {
821 /* no callback */
822 continue;
823 }
Tim Petersead8b7a2004-10-30 23:09:22 +0000824
Victor Stinnera4b2bc72018-10-26 18:00:13 +0200825 /* Headache time. `op` is going away, and is weakly referenced by
826 * `wr`, which has a callback. Should the callback be invoked? If wr
827 * is also trash, no:
828 *
829 * 1. There's no need to call it. The object and the weakref are
830 * both going away, so it's legitimate to pretend the weakref is
831 * going away first. The user has to ensure a weakref outlives its
832 * referent if they want a guarantee that the wr callback will get
833 * invoked.
834 *
835 * 2. It may be catastrophic to call it. If the callback is also in
836 * cyclic trash (CT), then although the CT is unreachable from
837 * outside the current generation, CT may be reachable from the
838 * callback. Then the callback could resurrect insane objects.
839 *
840 * Since the callback is never needed and may be unsafe in this case,
841 * wr is simply left in the unreachable set. Note that because we
842 * already called _PyWeakref_ClearRef(wr), its callback will never
843 * trigger.
844 *
845 * OTOH, if wr isn't part of CT, we should invoke the callback: the
846 * weakref outlived the trash. Note that since wr isn't CT in this
847 * case, its callback can't be CT either -- wr acted as an external
848 * root to this generation, and therefore its callback did too. So
849 * nothing in CT is reachable from the callback either, so it's hard
850 * to imagine how calling it later could create a problem for us. wr
851 * is moved to wrcb_to_call in this case.
852 */
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900853 if (gc_is_collecting(AS_GC(wr))) {
Neil Schemenauerbcda4602019-09-30 10:06:45 -0700854 /* it should already have been cleared above */
855 assert(wr->wr_object == Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000856 continue;
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900857 }
Tim Peterscc2a8662004-10-31 22:12:43 +0000858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000859 /* Create a new reference so that wr can't go away
860 * before we can process it again.
861 */
862 Py_INCREF(wr);
Tim Petersead8b7a2004-10-30 23:09:22 +0000863
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000864 /* Move wr to wrcb_to_call, for the next pass. */
865 wrasgc = AS_GC(wr);
866 assert(wrasgc != next); /* wrasgc is reachable, but
867 next isn't, so they can't
868 be the same */
869 gc_list_move(wrasgc, &wrcb_to_call);
870 }
871 }
Tim Petersead8b7a2004-10-30 23:09:22 +0000872
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000873 /* Invoke the callbacks we decided to honor. It's safe to invoke them
874 * because they can't reference unreachable objects.
875 */
876 while (! gc_list_is_empty(&wrcb_to_call)) {
877 PyObject *temp;
878 PyObject *callback;
Tim Petersead8b7a2004-10-30 23:09:22 +0000879
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900880 gc = (PyGC_Head*)wrcb_to_call._gc_next;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000881 op = FROM_GC(gc);
Victor Stinnera4b2bc72018-10-26 18:00:13 +0200882 _PyObject_ASSERT(op, PyWeakref_Check(op));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 wr = (PyWeakReference *)op;
884 callback = wr->wr_callback;
Victor Stinnera4b2bc72018-10-26 18:00:13 +0200885 _PyObject_ASSERT(op, callback != NULL);
Tim Petersead8b7a2004-10-30 23:09:22 +0000886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000887 /* copy-paste of weakrefobject.c's handle_callback() */
Petr Viktorinffd97532020-02-11 17:46:57 +0100888 temp = PyObject_CallOneArg(callback, (PyObject *)wr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000889 if (temp == NULL)
890 PyErr_WriteUnraisable(callback);
891 else
892 Py_DECREF(temp);
Tim Petersead8b7a2004-10-30 23:09:22 +0000893
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000894 /* Give up the reference we created in the first pass. When
895 * op's refcount hits 0 (which it may or may not do right now),
896 * op's tp_dealloc will decref op->wr_callback too. Note
897 * that the refcount probably will hit 0 now, and because this
898 * weakref was reachable to begin with, gc didn't already
899 * add it to its count of freed objects. Example: a reachable
900 * weak value dict maps some key to this reachable weakref.
901 * The callback removes this key->weakref mapping from the
902 * dict, leaving no other references to the weakref (excepting
903 * ours).
904 */
905 Py_DECREF(op);
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900906 if (wrcb_to_call._gc_next == (uintptr_t)gc) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000907 /* object is still alive -- move it */
908 gc_list_move(gc, old);
909 }
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900910 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000911 ++num_freed;
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900912 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000913 }
Tim Petersead8b7a2004-10-30 23:09:22 +0000914
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000915 return num_freed;
Tim Peters403a2032003-11-20 21:21:46 +0000916}
917
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000918static void
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200919debug_cycle(const char *msg, PyObject *op)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000920{
Victor Stinner499dfcf2011-03-21 13:26:24 +0100921 PySys_FormatStderr("gc: %s <%s %p>\n",
922 msg, Py_TYPE(op)->tp_name, op);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000923}
924
Antoine Pitrou796564c2013-07-30 19:59:21 +0200925/* Handle uncollectable garbage (cycles with tp_del slots, and stuff reachable
Tim Petersbf384c22003-04-06 00:11:39 +0000926 * only from such cycles).
Tim Petersf6b80452003-04-07 19:21:15 +0000927 * If DEBUG_SAVEALL, all objects in finalizers are appended to the module
928 * garbage list (a Python list), else only the objects in finalizers with
929 * __del__ methods are appended to garbage. All objects in finalizers are
930 * merged into the old list regardless.
Tim Petersbf384c22003-04-06 00:11:39 +0000931 */
Serhiy Storchaka301e3cc2018-05-24 15:19:29 +0300932static void
Victor Stinner2e969062019-11-20 01:49:32 +0100933handle_legacy_finalizers(PyThreadState *tstate,
Victor Stinner67e0de62019-11-20 11:48:18 +0100934 GCState *gcstate,
Victor Stinner9db03242019-04-26 02:32:01 +0200935 PyGC_Head *finalizers, PyGC_Head *old)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000936{
Victor Stinner2e969062019-11-20 01:49:32 +0100937 assert(!_PyErr_Occurred(tstate));
Victor Stinner67e0de62019-11-20 11:48:18 +0100938 assert(gcstate->garbage != NULL);
Victor Stinner9db03242019-04-26 02:32:01 +0200939
940 PyGC_Head *gc = GC_NEXT(finalizers);
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900941 for (; gc != finalizers; gc = GC_NEXT(gc)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000942 PyObject *op = FROM_GC(gc);
Tim Petersf6b80452003-04-07 19:21:15 +0000943
Victor Stinner67e0de62019-11-20 11:48:18 +0100944 if ((gcstate->debug & DEBUG_SAVEALL) || has_legacy_finalizer(op)) {
945 if (PyList_Append(gcstate->garbage, op) < 0) {
Victor Stinner2e969062019-11-20 01:49:32 +0100946 _PyErr_Clear(tstate);
Serhiy Storchaka301e3cc2018-05-24 15:19:29 +0300947 break;
Serhiy Storchakac4653c92018-05-29 18:50:10 +0300948 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000949 }
950 }
Tim Petersf6b80452003-04-07 19:21:15 +0000951
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000952 gc_list_merge(finalizers, old);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000953}
954
Tim Peters5fbc7b12014-05-08 17:42:19 -0500955/* Run first-time finalizers (if any) on all the objects in collectable.
956 * Note that this may remove some (or even all) of the objects from the
957 * list, due to refcounts falling to 0.
958 */
Antoine Pitrou796564c2013-07-30 19:59:21 +0200959static void
Victor Stinner67e0de62019-11-20 11:48:18 +0100960finalize_garbage(PyThreadState *tstate, PyGC_Head *collectable)
Antoine Pitrou796564c2013-07-30 19:59:21 +0200961{
962 destructor finalize;
Tim Peters5fbc7b12014-05-08 17:42:19 -0500963 PyGC_Head seen;
Antoine Pitrou796564c2013-07-30 19:59:21 +0200964
Tim Peters5fbc7b12014-05-08 17:42:19 -0500965 /* While we're going through the loop, `finalize(op)` may cause op, or
966 * other objects, to be reclaimed via refcounts falling to zero. So
967 * there's little we can rely on about the structure of the input
968 * `collectable` list across iterations. For safety, we always take the
969 * first object in that list and move it to a temporary `seen` list.
970 * If objects vanish from the `collectable` and `seen` lists we don't
971 * care.
972 */
973 gc_list_init(&seen);
974
975 while (!gc_list_is_empty(collectable)) {
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900976 PyGC_Head *gc = GC_NEXT(collectable);
Antoine Pitrou796564c2013-07-30 19:59:21 +0200977 PyObject *op = FROM_GC(gc);
Tim Peters5fbc7b12014-05-08 17:42:19 -0500978 gc_list_move(gc, &seen);
Antoine Pitrou796564c2013-07-30 19:59:21 +0200979 if (!_PyGCHead_FINALIZED(gc) &&
Tim Peters5fbc7b12014-05-08 17:42:19 -0500980 (finalize = Py_TYPE(op)->tp_finalize) != NULL) {
INADA Naoki5ac9e6e2018-07-10 17:19:53 +0900981 _PyGCHead_SET_FINALIZED(gc);
Antoine Pitrou796564c2013-07-30 19:59:21 +0200982 Py_INCREF(op);
983 finalize(op);
Victor Stinner67e0de62019-11-20 11:48:18 +0100984 assert(!_PyErr_Occurred(tstate));
Antoine Pitrou796564c2013-07-30 19:59:21 +0200985 Py_DECREF(op);
986 }
987 }
Tim Peters5fbc7b12014-05-08 17:42:19 -0500988 gc_list_merge(&seen, collectable);
Antoine Pitrou796564c2013-07-30 19:59:21 +0200989}
990
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000991/* Break reference cycles by clearing the containers involved. This is
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000992 * tricky business as the lists can be changing and we don't know which
Tim Peters19b74c72002-07-01 03:52:19 +0000993 * objects may be freed. It is possible I screwed something up here.
994 */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000995static void
Victor Stinner67e0de62019-11-20 11:48:18 +0100996delete_garbage(PyThreadState *tstate, GCState *gcstate,
Victor Stinner9db03242019-04-26 02:32:01 +0200997 PyGC_Head *collectable, PyGC_Head *old)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000998{
Victor Stinner2e969062019-11-20 01:49:32 +0100999 assert(!_PyErr_Occurred(tstate));
Victor Stinner9db03242019-04-26 02:32:01 +02001000
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001001 while (!gc_list_is_empty(collectable)) {
INADA Naoki5ac9e6e2018-07-10 17:19:53 +09001002 PyGC_Head *gc = GC_NEXT(collectable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001003 PyObject *op = FROM_GC(gc);
Tim Peters88396172002-06-30 17:56:40 +00001004
Victor Stinnera4b2bc72018-10-26 18:00:13 +02001005 _PyObject_ASSERT_WITH_MSG(op, Py_REFCNT(op) > 0,
1006 "refcount is too small");
INADA Naoki5ac9e6e2018-07-10 17:19:53 +09001007
Victor Stinner67e0de62019-11-20 11:48:18 +01001008 if (gcstate->debug & DEBUG_SAVEALL) {
1009 assert(gcstate->garbage != NULL);
1010 if (PyList_Append(gcstate->garbage, op) < 0) {
Victor Stinner2e969062019-11-20 01:49:32 +01001011 _PyErr_Clear(tstate);
Serhiy Storchakac4653c92018-05-29 18:50:10 +03001012 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001013 }
1014 else {
Victor Stinner9db03242019-04-26 02:32:01 +02001015 inquiry clear;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001016 if ((clear = Py_TYPE(op)->tp_clear) != NULL) {
1017 Py_INCREF(op);
Serhiy Storchakac4653c92018-05-29 18:50:10 +03001018 (void) clear(op);
Victor Stinner2e969062019-11-20 01:49:32 +01001019 if (_PyErr_Occurred(tstate)) {
Victor Stinner71c52e32019-05-27 08:57:14 +02001020 _PyErr_WriteUnraisableMsg("in tp_clear of",
1021 (PyObject*)Py_TYPE(op));
Serhiy Storchakac4653c92018-05-29 18:50:10 +03001022 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001023 Py_DECREF(op);
1024 }
1025 }
INADA Naoki5ac9e6e2018-07-10 17:19:53 +09001026 if (GC_NEXT(collectable) == gc) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001027 /* object is still alive, move it, it may die later */
Pablo Galindo466326d2019-10-13 16:48:59 +01001028 gc_clear_collecting(gc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001029 gc_list_move(gc, old);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001030 }
1031 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001032}
1033
Christian Heimesa156e092008-02-16 07:38:31 +00001034/* Clear all free lists
1035 * All free lists are cleared during the collection of the highest generation.
1036 * Allocated items in the free list may keep a pymalloc arena occupied.
1037 * Clearing the free lists may give back memory to the OS earlier.
1038 */
1039static void
Victor Stinnere005ead2020-06-05 02:56:37 +02001040clear_freelists(PyThreadState *tstate)
Christian Heimesa156e092008-02-16 07:38:31 +00001041{
Victor Stinner3744ed22020-06-05 01:39:24 +02001042 _PyFrame_ClearFreeList(tstate);
Victor Stinner69ac6e52020-06-04 23:38:36 +02001043 _PyTuple_ClearFreeList(tstate);
Victor Stinner2ba59372020-06-05 00:50:05 +02001044 _PyFloat_ClearFreeList(tstate);
Victor Stinner88ec9192020-06-05 02:05:41 +02001045 _PyList_ClearFreeList(tstate);
Victor Stinnerb4e85ca2020-06-23 11:33:18 +02001046 _PyDict_ClearFreeList(tstate);
Victor Stinner78a02c22020-06-05 02:34:14 +02001047 _PyAsyncGen_ClearFreeLists(tstate);
Victor Stinnere005ead2020-06-05 02:56:37 +02001048 _PyContext_ClearFreeList(tstate);
Christian Heimesa156e092008-02-16 07:38:31 +00001049}
1050
Pablo Galindo97f12672020-01-13 12:25:05 +00001051// Show stats for objects in each generations
Inada Naokibf8162c2019-08-02 16:25:29 +09001052static void
Victor Stinner67e0de62019-11-20 11:48:18 +01001053show_stats_each_generations(GCState *gcstate)
Inada Naokibf8162c2019-08-02 16:25:29 +09001054{
1055 char buf[100];
1056 size_t pos = 0;
1057
1058 for (int i = 0; i < NUM_GENERATIONS && pos < sizeof(buf); i++) {
1059 pos += PyOS_snprintf(buf+pos, sizeof(buf)-pos,
Victor Stinnerd36cf5f2020-06-10 18:38:05 +02001060 " %zd",
Victor Stinner67e0de62019-11-20 11:48:18 +01001061 gc_list_size(GEN_HEAD(gcstate, i)));
Inada Naokibf8162c2019-08-02 16:25:29 +09001062 }
1063
1064 PySys_FormatStderr(
1065 "gc: objects in each generation:%s\n"
1066 "gc: objects in permanent generation: %zd\n",
Victor Stinner67e0de62019-11-20 11:48:18 +01001067 buf, gc_list_size(&gcstate->permanent_generation.head));
Inada Naokibf8162c2019-08-02 16:25:29 +09001068}
1069
Pablo Galindo97f12672020-01-13 12:25:05 +00001070/* Deduce which objects among "base" are unreachable from outside the list
Pablo Galindo466326d2019-10-13 16:48:59 +01001071 and move them to 'unreachable'. The process consist in the following steps:
1072
10731. Copy all reference counts to a different field (gc_prev is used to hold
1074 this copy to save memory).
10752. Traverse all objects in "base" and visit all referred objects using
Pablo Galindo97f12672020-01-13 12:25:05 +00001076 "tp_traverse" and for every visited object, subtract 1 to the reference
Pablo Galindo466326d2019-10-13 16:48:59 +01001077 count (the one that we copied in the previous step). After this step, all
1078 objects that can be reached directly from outside must have strictly positive
1079 reference count, while all unreachable objects must have a count of exactly 0.
Pablo Galindo97f12672020-01-13 12:25:05 +000010803. Identify all unreachable objects (the ones with 0 reference count) and move
Pablo Galindo466326d2019-10-13 16:48:59 +01001081 them to the "unreachable" list. This step also needs to move back to "base" all
1082 objects that were initially marked as unreachable but are referred transitively
1083 by the reachable objects (the ones with strictly positive reference count).
1084
1085Contracts:
1086
1087 * The "base" has to be a valid list with no mask set.
1088
1089 * The "unreachable" list must be uninitialized (this function calls
1090 gc_list_init over 'unreachable').
Tim Peters95bfc8a2019-10-13 16:47:04 -05001091
Pablo Galindo466326d2019-10-13 16:48:59 +01001092IMPORTANT: This function leaves 'unreachable' with the NEXT_MASK_UNREACHABLE
1093flag set but it does not clear it to skip unnecessary iteration. Before the
1094flag is cleared (for example, by using 'clear_unreachable_mask' function or
1095by a call to 'move_legacy_finalizers'), the 'unreachable' list is not a normal
1096list and we can not use most gc_list_* functions for it. */
1097static inline void
1098deduce_unreachable(PyGC_Head *base, PyGC_Head *unreachable) {
Tim Petersea55c512019-10-18 20:59:14 -05001099 validate_list(base, collecting_clear_unreachable_clear);
Pablo Galindo466326d2019-10-13 16:48:59 +01001100 /* Using ob_refcnt and gc_refs, calculate which objects in the
1101 * container set are reachable from outside the set (i.e., have a
1102 * refcount greater than 0 when all the references within the
1103 * set are taken into account).
1104 */
1105 update_refs(base); // gc_prev is used for gc_refs
1106 subtract_refs(base);
1107
1108 /* Leave everything reachable from outside base in base, and move
1109 * everything else (in base) to unreachable.
Pablo Galindo97f12672020-01-13 12:25:05 +00001110 *
Pablo Galindo466326d2019-10-13 16:48:59 +01001111 * NOTE: This used to move the reachable objects into a reachable
1112 * set instead. But most things usually turn out to be reachable,
Pablo Galindo97f12672020-01-13 12:25:05 +00001113 * so it's more efficient to move the unreachable things. It "sounds slick"
1114 * to move the unreachable objects, until you think about it - the reason it
1115 * pays isn't actually obvious.
1116 *
1117 * Suppose we create objects A, B, C in that order. They appear in the young
1118 * generation in the same order. If B points to A, and C to B, and C is
1119 * reachable from outside, then the adjusted refcounts will be 0, 0, and 1
1120 * respectively.
1121 *
1122 * When move_unreachable finds A, A is moved to the unreachable list. The
1123 * same for B when it's first encountered. Then C is traversed, B is moved
1124 * _back_ to the reachable list. B is eventually traversed, and then A is
1125 * moved back to the reachable list.
1126 *
1127 * So instead of not moving at all, the reachable objects B and A are moved
1128 * twice each. Why is this a win? A straightforward algorithm to move the
1129 * reachable objects instead would move A, B, and C once each.
1130 *
1131 * The key is that this dance leaves the objects in order C, B, A - it's
1132 * reversed from the original order. On all _subsequent_ scans, none of
1133 * them will move. Since most objects aren't in cycles, this can save an
1134 * unbounded number of moves across an unbounded number of later collections.
1135 * It can cost more only the first time the chain is scanned.
1136 *
1137 * Drawback: move_unreachable is also used to find out what's still trash
1138 * after finalizers may resurrect objects. In _that_ case most unreachable
1139 * objects will remain unreachable, so it would be more efficient to move
1140 * the reachable objects instead. But this is a one-time cost, probably not
1141 * worth complicating the code to speed just a little.
Pablo Galindo466326d2019-10-13 16:48:59 +01001142 */
1143 gc_list_init(unreachable);
1144 move_unreachable(base, unreachable); // gc_prev is pointer again
Tim Petersea55c512019-10-18 20:59:14 -05001145 validate_list(base, collecting_clear_unreachable_clear);
1146 validate_list(unreachable, collecting_set_unreachable_set);
Pablo Galindo466326d2019-10-13 16:48:59 +01001147}
1148
1149/* Handle objects that may have resurrected after a call to 'finalize_garbage', moving
1150 them to 'old_generation' and placing the rest on 'still_unreachable'.
1151
1152 Contracts:
1153 * After this function 'unreachable' must not be used anymore and 'still_unreachable'
1154 will contain the objects that did not resurrect.
1155
1156 * The "still_unreachable" list must be uninitialized (this function calls
1157 gc_list_init over 'still_unreachable').
1158
1159IMPORTANT: After a call to this function, the 'still_unreachable' set will have the
1160PREV_MARK_COLLECTING set, but the objects in this set are going to be removed so
1161we can skip the expense of clearing the flag to avoid extra iteration. */
1162static inline void
1163handle_resurrected_objects(PyGC_Head *unreachable, PyGC_Head* still_unreachable,
1164 PyGC_Head *old_generation)
1165{
1166 // Remove the PREV_MASK_COLLECTING from unreachable
1167 // to prepare it for a new call to 'deduce_unreachable'
1168 gc_list_clear_collecting(unreachable);
1169
1170 // After the call to deduce_unreachable, the 'still_unreachable' set will
1171 // have the PREV_MARK_COLLECTING set, but the objects are going to be
1172 // removed so we can skip the expense of clearing the flag.
1173 PyGC_Head* resurrected = unreachable;
1174 deduce_unreachable(resurrected, still_unreachable);
1175 clear_unreachable_mask(still_unreachable);
1176
1177 // Move the resurrected objects to the old generation for future collection.
1178 gc_list_merge(resurrected, old_generation);
1179}
1180
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001181/* This is the main function. Read this to understand how the
1182 * collection process works. */
Neal Norwitz7b216c52006-03-04 20:01:53 +00001183static Py_ssize_t
Victor Stinner8b341482020-10-30 17:00:00 +01001184gc_collect_main(PyThreadState *tstate, int generation,
1185 Py_ssize_t *n_collected, Py_ssize_t *n_uncollectable,
1186 int nofail)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001187{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001188 int i;
1189 Py_ssize_t m = 0; /* # objects collected */
1190 Py_ssize_t n = 0; /* # unreachable objects that couldn't be collected */
1191 PyGC_Head *young; /* the generation we are examining */
1192 PyGC_Head *old; /* next older generation */
1193 PyGC_Head unreachable; /* non-problematic unreachable trash */
1194 PyGC_Head finalizers; /* objects with, & reachable from, __del__ */
1195 PyGC_Head *gc;
Victor Stinner7181dec2015-03-27 17:47:53 +01001196 _PyTime_t t1 = 0; /* initialize to prevent a compiler warning */
Victor Stinner72474072019-11-20 12:25:50 +01001197 GCState *gcstate = &tstate->interp->gc;
Antoine Pitrou40f6b122014-05-24 19:21:53 +02001198
Victor Stinnereba5bf22020-10-30 22:51:02 +01001199 // gc_collect_main() must not be called before _PyGC_Init
1200 // or after _PyGC_Fini()
1201 assert(gcstate->garbage != NULL);
1202 assert(!_PyErr_Occurred(tstate));
1203
Victor Stinnerd8135e92020-05-06 18:25:06 +02001204#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
1205 if (tstate->interp->config._isolated_interpreter) {
1206 // bpo-40533: The garbage collector must not be run on parallel on
1207 // Python objects shared by multiple interpreters.
1208 return 0;
1209 }
1210#endif
1211
Victor Stinner67e0de62019-11-20 11:48:18 +01001212 if (gcstate->debug & DEBUG_STATS) {
Inada Naokibf8162c2019-08-02 16:25:29 +09001213 PySys_WriteStderr("gc: collecting generation %d...\n", generation);
Victor Stinner67e0de62019-11-20 11:48:18 +01001214 show_stats_each_generations(gcstate);
Victor Stinner7181dec2015-03-27 17:47:53 +01001215 t1 = _PyTime_GetMonotonicClock();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001216 }
Neil Schemenauer2880ae52002-05-04 05:35:20 +00001217
Łukasz Langaa785c872016-09-09 17:37:37 -07001218 if (PyDTrace_GC_START_ENABLED())
1219 PyDTrace_GC_START(generation);
1220
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001221 /* update collection and allocation counters */
1222 if (generation+1 < NUM_GENERATIONS)
Victor Stinner67e0de62019-11-20 11:48:18 +01001223 gcstate->generations[generation+1].count += 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001224 for (i = 0; i <= generation; i++)
Victor Stinner67e0de62019-11-20 11:48:18 +01001225 gcstate->generations[i].count = 0;
Neil Schemenauer2880ae52002-05-04 05:35:20 +00001226
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001227 /* merge younger generations with one we are currently collecting */
1228 for (i = 0; i < generation; i++) {
Victor Stinner67e0de62019-11-20 11:48:18 +01001229 gc_list_merge(GEN_HEAD(gcstate, i), GEN_HEAD(gcstate, generation));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 }
Neil Schemenauer2880ae52002-05-04 05:35:20 +00001231
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001232 /* handy references */
Victor Stinner67e0de62019-11-20 11:48:18 +01001233 young = GEN_HEAD(gcstate, generation);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001234 if (generation < NUM_GENERATIONS-1)
Victor Stinner67e0de62019-11-20 11:48:18 +01001235 old = GEN_HEAD(gcstate, generation+1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001236 else
1237 old = young;
Tim Petersea55c512019-10-18 20:59:14 -05001238 validate_list(old, collecting_clear_unreachable_clear);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001239
Pablo Galindo466326d2019-10-13 16:48:59 +01001240 deduce_unreachable(young, &unreachable);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001241
INADA Naoki5ac9e6e2018-07-10 17:19:53 +09001242 untrack_tuples(young);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001243 /* Move reachable objects to next generation. */
1244 if (young != old) {
1245 if (generation == NUM_GENERATIONS - 2) {
Victor Stinner67e0de62019-11-20 11:48:18 +01001246 gcstate->long_lived_pending += gc_list_size(young);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001247 }
1248 gc_list_merge(young, old);
1249 }
1250 else {
Pablo Galindo97f12672020-01-13 12:25:05 +00001251 /* We only un-track dicts in full collections, to avoid quadratic
Antoine Pitroue1ad3da2012-05-28 22:22:34 +02001252 dict build-up. See issue #14775. */
1253 untrack_dicts(young);
Victor Stinner67e0de62019-11-20 11:48:18 +01001254 gcstate->long_lived_pending = 0;
1255 gcstate->long_lived_total = gc_list_size(young);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001256 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001257
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001258 /* All objects in unreachable are trash, but objects reachable from
Antoine Pitrou796564c2013-07-30 19:59:21 +02001259 * legacy finalizers (e.g. tp_del) can't safely be deleted.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001260 */
1261 gc_list_init(&finalizers);
INADA Naoki5ac9e6e2018-07-10 17:19:53 +09001262 // NEXT_MASK_UNREACHABLE is cleared here.
1263 // After move_legacy_finalizers(), unreachable is normal list.
Antoine Pitrou796564c2013-07-30 19:59:21 +02001264 move_legacy_finalizers(&unreachable, &finalizers);
1265 /* finalizers contains the unreachable objects with a legacy finalizer;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001266 * unreachable objects reachable *from* those are also uncollectable,
1267 * and we move those into the finalizers list too.
1268 */
Antoine Pitrou796564c2013-07-30 19:59:21 +02001269 move_legacy_finalizer_reachable(&finalizers);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001270
Tim Petersea55c512019-10-18 20:59:14 -05001271 validate_list(&finalizers, collecting_clear_unreachable_clear);
1272 validate_list(&unreachable, collecting_set_unreachable_clear);
INADA Naoki5ac9e6e2018-07-10 17:19:53 +09001273
Tim Petersecbf35f2019-10-09 12:37:30 -05001274 /* Print debugging information. */
Victor Stinner67e0de62019-11-20 11:48:18 +01001275 if (gcstate->debug & DEBUG_COLLECTABLE) {
Tim Petersecbf35f2019-10-09 12:37:30 -05001276 for (gc = GC_NEXT(&unreachable); gc != &unreachable; gc = GC_NEXT(gc)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001277 debug_cycle("collectable", FROM_GC(gc));
1278 }
1279 }
Tim Petersead8b7a2004-10-30 23:09:22 +00001280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 /* Clear weakrefs and invoke callbacks as necessary. */
1282 m += handle_weakrefs(&unreachable, old);
Tim Petersead8b7a2004-10-30 23:09:22 +00001283
Tim Petersea55c512019-10-18 20:59:14 -05001284 validate_list(old, collecting_clear_unreachable_clear);
1285 validate_list(&unreachable, collecting_set_unreachable_clear);
INADA Naoki5ac9e6e2018-07-10 17:19:53 +09001286
Antoine Pitrou796564c2013-07-30 19:59:21 +02001287 /* Call tp_finalize on objects which have one. */
Victor Stinner67e0de62019-11-20 11:48:18 +01001288 finalize_garbage(tstate, &unreachable);
Antoine Pitrou796564c2013-07-30 19:59:21 +02001289
Pablo Galindo466326d2019-10-13 16:48:59 +01001290 /* Handle any objects that may have resurrected after the call
1291 * to 'finalize_garbage' and continue the collection with the
1292 * objects that are still unreachable */
1293 PyGC_Head final_unreachable;
1294 handle_resurrected_objects(&unreachable, &final_unreachable, old);
1295
1296 /* Call tp_clear on objects in the final_unreachable set. This will cause
1297 * the reference cycles to be broken. It may also cause some objects
1298 * in finalizers to be freed.
1299 */
1300 m += gc_list_size(&final_unreachable);
Victor Stinner67e0de62019-11-20 11:48:18 +01001301 delete_garbage(tstate, gcstate, &final_unreachable, old);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001303 /* Collect statistics on uncollectable objects found and print
1304 * debugging information. */
INADA Naoki5ac9e6e2018-07-10 17:19:53 +09001305 for (gc = GC_NEXT(&finalizers); gc != &finalizers; gc = GC_NEXT(gc)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001306 n++;
Victor Stinner67e0de62019-11-20 11:48:18 +01001307 if (gcstate->debug & DEBUG_UNCOLLECTABLE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001308 debug_cycle("uncollectable", FROM_GC(gc));
1309 }
Victor Stinner67e0de62019-11-20 11:48:18 +01001310 if (gcstate->debug & DEBUG_STATS) {
Inada Naokibf8162c2019-08-02 16:25:29 +09001311 double d = _PyTime_AsSecondsDouble(_PyTime_GetMonotonicClock() - t1);
Inada Naoki013e52f2019-08-31 09:13:42 +09001312 PySys_WriteStderr(
Victor Stinnerd36cf5f2020-06-10 18:38:05 +02001313 "gc: done, %zd unreachable, %zd uncollectable, %.4fs elapsed\n",
Inada Naokibf8162c2019-08-02 16:25:29 +09001314 n+m, n, d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001315 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001316
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001317 /* Append instances in the uncollectable set to a Python
1318 * reachable list of garbage. The programmer has to deal with
1319 * this if they insist on creating this type of structure.
1320 */
Victor Stinner67e0de62019-11-20 11:48:18 +01001321 handle_legacy_finalizers(tstate, gcstate, &finalizers, old);
Tim Petersea55c512019-10-18 20:59:14 -05001322 validate_list(old, collecting_clear_unreachable_clear);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001323
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001324 /* Clear free list only during the collection of the highest
1325 * generation */
1326 if (generation == NUM_GENERATIONS-1) {
Victor Stinnere005ead2020-06-05 02:56:37 +02001327 clear_freelists(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001328 }
Christian Heimesa156e092008-02-16 07:38:31 +00001329
Victor Stinner2e969062019-11-20 01:49:32 +01001330 if (_PyErr_Occurred(tstate)) {
Antoine Pitroufef34e32013-05-19 01:11:58 +02001331 if (nofail) {
Victor Stinner2e969062019-11-20 01:49:32 +01001332 _PyErr_Clear(tstate);
Antoine Pitroufef34e32013-05-19 01:11:58 +02001333 }
1334 else {
Victor Stinner656c45e2020-01-24 18:05:24 +01001335 _PyErr_WriteUnraisableMsg("in garbage collection", NULL);
Antoine Pitroufef34e32013-05-19 01:11:58 +02001336 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001337 }
Kristján Valur Jónsson69c63522012-04-15 11:41:32 +00001338
Antoine Pitroud4156c12012-10-30 22:43:19 +01001339 /* Update stats */
Victor Stinner9db03242019-04-26 02:32:01 +02001340 if (n_collected) {
Kristján Valur Jónsson69c63522012-04-15 11:41:32 +00001341 *n_collected = m;
Victor Stinner9db03242019-04-26 02:32:01 +02001342 }
1343 if (n_uncollectable) {
Kristján Valur Jónsson69c63522012-04-15 11:41:32 +00001344 *n_uncollectable = n;
Victor Stinner9db03242019-04-26 02:32:01 +02001345 }
1346
Victor Stinner67e0de62019-11-20 11:48:18 +01001347 struct gc_generation_stats *stats = &gcstate->generation_stats[generation];
Antoine Pitroud4156c12012-10-30 22:43:19 +01001348 stats->collections++;
1349 stats->collected += m;
1350 stats->uncollectable += n;
Łukasz Langaa785c872016-09-09 17:37:37 -07001351
Victor Stinner9db03242019-04-26 02:32:01 +02001352 if (PyDTrace_GC_DONE_ENABLED()) {
Victor Stinner2e969062019-11-20 01:49:32 +01001353 PyDTrace_GC_DONE(n + m);
Victor Stinner9db03242019-04-26 02:32:01 +02001354 }
Łukasz Langaa785c872016-09-09 17:37:37 -07001355
Victor Stinner2e969062019-11-20 01:49:32 +01001356 assert(!_PyErr_Occurred(tstate));
1357 return n + m;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001358}
1359
Kristján Valur Jónsson69c63522012-04-15 11:41:32 +00001360/* Invoke progress callbacks to notify clients that garbage collection
1361 * is starting or stopping
1362 */
1363static void
Victor Stinner67e0de62019-11-20 11:48:18 +01001364invoke_gc_callback(PyThreadState *tstate, const char *phase,
Victor Stinner9db03242019-04-26 02:32:01 +02001365 int generation, Py_ssize_t collected,
1366 Py_ssize_t uncollectable)
Kristján Valur Jónsson69c63522012-04-15 11:41:32 +00001367{
Victor Stinner67e0de62019-11-20 11:48:18 +01001368 assert(!_PyErr_Occurred(tstate));
Victor Stinner9db03242019-04-26 02:32:01 +02001369
Kristján Valur Jónsson69c63522012-04-15 11:41:32 +00001370 /* we may get called very early */
Victor Stinner72474072019-11-20 12:25:50 +01001371 GCState *gcstate = &tstate->interp->gc;
Victor Stinner67e0de62019-11-20 11:48:18 +01001372 if (gcstate->callbacks == NULL) {
Kristján Valur Jónsson69c63522012-04-15 11:41:32 +00001373 return;
Victor Stinner9db03242019-04-26 02:32:01 +02001374 }
1375
Kristján Valur Jónsson69c63522012-04-15 11:41:32 +00001376 /* The local variable cannot be rebound, check it for sanity */
Victor Stinner67e0de62019-11-20 11:48:18 +01001377 assert(PyList_CheckExact(gcstate->callbacks));
Victor Stinner9db03242019-04-26 02:32:01 +02001378 PyObject *info = NULL;
Victor Stinner67e0de62019-11-20 11:48:18 +01001379 if (PyList_GET_SIZE(gcstate->callbacks) != 0) {
Kristján Valur Jónsson69c63522012-04-15 11:41:32 +00001380 info = Py_BuildValue("{sisnsn}",
1381 "generation", generation,
1382 "collected", collected,
1383 "uncollectable", uncollectable);
1384 if (info == NULL) {
1385 PyErr_WriteUnraisable(NULL);
1386 return;
1387 }
1388 }
Victor Stinner67e0de62019-11-20 11:48:18 +01001389 for (Py_ssize_t i=0; i<PyList_GET_SIZE(gcstate->callbacks); i++) {
1390 PyObject *r, *cb = PyList_GET_ITEM(gcstate->callbacks, i);
Kristján Valur Jónsson69c63522012-04-15 11:41:32 +00001391 Py_INCREF(cb); /* make sure cb doesn't go away */
1392 r = PyObject_CallFunction(cb, "sO", phase, info);
Serhiy Storchaka301e3cc2018-05-24 15:19:29 +03001393 if (r == NULL) {
Kristján Valur Jónsson69c63522012-04-15 11:41:32 +00001394 PyErr_WriteUnraisable(cb);
Serhiy Storchaka301e3cc2018-05-24 15:19:29 +03001395 }
1396 else {
1397 Py_DECREF(r);
1398 }
Kristján Valur Jónsson69c63522012-04-15 11:41:32 +00001399 Py_DECREF(cb);
1400 }
1401 Py_XDECREF(info);
Victor Stinner67e0de62019-11-20 11:48:18 +01001402 assert(!_PyErr_Occurred(tstate));
Kristján Valur Jónsson69c63522012-04-15 11:41:32 +00001403}
1404
1405/* Perform garbage collection of a generation and invoke
1406 * progress callbacks.
1407 */
1408static Py_ssize_t
Victor Stinner8b341482020-10-30 17:00:00 +01001409gc_collect_with_callback(PyThreadState *tstate, int generation)
Kristján Valur Jónsson69c63522012-04-15 11:41:32 +00001410{
Victor Stinner67e0de62019-11-20 11:48:18 +01001411 assert(!_PyErr_Occurred(tstate));
Victor Stinner9db03242019-04-26 02:32:01 +02001412 Py_ssize_t result, collected, uncollectable;
Victor Stinner67e0de62019-11-20 11:48:18 +01001413 invoke_gc_callback(tstate, "start", generation, 0, 0);
Victor Stinner8b341482020-10-30 17:00:00 +01001414 result = gc_collect_main(tstate, generation, &collected, &uncollectable, 0);
Victor Stinner67e0de62019-11-20 11:48:18 +01001415 invoke_gc_callback(tstate, "stop", generation, collected, uncollectable);
1416 assert(!_PyErr_Occurred(tstate));
Kristján Valur Jónsson69c63522012-04-15 11:41:32 +00001417 return result;
1418}
1419
Neal Norwitz7b216c52006-03-04 20:01:53 +00001420static Py_ssize_t
Victor Stinner8b341482020-10-30 17:00:00 +01001421gc_collect_generations(PyThreadState *tstate)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001422{
Victor Stinner72474072019-11-20 12:25:50 +01001423 GCState *gcstate = &tstate->interp->gc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001424 /* Find the oldest generation (highest numbered) where the count
1425 * exceeds the threshold. Objects in the that generation and
1426 * generations younger than it will be collected. */
Victor Stinner9db03242019-04-26 02:32:01 +02001427 Py_ssize_t n = 0;
1428 for (int i = NUM_GENERATIONS-1; i >= 0; i--) {
Victor Stinner67e0de62019-11-20 11:48:18 +01001429 if (gcstate->generations[i].count > gcstate->generations[i].threshold) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001430 /* Avoid quadratic performance degradation in number
Pablo Galindo90913982019-12-27 21:55:56 +00001431 of tracked objects (see also issue #4074):
1432
1433 To limit the cost of garbage collection, there are two strategies;
1434 - make each collection faster, e.g. by scanning fewer objects
1435 - do less collections
1436 This heuristic is about the latter strategy.
1437
1438 In addition to the various configurable thresholds, we only trigger a
1439 full collection if the ratio
1440
1441 long_lived_pending / long_lived_total
1442
1443 is above a given value (hardwired to 25%).
1444
1445 The reason is that, while "non-full" collections (i.e., collections of
1446 the young and middle generations) will always examine roughly the same
1447 number of objects -- determined by the aforementioned thresholds --,
1448 the cost of a full collection is proportional to the total number of
1449 long-lived objects, which is virtually unbounded.
1450
1451 Indeed, it has been remarked that doing a full collection every
1452 <constant number> of object creations entails a dramatic performance
1453 degradation in workloads which consist in creating and storing lots of
1454 long-lived objects (e.g. building a large list of GC-tracked objects would
1455 show quadratic performance, instead of linear as expected: see issue #4074).
1456
1457 Using the above ratio, instead, yields amortized linear performance in
1458 the total number of objects (the effect of which can be summarized
1459 thusly: "each full garbage collection is more and more costly as the
1460 number of objects grows, but we do fewer and fewer of them").
1461
1462 This heuristic was suggested by Martin von Löwis on python-dev in
1463 June 2008. His original analysis and proposal can be found at:
1464 http://mail.python.org/pipermail/python-dev/2008-June/080579.html
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001465 */
1466 if (i == NUM_GENERATIONS - 1
Victor Stinner67e0de62019-11-20 11:48:18 +01001467 && gcstate->long_lived_pending < gcstate->long_lived_total / 4)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001468 continue;
Victor Stinner8b341482020-10-30 17:00:00 +01001469 n = gc_collect_with_callback(tstate, i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001470 break;
1471 }
1472 }
1473 return n;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001474}
1475
Serhiy Storchaka93260282017-02-04 11:19:59 +02001476#include "clinic/gcmodule.c.h"
1477
1478/*[clinic input]
1479gc.enable
1480
1481Enable automatic garbage collection.
1482[clinic start generated code]*/
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001483
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001484static PyObject *
Serhiy Storchaka93260282017-02-04 11:19:59 +02001485gc_enable_impl(PyObject *module)
1486/*[clinic end generated code: output=45a427e9dce9155c input=81ac4940ca579707]*/
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001487{
Victor Stinner1bcc32f2020-06-10 20:08:26 +02001488 GCState *gcstate = get_gc_state();
Victor Stinner67e0de62019-11-20 11:48:18 +01001489 gcstate->enabled = 1;
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001490 Py_RETURN_NONE;
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001491}
1492
Serhiy Storchaka93260282017-02-04 11:19:59 +02001493/*[clinic input]
1494gc.disable
1495
1496Disable automatic garbage collection.
1497[clinic start generated code]*/
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001498
1499static PyObject *
Serhiy Storchaka93260282017-02-04 11:19:59 +02001500gc_disable_impl(PyObject *module)
1501/*[clinic end generated code: output=97d1030f7aa9d279 input=8c2e5a14e800d83b]*/
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001502{
Victor Stinner1bcc32f2020-06-10 20:08:26 +02001503 GCState *gcstate = get_gc_state();
Victor Stinner67e0de62019-11-20 11:48:18 +01001504 gcstate->enabled = 0;
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001505 Py_RETURN_NONE;
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001506}
1507
Serhiy Storchaka93260282017-02-04 11:19:59 +02001508/*[clinic input]
1509gc.isenabled -> bool
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001510
Serhiy Storchaka93260282017-02-04 11:19:59 +02001511Returns true if automatic garbage collection is enabled.
1512[clinic start generated code]*/
1513
1514static int
1515gc_isenabled_impl(PyObject *module)
1516/*[clinic end generated code: output=1874298331c49130 input=30005e0422373b31]*/
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001517{
Victor Stinner1bcc32f2020-06-10 20:08:26 +02001518 GCState *gcstate = get_gc_state();
Victor Stinner67e0de62019-11-20 11:48:18 +01001519 return gcstate->enabled;
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001520}
1521
Serhiy Storchaka93260282017-02-04 11:19:59 +02001522/*[clinic input]
1523gc.collect -> Py_ssize_t
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001524
Serhiy Storchaka93260282017-02-04 11:19:59 +02001525 generation: int(c_default="NUM_GENERATIONS - 1") = 2
1526
1527Run the garbage collector.
1528
1529With no arguments, run a full collection. The optional argument
1530may be an integer specifying which generation to collect. A ValueError
1531is raised if the generation number is invalid.
1532
1533The number of unreachable objects is returned.
1534[clinic start generated code]*/
1535
1536static Py_ssize_t
1537gc_collect_impl(PyObject *module, int generation)
1538/*[clinic end generated code: output=b697e633043233c7 input=40720128b682d879]*/
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001539{
Victor Stinner2e969062019-11-20 01:49:32 +01001540 PyThreadState *tstate = _PyThreadState_GET();
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001541
Serhiy Storchaka93260282017-02-04 11:19:59 +02001542 if (generation < 0 || generation >= NUM_GENERATIONS) {
Victor Stinner2e969062019-11-20 01:49:32 +01001543 _PyErr_SetString(tstate, PyExc_ValueError, "invalid generation");
Serhiy Storchaka93260282017-02-04 11:19:59 +02001544 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001545 }
Barry Warsawd3c38ff2006-03-07 09:46:03 +00001546
Victor Stinner72474072019-11-20 12:25:50 +01001547 GCState *gcstate = &tstate->interp->gc;
Victor Stinner9db03242019-04-26 02:32:01 +02001548 Py_ssize_t n;
Victor Stinner67e0de62019-11-20 11:48:18 +01001549 if (gcstate->collecting) {
Victor Stinner9db03242019-04-26 02:32:01 +02001550 /* already collecting, don't do anything */
1551 n = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001552 }
Victor Stinner9db03242019-04-26 02:32:01 +02001553 else {
Victor Stinner67e0de62019-11-20 11:48:18 +01001554 gcstate->collecting = 1;
Victor Stinner8b341482020-10-30 17:00:00 +01001555 n = gc_collect_with_callback(tstate, generation);
Victor Stinner67e0de62019-11-20 11:48:18 +01001556 gcstate->collecting = 0;
Victor Stinner9db03242019-04-26 02:32:01 +02001557 }
Serhiy Storchaka93260282017-02-04 11:19:59 +02001558 return n;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001559}
1560
Serhiy Storchaka93260282017-02-04 11:19:59 +02001561/*[clinic input]
1562gc.set_debug
1563
1564 flags: int
1565 An integer that can have the following bits turned on:
1566 DEBUG_STATS - Print statistics during collection.
1567 DEBUG_COLLECTABLE - Print collectable objects found.
1568 DEBUG_UNCOLLECTABLE - Print unreachable but uncollectable objects
1569 found.
1570 DEBUG_SAVEALL - Save objects to gc.garbage rather than freeing them.
1571 DEBUG_LEAK - Debug leaking programs (everything but STATS).
1572 /
1573
1574Set the garbage collection debugging flags.
1575
1576Debugging information is written to sys.stderr.
1577[clinic start generated code]*/
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001578
1579static PyObject *
Serhiy Storchaka93260282017-02-04 11:19:59 +02001580gc_set_debug_impl(PyObject *module, int flags)
1581/*[clinic end generated code: output=7c8366575486b228 input=5e5ce15e84fbed15]*/
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001582{
Victor Stinner1bcc32f2020-06-10 20:08:26 +02001583 GCState *gcstate = get_gc_state();
Victor Stinner67e0de62019-11-20 11:48:18 +01001584 gcstate->debug = flags;
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001585 Py_RETURN_NONE;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001586}
1587
Serhiy Storchaka93260282017-02-04 11:19:59 +02001588/*[clinic input]
1589gc.get_debug -> int
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001590
Serhiy Storchaka93260282017-02-04 11:19:59 +02001591Get the garbage collection debugging flags.
1592[clinic start generated code]*/
1593
1594static int
1595gc_get_debug_impl(PyObject *module)
1596/*[clinic end generated code: output=91242f3506cd1e50 input=91a101e1c3b98366]*/
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001597{
Victor Stinner1bcc32f2020-06-10 20:08:26 +02001598 GCState *gcstate = get_gc_state();
Victor Stinner67e0de62019-11-20 11:48:18 +01001599 return gcstate->debug;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001600}
1601
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001602PyDoc_STRVAR(gc_set_thresh__doc__,
Neal Norwitz2a47c0f2002-01-29 00:53:41 +00001603"set_threshold(threshold0, [threshold1, threshold2]) -> None\n"
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001604"\n"
1605"Sets the collection thresholds. Setting threshold0 to zero disables\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001606"collection.\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001607
1608static PyObject *
Victor Stinner9db03242019-04-26 02:32:01 +02001609gc_set_threshold(PyObject *self, PyObject *args)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001610{
Victor Stinner1bcc32f2020-06-10 20:08:26 +02001611 GCState *gcstate = get_gc_state();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001612 if (!PyArg_ParseTuple(args, "i|ii:set_threshold",
Victor Stinner67e0de62019-11-20 11:48:18 +01001613 &gcstate->generations[0].threshold,
1614 &gcstate->generations[1].threshold,
1615 &gcstate->generations[2].threshold))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001616 return NULL;
Victor Stinner9db03242019-04-26 02:32:01 +02001617 for (int i = 3; i < NUM_GENERATIONS; i++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001618 /* generations higher than 2 get the same threshold */
Victor Stinner67e0de62019-11-20 11:48:18 +01001619 gcstate->generations[i].threshold = gcstate->generations[2].threshold;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001620 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001621 Py_RETURN_NONE;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001622}
1623
Serhiy Storchaka93260282017-02-04 11:19:59 +02001624/*[clinic input]
1625gc.get_threshold
1626
1627Return the current collection thresholds.
1628[clinic start generated code]*/
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001629
1630static PyObject *
Serhiy Storchaka93260282017-02-04 11:19:59 +02001631gc_get_threshold_impl(PyObject *module)
1632/*[clinic end generated code: output=7902bc9f41ecbbd8 input=286d79918034d6e6]*/
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001633{
Victor Stinner1bcc32f2020-06-10 20:08:26 +02001634 GCState *gcstate = get_gc_state();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001635 return Py_BuildValue("(iii)",
Victor Stinner67e0de62019-11-20 11:48:18 +01001636 gcstate->generations[0].threshold,
1637 gcstate->generations[1].threshold,
1638 gcstate->generations[2].threshold);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001639}
1640
Serhiy Storchaka93260282017-02-04 11:19:59 +02001641/*[clinic input]
1642gc.get_count
1643
1644Return a three-tuple of the current collection counts.
1645[clinic start generated code]*/
Barry Warsawd3c38ff2006-03-07 09:46:03 +00001646
1647static PyObject *
Serhiy Storchaka93260282017-02-04 11:19:59 +02001648gc_get_count_impl(PyObject *module)
1649/*[clinic end generated code: output=354012e67b16398f input=a392794a08251751]*/
Barry Warsawd3c38ff2006-03-07 09:46:03 +00001650{
Victor Stinner1bcc32f2020-06-10 20:08:26 +02001651 GCState *gcstate = get_gc_state();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001652 return Py_BuildValue("(iii)",
Victor Stinner67e0de62019-11-20 11:48:18 +01001653 gcstate->generations[0].count,
1654 gcstate->generations[1].count,
1655 gcstate->generations[2].count);
Barry Warsawd3c38ff2006-03-07 09:46:03 +00001656}
1657
Neil Schemenauer48c70342001-08-09 15:38:31 +00001658static int
Martin v. Löwis560da622001-11-24 09:24:51 +00001659referrersvisit(PyObject* obj, PyObject *objs)
Neil Schemenauer48c70342001-08-09 15:38:31 +00001660{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001661 Py_ssize_t i;
1662 for (i = 0; i < PyTuple_GET_SIZE(objs); i++)
1663 if (PyTuple_GET_ITEM(objs, i) == obj)
1664 return 1;
1665 return 0;
Neil Schemenauer48c70342001-08-09 15:38:31 +00001666}
1667
Neil Schemenauer17e7be62001-08-10 14:46:47 +00001668static int
Martin v. Löwis560da622001-11-24 09:24:51 +00001669gc_referrers_for(PyObject *objs, PyGC_Head *list, PyObject *resultlist)
Neil Schemenauer48c70342001-08-09 15:38:31 +00001670{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001671 PyGC_Head *gc;
1672 PyObject *obj;
1673 traverseproc traverse;
INADA Naoki5ac9e6e2018-07-10 17:19:53 +09001674 for (gc = GC_NEXT(list); gc != list; gc = GC_NEXT(gc)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001675 obj = FROM_GC(gc);
1676 traverse = Py_TYPE(obj)->tp_traverse;
1677 if (obj == objs || obj == resultlist)
1678 continue;
1679 if (traverse(obj, (visitproc)referrersvisit, objs)) {
1680 if (PyList_Append(resultlist, obj) < 0)
1681 return 0; /* error */
1682 }
1683 }
1684 return 1; /* no error */
Neil Schemenauer48c70342001-08-09 15:38:31 +00001685}
1686
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001687PyDoc_STRVAR(gc_get_referrers__doc__,
Martin v. Löwis560da622001-11-24 09:24:51 +00001688"get_referrers(*objs) -> list\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001689Return the list of objects that directly refer to any of objs.");
Neil Schemenauer48c70342001-08-09 15:38:31 +00001690
Neil Schemenauer17e7be62001-08-10 14:46:47 +00001691static PyObject *
Martin v. Löwis560da622001-11-24 09:24:51 +00001692gc_get_referrers(PyObject *self, PyObject *args)
Neil Schemenauer48c70342001-08-09 15:38:31 +00001693{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001694 PyObject *result = PyList_New(0);
Victor Stinner67e0de62019-11-20 11:48:18 +01001695 if (!result) {
1696 return NULL;
1697 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001698
Victor Stinner1bcc32f2020-06-10 20:08:26 +02001699 GCState *gcstate = get_gc_state();
1700 for (int i = 0; i < NUM_GENERATIONS; i++) {
Victor Stinner67e0de62019-11-20 11:48:18 +01001701 if (!(gc_referrers_for(args, GEN_HEAD(gcstate, i), result))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001702 Py_DECREF(result);
1703 return NULL;
1704 }
1705 }
1706 return result;
Neil Schemenauer48c70342001-08-09 15:38:31 +00001707}
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001708
Tim Peters0f81ab62003-04-08 16:39:48 +00001709/* Append obj to list; return true if error (out of memory), false if OK. */
Jeremy Hylton5bd378b2003-04-03 16:28:38 +00001710static int
Tim Peters730f5532003-04-08 17:17:17 +00001711referentsvisit(PyObject *obj, PyObject *list)
Jeremy Hylton5bd378b2003-04-03 16:28:38 +00001712{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001713 return PyList_Append(list, obj) < 0;
Jeremy Hylton5bd378b2003-04-03 16:28:38 +00001714}
1715
Tim Peters730f5532003-04-08 17:17:17 +00001716PyDoc_STRVAR(gc_get_referents__doc__,
1717"get_referents(*objs) -> list\n\
Jeremy Hylton059b0942003-04-03 16:29:13 +00001718Return the list of objects that are directly referred to by objs.");
Jeremy Hylton5bd378b2003-04-03 16:28:38 +00001719
1720static PyObject *
Tim Peters730f5532003-04-08 17:17:17 +00001721gc_get_referents(PyObject *self, PyObject *args)
Jeremy Hylton5bd378b2003-04-03 16:28:38 +00001722{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001723 Py_ssize_t i;
1724 PyObject *result = PyList_New(0);
Tim Peters0f81ab62003-04-08 16:39:48 +00001725
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001726 if (result == NULL)
1727 return NULL;
Tim Peters0f81ab62003-04-08 16:39:48 +00001728
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001729 for (i = 0; i < PyTuple_GET_SIZE(args); i++) {
1730 traverseproc traverse;
1731 PyObject *obj = PyTuple_GET_ITEM(args, i);
Tim Peters0f81ab62003-04-08 16:39:48 +00001732
Hai Shi675d9a32020-04-15 02:11:20 +08001733 if (!_PyObject_IS_GC(obj))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001734 continue;
1735 traverse = Py_TYPE(obj)->tp_traverse;
1736 if (! traverse)
1737 continue;
1738 if (traverse(obj, (visitproc)referentsvisit, result)) {
1739 Py_DECREF(result);
1740 return NULL;
1741 }
1742 }
1743 return result;
Jeremy Hylton5bd378b2003-04-03 16:28:38 +00001744}
1745
Serhiy Storchaka93260282017-02-04 11:19:59 +02001746/*[clinic input]
1747gc.get_objects
Pablo Galindo175421b2019-02-23 03:02:06 +00001748 generation: Py_ssize_t(accept={int, NoneType}, c_default="-1") = None
1749 Generation to extract the objects from.
Serhiy Storchaka93260282017-02-04 11:19:59 +02001750
1751Return a list of objects tracked by the collector (excluding the list returned).
Pablo Galindo175421b2019-02-23 03:02:06 +00001752
1753If generation is not None, return only the objects tracked by the collector
1754that are in that generation.
Serhiy Storchaka93260282017-02-04 11:19:59 +02001755[clinic start generated code]*/
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +00001756
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +00001757static PyObject *
Pablo Galindo175421b2019-02-23 03:02:06 +00001758gc_get_objects_impl(PyObject *module, Py_ssize_t generation)
1759/*[clinic end generated code: output=48b35fea4ba6cb0e input=ef7da9df9806754c]*/
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +00001760{
Victor Stinner67e0de62019-11-20 11:48:18 +01001761 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001762 int i;
1763 PyObject* result;
Victor Stinner72474072019-11-20 12:25:50 +01001764 GCState *gcstate = &tstate->interp->gc;
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +00001765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001766 result = PyList_New(0);
Pablo Galindo175421b2019-02-23 03:02:06 +00001767 if (result == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001768 return NULL;
Pablo Galindo175421b2019-02-23 03:02:06 +00001769 }
1770
1771 /* If generation is passed, we extract only that generation */
Victor Stinner0810fa72019-04-15 17:54:09 +02001772 if (generation != -1) {
Pablo Galindo175421b2019-02-23 03:02:06 +00001773 if (generation >= NUM_GENERATIONS) {
Victor Stinner67e0de62019-11-20 11:48:18 +01001774 _PyErr_Format(tstate, PyExc_ValueError,
1775 "generation parameter must be less than the number of "
1776 "available generations (%i)",
1777 NUM_GENERATIONS);
Pablo Galindo175421b2019-02-23 03:02:06 +00001778 goto error;
1779 }
1780
1781 if (generation < 0) {
Victor Stinner67e0de62019-11-20 11:48:18 +01001782 _PyErr_SetString(tstate, PyExc_ValueError,
1783 "generation parameter cannot be negative");
Pablo Galindo175421b2019-02-23 03:02:06 +00001784 goto error;
1785 }
1786
Victor Stinner67e0de62019-11-20 11:48:18 +01001787 if (append_objects(result, GEN_HEAD(gcstate, generation))) {
Pablo Galindo175421b2019-02-23 03:02:06 +00001788 goto error;
1789 }
1790
1791 return result;
1792 }
1793
1794 /* If generation is not passed or None, get all objects from all generations */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001795 for (i = 0; i < NUM_GENERATIONS; i++) {
Victor Stinner67e0de62019-11-20 11:48:18 +01001796 if (append_objects(result, GEN_HEAD(gcstate, i))) {
Pablo Galindo175421b2019-02-23 03:02:06 +00001797 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001798 }
1799 }
1800 return result;
Pablo Galindo175421b2019-02-23 03:02:06 +00001801
1802error:
1803 Py_DECREF(result);
1804 return NULL;
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +00001805}
1806
Serhiy Storchaka93260282017-02-04 11:19:59 +02001807/*[clinic input]
1808gc.get_stats
1809
1810Return a list of dictionaries containing per-generation statistics.
1811[clinic start generated code]*/
Antoine Pitroud4156c12012-10-30 22:43:19 +01001812
1813static PyObject *
Serhiy Storchaka93260282017-02-04 11:19:59 +02001814gc_get_stats_impl(PyObject *module)
1815/*[clinic end generated code: output=a8ab1d8a5d26f3ab input=1ef4ed9d17b1a470]*/
Antoine Pitroud4156c12012-10-30 22:43:19 +01001816{
1817 int i;
Antoine Pitroud4156c12012-10-30 22:43:19 +01001818 struct gc_generation_stats stats[NUM_GENERATIONS], *st;
1819
1820 /* To get consistent values despite allocations while constructing
1821 the result list, we use a snapshot of the running stats. */
Victor Stinner1bcc32f2020-06-10 20:08:26 +02001822 GCState *gcstate = get_gc_state();
Antoine Pitroud4156c12012-10-30 22:43:19 +01001823 for (i = 0; i < NUM_GENERATIONS; i++) {
Victor Stinner67e0de62019-11-20 11:48:18 +01001824 stats[i] = gcstate->generation_stats[i];
Antoine Pitroud4156c12012-10-30 22:43:19 +01001825 }
1826
Victor Stinner9db03242019-04-26 02:32:01 +02001827 PyObject *result = PyList_New(0);
Antoine Pitroud4156c12012-10-30 22:43:19 +01001828 if (result == NULL)
1829 return NULL;
1830
1831 for (i = 0; i < NUM_GENERATIONS; i++) {
1832 PyObject *dict;
1833 st = &stats[i];
1834 dict = Py_BuildValue("{snsnsn}",
1835 "collections", st->collections,
1836 "collected", st->collected,
1837 "uncollectable", st->uncollectable
1838 );
1839 if (dict == NULL)
1840 goto error;
1841 if (PyList_Append(result, dict)) {
1842 Py_DECREF(dict);
1843 goto error;
1844 }
1845 Py_DECREF(dict);
1846 }
1847 return result;
1848
1849error:
1850 Py_XDECREF(result);
1851 return NULL;
1852}
1853
1854
Serhiy Storchaka93260282017-02-04 11:19:59 +02001855/*[clinic input]
1856gc.is_tracked
1857
1858 obj: object
1859 /
1860
1861Returns true if the object is tracked by the garbage collector.
1862
1863Simple atomic objects will return false.
1864[clinic start generated code]*/
Antoine Pitrou3a652b12009-03-23 18:52:06 +00001865
1866static PyObject *
Serhiy Storchaka93260282017-02-04 11:19:59 +02001867gc_is_tracked(PyObject *module, PyObject *obj)
1868/*[clinic end generated code: output=14f0103423b28e31 input=d83057f170ea2723]*/
Antoine Pitrou3a652b12009-03-23 18:52:06 +00001869{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001870 PyObject *result;
1871
Hai Shi675d9a32020-04-15 02:11:20 +08001872 if (_PyObject_IS_GC(obj) && _PyObject_GC_IS_TRACKED(obj))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001873 result = Py_True;
1874 else
1875 result = Py_False;
1876 Py_INCREF(result);
1877 return result;
Antoine Pitrou3a652b12009-03-23 18:52:06 +00001878}
1879
brainfvckc75edab2017-10-16 12:49:41 -07001880/*[clinic input]
Pablo Galindoa2ec3f02020-01-14 12:06:45 +00001881gc.is_finalized
1882
1883 obj: object
1884 /
1885
1886Returns true if the object has been already finalized by the GC.
1887[clinic start generated code]*/
1888
1889static PyObject *
1890gc_is_finalized(PyObject *module, PyObject *obj)
1891/*[clinic end generated code: output=e1516ac119a918ed input=201d0c58f69ae390]*/
1892{
Hai Shi675d9a32020-04-15 02:11:20 +08001893 if (_PyObject_IS_GC(obj) && _PyGCHead_FINALIZED(AS_GC(obj))) {
Pablo Galindoa2ec3f02020-01-14 12:06:45 +00001894 Py_RETURN_TRUE;
1895 }
1896 Py_RETURN_FALSE;
1897}
1898
1899/*[clinic input]
brainfvckc75edab2017-10-16 12:49:41 -07001900gc.freeze
1901
1902Freeze all current tracked objects and ignore them for future collections.
1903
1904This can be used before a POSIX fork() call to make the gc copy-on-write friendly.
1905Note: collection before a POSIX fork() call may free pages for future allocation
1906which can cause copy-on-write.
1907[clinic start generated code]*/
1908
1909static PyObject *
1910gc_freeze_impl(PyObject *module)
1911/*[clinic end generated code: output=502159d9cdc4c139 input=b602b16ac5febbe5]*/
1912{
Victor Stinner1bcc32f2020-06-10 20:08:26 +02001913 GCState *gcstate = get_gc_state();
brainfvckc75edab2017-10-16 12:49:41 -07001914 for (int i = 0; i < NUM_GENERATIONS; ++i) {
Victor Stinner67e0de62019-11-20 11:48:18 +01001915 gc_list_merge(GEN_HEAD(gcstate, i), &gcstate->permanent_generation.head);
1916 gcstate->generations[i].count = 0;
brainfvckc75edab2017-10-16 12:49:41 -07001917 }
1918 Py_RETURN_NONE;
1919}
1920
1921/*[clinic input]
1922gc.unfreeze
1923
1924Unfreeze all objects in the permanent generation.
1925
1926Put all objects in the permanent generation back into oldest generation.
1927[clinic start generated code]*/
1928
1929static PyObject *
1930gc_unfreeze_impl(PyObject *module)
1931/*[clinic end generated code: output=1c15f2043b25e169 input=2dd52b170f4cef6c]*/
1932{
Victor Stinner1bcc32f2020-06-10 20:08:26 +02001933 GCState *gcstate = get_gc_state();
Victor Stinner67e0de62019-11-20 11:48:18 +01001934 gc_list_merge(&gcstate->permanent_generation.head,
1935 GEN_HEAD(gcstate, NUM_GENERATIONS-1));
brainfvckc75edab2017-10-16 12:49:41 -07001936 Py_RETURN_NONE;
1937}
1938
1939/*[clinic input]
Victor Stinner05d68a82018-01-18 11:15:25 +01001940gc.get_freeze_count -> Py_ssize_t
brainfvckc75edab2017-10-16 12:49:41 -07001941
1942Return the number of objects in the permanent generation.
1943[clinic start generated code]*/
1944
Victor Stinner05d68a82018-01-18 11:15:25 +01001945static Py_ssize_t
brainfvckc75edab2017-10-16 12:49:41 -07001946gc_get_freeze_count_impl(PyObject *module)
Victor Stinner05d68a82018-01-18 11:15:25 +01001947/*[clinic end generated code: output=61cbd9f43aa032e1 input=45ffbc65cfe2a6ed]*/
brainfvckc75edab2017-10-16 12:49:41 -07001948{
Victor Stinner1bcc32f2020-06-10 20:08:26 +02001949 GCState *gcstate = get_gc_state();
Victor Stinner67e0de62019-11-20 11:48:18 +01001950 return gc_list_size(&gcstate->permanent_generation.head);
brainfvckc75edab2017-10-16 12:49:41 -07001951}
1952
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +00001953
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001954PyDoc_STRVAR(gc__doc__,
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001955"This module provides access to the garbage collector for reference cycles.\n"
1956"\n"
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001957"enable() -- Enable automatic garbage collection.\n"
1958"disable() -- Disable automatic garbage collection.\n"
1959"isenabled() -- Returns true if automatic collection is enabled.\n"
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001960"collect() -- Do a full collection right now.\n"
Thomas Wouters89f507f2006-12-13 04:49:30 +00001961"get_count() -- Return the current collection counts.\n"
R David Murray0e814632013-12-26 15:11:28 -05001962"get_stats() -- Return list of dictionaries containing per-generation stats.\n"
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001963"set_debug() -- Set debugging flags.\n"
1964"get_debug() -- Get debugging flags.\n"
1965"set_threshold() -- Set the collection thresholds.\n"
1966"get_threshold() -- Return the current the collection thresholds.\n"
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +00001967"get_objects() -- Return a list of all objects tracked by the collector.\n"
Antoine Pitrou3a652b12009-03-23 18:52:06 +00001968"is_tracked() -- Returns true if a given object is tracked.\n"
Pablo Galindob6791372020-01-14 17:38:15 +00001969"is_finalized() -- Returns true if a given object has been already finalized.\n"
Jeremy Hylton5bd378b2003-04-03 16:28:38 +00001970"get_referrers() -- Return the list of objects that refer to an object.\n"
brainfvckc75edab2017-10-16 12:49:41 -07001971"get_referents() -- Return the list of objects that an object refers to.\n"
1972"freeze() -- Freeze all tracked objects and ignore them for future collections.\n"
1973"unfreeze() -- Unfreeze all objects in the permanent generation.\n"
1974"get_freeze_count() -- Return the number of objects in the permanent generation.\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001975
1976static PyMethodDef GcMethods[] = {
Serhiy Storchaka93260282017-02-04 11:19:59 +02001977 GC_ENABLE_METHODDEF
1978 GC_DISABLE_METHODDEF
1979 GC_ISENABLED_METHODDEF
1980 GC_SET_DEBUG_METHODDEF
1981 GC_GET_DEBUG_METHODDEF
1982 GC_GET_COUNT_METHODDEF
Victor Stinner9db03242019-04-26 02:32:01 +02001983 {"set_threshold", gc_set_threshold, METH_VARARGS, gc_set_thresh__doc__},
Serhiy Storchaka93260282017-02-04 11:19:59 +02001984 GC_GET_THRESHOLD_METHODDEF
1985 GC_COLLECT_METHODDEF
1986 GC_GET_OBJECTS_METHODDEF
1987 GC_GET_STATS_METHODDEF
1988 GC_IS_TRACKED_METHODDEF
Pablo Galindoa2ec3f02020-01-14 12:06:45 +00001989 GC_IS_FINALIZED_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001990 {"get_referrers", gc_get_referrers, METH_VARARGS,
1991 gc_get_referrers__doc__},
1992 {"get_referents", gc_get_referents, METH_VARARGS,
1993 gc_get_referents__doc__},
brainfvckc75edab2017-10-16 12:49:41 -07001994 GC_FREEZE_METHODDEF
1995 GC_UNFREEZE_METHODDEF
1996 GC_GET_FREEZE_COUNT_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001997 {NULL, NULL} /* Sentinel */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001998};
1999
Christian Heimes646d7fd2020-11-19 15:08:34 +01002000static int
2001gcmodule_exec(PyObject *module)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00002002{
Victor Stinner1bcc32f2020-06-10 20:08:26 +02002003 GCState *gcstate = get_gc_state();
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00002004
Christian Heimes646d7fd2020-11-19 15:08:34 +01002005 /* garbage and callbacks are initialized by _PyGC_Init() early in
2006 * interpreter lifecycle. */
2007 assert(gcstate->garbage != NULL);
2008 if (PyModule_AddObjectRef(module, "garbage", gcstate->garbage) < 0) {
2009 return -1;
2010 }
2011 assert(gcstate->callbacks != NULL);
2012 if (PyModule_AddObjectRef(module, "callbacks", gcstate->callbacks) < 0) {
2013 return -1;
Victor Stinner9db03242019-04-26 02:32:01 +02002014 }
Tim Peters11558872003-04-06 23:30:52 +00002015
Christian Heimes646d7fd2020-11-19 15:08:34 +01002016#define ADD_INT(NAME) if (PyModule_AddIntConstant(module, #NAME, NAME) < 0) { return -1; }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002017 ADD_INT(DEBUG_STATS);
2018 ADD_INT(DEBUG_COLLECTABLE);
2019 ADD_INT(DEBUG_UNCOLLECTABLE);
2020 ADD_INT(DEBUG_SAVEALL);
2021 ADD_INT(DEBUG_LEAK);
Tim Peters11558872003-04-06 23:30:52 +00002022#undef ADD_INT
Christian Heimes646d7fd2020-11-19 15:08:34 +01002023 return 0;
2024}
2025
2026static PyModuleDef_Slot gcmodule_slots[] = {
2027 {Py_mod_exec, gcmodule_exec},
2028 {0, NULL}
2029};
2030
2031static struct PyModuleDef gcmodule = {
2032 PyModuleDef_HEAD_INIT,
2033 .m_name = "gc",
2034 .m_doc = gc__doc__,
2035 .m_size = 0, // per interpreter state, see: get_gc_state()
2036 .m_methods = GcMethods,
2037 .m_slots = gcmodule_slots
2038};
2039
2040PyMODINIT_FUNC
2041PyInit_gc(void)
2042{
2043 return PyModuleDef_Init(&gcmodule);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00002044}
2045
Victor Stinner8b341482020-10-30 17:00:00 +01002046/* Public API to invoke gc.collect() from C */
Neal Norwitz7b216c52006-03-04 20:01:53 +00002047Py_ssize_t
Guido van Rossume13ddc92003-04-17 17:29:22 +00002048PyGC_Collect(void)
2049{
Victor Stinner2e969062019-11-20 01:49:32 +01002050 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner72474072019-11-20 12:25:50 +01002051 GCState *gcstate = &tstate->interp->gc;
Victor Stinner2e969062019-11-20 01:49:32 +01002052
Victor Stinner67e0de62019-11-20 11:48:18 +01002053 if (!gcstate->enabled) {
Victor Stinner9db03242019-04-26 02:32:01 +02002054 return 0;
2055 }
Guido van Rossume13ddc92003-04-17 17:29:22 +00002056
Victor Stinner9db03242019-04-26 02:32:01 +02002057 Py_ssize_t n;
Victor Stinner67e0de62019-11-20 11:48:18 +01002058 if (gcstate->collecting) {
Victor Stinner9db03242019-04-26 02:32:01 +02002059 /* already collecting, don't do anything */
2060 n = 0;
2061 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002062 else {
Serhiy Storchaka301e3cc2018-05-24 15:19:29 +03002063 PyObject *exc, *value, *tb;
Victor Stinner67e0de62019-11-20 11:48:18 +01002064 gcstate->collecting = 1;
Victor Stinner2e969062019-11-20 01:49:32 +01002065 _PyErr_Fetch(tstate, &exc, &value, &tb);
Victor Stinner8b341482020-10-30 17:00:00 +01002066 n = gc_collect_with_callback(tstate, NUM_GENERATIONS - 1);
Victor Stinner2e969062019-11-20 01:49:32 +01002067 _PyErr_Restore(tstate, exc, value, tb);
Victor Stinner67e0de62019-11-20 11:48:18 +01002068 gcstate->collecting = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002069 }
Guido van Rossume13ddc92003-04-17 17:29:22 +00002070
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002071 return n;
Guido van Rossume13ddc92003-04-17 17:29:22 +00002072}
2073
Antoine Pitroufef34e32013-05-19 01:11:58 +02002074Py_ssize_t
Victor Stinner8b341482020-10-30 17:00:00 +01002075_PyGC_CollectNoFail(PyThreadState *tstate)
Łukasz Langafef7e942016-09-09 21:47:46 -07002076{
Antoine Pitrouc69c9bc2013-08-15 20:15:15 +02002077 /* Ideally, this function is only called on interpreter shutdown,
2078 and therefore not recursively. Unfortunately, when there are daemon
2079 threads, a daemon thread can start a cyclic garbage collection
2080 during interpreter shutdown (and then never finish it).
2081 See http://bugs.python.org/issue8713#msg195178 for an example.
2082 */
Victor Stinnereba5bf22020-10-30 22:51:02 +01002083 GCState *gcstate = &tstate->interp->gc;
Victor Stinner67e0de62019-11-20 11:48:18 +01002084 if (gcstate->collecting) {
Victor Stinner8b341482020-10-30 17:00:00 +01002085 return 0;
Victor Stinner9db03242019-04-26 02:32:01 +02002086 }
Victor Stinner8b341482020-10-30 17:00:00 +01002087
2088 Py_ssize_t n;
2089 gcstate->collecting = 1;
2090 n = gc_collect_main(tstate, NUM_GENERATIONS - 1, NULL, NULL, 1);
2091 gcstate->collecting = 0;
Antoine Pitroufef34e32013-05-19 01:11:58 +02002092 return n;
2093}
Antoine Pitrou5f454a02013-05-06 21:15:57 +02002094
Antoine Pitrou696e0352010-08-08 22:18:46 +00002095void
Victor Stinner67e0de62019-11-20 11:48:18 +01002096_PyGC_DumpShutdownStats(PyThreadState *tstate)
Antoine Pitrou696e0352010-08-08 22:18:46 +00002097{
Victor Stinner72474072019-11-20 12:25:50 +01002098 GCState *gcstate = &tstate->interp->gc;
Victor Stinner67e0de62019-11-20 11:48:18 +01002099 if (!(gcstate->debug & DEBUG_SAVEALL)
2100 && gcstate->garbage != NULL && PyList_GET_SIZE(gcstate->garbage) > 0) {
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02002101 const char *message;
Victor Stinner67e0de62019-11-20 11:48:18 +01002102 if (gcstate->debug & DEBUG_UNCOLLECTABLE)
Antoine Pitroub5d82042010-11-05 00:05:25 +00002103 message = "gc: %zd uncollectable objects at " \
Georg Brandl08be72d2010-10-24 15:11:22 +00002104 "shutdown";
2105 else
Antoine Pitroub5d82042010-11-05 00:05:25 +00002106 message = "gc: %zd uncollectable objects at " \
Georg Brandl08be72d2010-10-24 15:11:22 +00002107 "shutdown; use gc.set_debug(gc.DEBUG_UNCOLLECTABLE) to list them";
Antoine Pitrou070cb3c2013-05-08 13:23:25 +02002108 /* PyErr_WarnFormat does too many things and we are at shutdown,
2109 the warnings module's dependencies (e.g. linecache) may be gone
2110 already. */
2111 if (PyErr_WarnExplicitFormat(PyExc_ResourceWarning, "gc", 0,
2112 "gc", NULL, message,
Victor Stinner67e0de62019-11-20 11:48:18 +01002113 PyList_GET_SIZE(gcstate->garbage)))
Georg Brandl08be72d2010-10-24 15:11:22 +00002114 PyErr_WriteUnraisable(NULL);
Victor Stinner67e0de62019-11-20 11:48:18 +01002115 if (gcstate->debug & DEBUG_UNCOLLECTABLE) {
Antoine Pitrou696e0352010-08-08 22:18:46 +00002116 PyObject *repr = NULL, *bytes = NULL;
Victor Stinner67e0de62019-11-20 11:48:18 +01002117 repr = PyObject_Repr(gcstate->garbage);
Antoine Pitrou696e0352010-08-08 22:18:46 +00002118 if (!repr || !(bytes = PyUnicode_EncodeFSDefault(repr)))
Victor Stinner67e0de62019-11-20 11:48:18 +01002119 PyErr_WriteUnraisable(gcstate->garbage);
Antoine Pitrou696e0352010-08-08 22:18:46 +00002120 else {
2121 PySys_WriteStderr(
Antoine Pitrou070cb3c2013-05-08 13:23:25 +02002122 " %s\n",
Antoine Pitrou696e0352010-08-08 22:18:46 +00002123 PyBytes_AS_STRING(bytes)
2124 );
2125 }
2126 Py_XDECREF(repr);
2127 Py_XDECREF(bytes);
2128 }
Antoine Pitrou696e0352010-08-08 22:18:46 +00002129 }
Antoine Pitrou5f454a02013-05-06 21:15:57 +02002130}
2131
2132void
Victor Stinner7eee5be2019-11-20 10:38:34 +01002133_PyGC_Fini(PyThreadState *tstate)
Antoine Pitrou5f454a02013-05-06 21:15:57 +02002134{
Victor Stinner72474072019-11-20 12:25:50 +01002135 GCState *gcstate = &tstate->interp->gc;
Victor Stinner67e0de62019-11-20 11:48:18 +01002136 Py_CLEAR(gcstate->garbage);
2137 Py_CLEAR(gcstate->callbacks);
Antoine Pitrou696e0352010-08-08 22:18:46 +00002138}
2139
Neil Schemenauer43411b52001-08-30 00:05:51 +00002140/* for debugging */
Guido van Rossume13ddc92003-04-17 17:29:22 +00002141void
2142_PyGC_Dump(PyGC_Head *g)
Neil Schemenauer43411b52001-08-30 00:05:51 +00002143{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002144 _PyObject_Dump(FROM_GC(g));
Neil Schemenauer43411b52001-08-30 00:05:51 +00002145}
2146
Victor Stinnera5447732019-10-10 09:32:13 +02002147
2148#ifdef Py_DEBUG
Victor Stinner1b184552019-10-08 00:09:31 +02002149static int
2150visit_validate(PyObject *op, void *parent_raw)
2151{
2152 PyObject *parent = _PyObject_CAST(parent_raw);
2153 if (_PyObject_IsFreed(op)) {
2154 _PyObject_ASSERT_FAILED_MSG(parent,
2155 "PyObject_GC_Track() object is not valid");
2156 }
2157 return 0;
2158}
Victor Stinnera5447732019-10-10 09:32:13 +02002159#endif
Victor Stinner1b184552019-10-08 00:09:31 +02002160
2161
Neil Schemenauer43411b52001-08-30 00:05:51 +00002162/* extension modules might be compiled with GC support so these
2163 functions must always be available */
2164
2165void
Victor Stinnera42de742018-11-22 10:25:22 +01002166PyObject_GC_Track(void *op_raw)
Neil Schemenauer43411b52001-08-30 00:05:51 +00002167{
Victor Stinnera42de742018-11-22 10:25:22 +01002168 PyObject *op = _PyObject_CAST(op_raw);
Victor Stinner271753a2018-11-22 01:02:54 +01002169 if (_PyObject_GC_IS_TRACKED(op)) {
2170 _PyObject_ASSERT_FAILED_MSG(op,
2171 "object already tracked "
2172 "by the garbage collector");
2173 }
Victor Stinnera42de742018-11-22 10:25:22 +01002174 _PyObject_GC_TRACK(op);
Victor Stinner1b184552019-10-08 00:09:31 +02002175
2176#ifdef Py_DEBUG
2177 /* Check that the object is valid: validate objects traversed
2178 by tp_traverse() */
2179 traverseproc traverse = Py_TYPE(op)->tp_traverse;
2180 (void)traverse(op, visit_validate, op);
2181#endif
Neil Schemenauer43411b52001-08-30 00:05:51 +00002182}
2183
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00002184void
Victor Stinnera42de742018-11-22 10:25:22 +01002185PyObject_GC_UnTrack(void *op_raw)
Neil Schemenauer43411b52001-08-30 00:05:51 +00002186{
Victor Stinnera42de742018-11-22 10:25:22 +01002187 PyObject *op = _PyObject_CAST(op_raw);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002188 /* Obscure: the Py_TRASHCAN mechanism requires that we be able to
2189 * call PyObject_GC_UnTrack twice on an object.
2190 */
INADA Naoki5ac9e6e2018-07-10 17:19:53 +09002191 if (_PyObject_GC_IS_TRACKED(op)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002192 _PyObject_GC_UNTRACK(op);
INADA Naoki5ac9e6e2018-07-10 17:19:53 +09002193 }
Neil Schemenauer43411b52001-08-30 00:05:51 +00002194}
2195
Hai Shi675d9a32020-04-15 02:11:20 +08002196int
2197PyObject_IS_GC(PyObject *obj)
2198{
2199 return _PyObject_IS_GC(obj);
2200}
2201
Victor Stinnerdb067af2014-05-02 22:31:14 +02002202static PyObject *
2203_PyObject_GC_Alloc(int use_calloc, size_t basicsize)
Neil Schemenauer43411b52001-08-30 00:05:51 +00002204{
Victor Stinner67e0de62019-11-20 11:48:18 +01002205 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner72474072019-11-20 12:25:50 +01002206 GCState *gcstate = &tstate->interp->gc;
Victor Stinner2e969062019-11-20 01:49:32 +01002207 if (basicsize > PY_SSIZE_T_MAX - sizeof(PyGC_Head)) {
Victor Stinner67e0de62019-11-20 11:48:18 +01002208 return _PyErr_NoMemory(tstate);
Victor Stinner2e969062019-11-20 01:49:32 +01002209 }
2210 size_t size = sizeof(PyGC_Head) + basicsize;
2211
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002212 PyGC_Head *g;
Victor Stinner2e969062019-11-20 01:49:32 +01002213 if (use_calloc) {
Victor Stinnerdb067af2014-05-02 22:31:14 +02002214 g = (PyGC_Head *)PyObject_Calloc(1, size);
Victor Stinner2e969062019-11-20 01:49:32 +01002215 }
2216 else {
Victor Stinnerdb067af2014-05-02 22:31:14 +02002217 g = (PyGC_Head *)PyObject_Malloc(size);
Victor Stinner2e969062019-11-20 01:49:32 +01002218 }
2219 if (g == NULL) {
Victor Stinner67e0de62019-11-20 11:48:18 +01002220 return _PyErr_NoMemory(tstate);
Victor Stinner2e969062019-11-20 01:49:32 +01002221 }
INADA Naoki5ac9e6e2018-07-10 17:19:53 +09002222 assert(((uintptr_t)g & 3) == 0); // g must be aligned 4bytes boundary
Victor Stinner2e969062019-11-20 01:49:32 +01002223
INADA Naoki5ac9e6e2018-07-10 17:19:53 +09002224 g->_gc_next = 0;
2225 g->_gc_prev = 0;
Victor Stinner67e0de62019-11-20 11:48:18 +01002226 gcstate->generations[0].count++; /* number of allocated GC objects */
2227 if (gcstate->generations[0].count > gcstate->generations[0].threshold &&
2228 gcstate->enabled &&
2229 gcstate->generations[0].threshold &&
2230 !gcstate->collecting &&
2231 !_PyErr_Occurred(tstate))
Victor Stinner2e969062019-11-20 01:49:32 +01002232 {
Victor Stinner67e0de62019-11-20 11:48:18 +01002233 gcstate->collecting = 1;
Victor Stinner8b341482020-10-30 17:00:00 +01002234 gc_collect_generations(tstate);
Victor Stinner67e0de62019-11-20 11:48:18 +01002235 gcstate->collecting = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002236 }
Victor Stinner2e969062019-11-20 01:49:32 +01002237 PyObject *op = FROM_GC(g);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002238 return op;
Neil Schemenauer43411b52001-08-30 00:05:51 +00002239}
2240
2241PyObject *
Victor Stinnerdb067af2014-05-02 22:31:14 +02002242_PyObject_GC_Malloc(size_t basicsize)
2243{
2244 return _PyObject_GC_Alloc(0, basicsize);
2245}
2246
2247PyObject *
2248_PyObject_GC_Calloc(size_t basicsize)
2249{
2250 return _PyObject_GC_Alloc(1, basicsize);
2251}
2252
2253PyObject *
Neil Schemenauer43411b52001-08-30 00:05:51 +00002254_PyObject_GC_New(PyTypeObject *tp)
2255{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002256 PyObject *op = _PyObject_GC_Malloc(_PyObject_SIZE(tp));
Victor Stinner04fc4f22020-06-16 01:28:07 +02002257 if (op == NULL) {
2258 return NULL;
2259 }
2260 _PyObject_Init(op, tp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002261 return op;
Neil Schemenauer43411b52001-08-30 00:05:51 +00002262}
2263
2264PyVarObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00002265_PyObject_GC_NewVar(PyTypeObject *tp, Py_ssize_t nitems)
Neil Schemenauer43411b52001-08-30 00:05:51 +00002266{
Victor Stinner5d1866c2013-07-08 22:17:52 +02002267 size_t size;
2268 PyVarObject *op;
2269
2270 if (nitems < 0) {
2271 PyErr_BadInternalCall();
2272 return NULL;
2273 }
2274 size = _PyObject_VAR_SIZE(tp, nitems);
2275 op = (PyVarObject *) _PyObject_GC_Malloc(size);
Victor Stinner04fc4f22020-06-16 01:28:07 +02002276 if (op == NULL) {
2277 return NULL;
2278 }
2279 _PyObject_InitVar(op, tp, nitems);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002280 return op;
Neil Schemenauer43411b52001-08-30 00:05:51 +00002281}
2282
2283PyVarObject *
Martin v. Löwis41290682006-02-16 14:56:14 +00002284_PyObject_GC_Resize(PyVarObject *op, Py_ssize_t nitems)
Neil Schemenauer43411b52001-08-30 00:05:51 +00002285{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002286 const size_t basicsize = _PyObject_VAR_SIZE(Py_TYPE(op), nitems);
Victor Stinnera4b2bc72018-10-26 18:00:13 +02002287 _PyObject_ASSERT((PyObject *)op, !_PyObject_GC_IS_TRACKED(op));
2288 if (basicsize > PY_SSIZE_T_MAX - sizeof(PyGC_Head)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002289 return (PyVarObject *)PyErr_NoMemory();
Victor Stinnera4b2bc72018-10-26 18:00:13 +02002290 }
2291
2292 PyGC_Head *g = AS_GC(op);
Victor Stinner32bd68c2020-12-01 10:37:39 +01002293 g = (PyGC_Head *)PyObject_Realloc(g, sizeof(PyGC_Head) + basicsize);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002294 if (g == NULL)
2295 return (PyVarObject *)PyErr_NoMemory();
2296 op = (PyVarObject *) FROM_GC(g);
Victor Stinner60ac6ed2020-02-07 23:18:08 +01002297 Py_SET_SIZE(op, nitems);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002298 return op;
Neil Schemenauer43411b52001-08-30 00:05:51 +00002299}
2300
2301void
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00002302PyObject_GC_Del(void *op)
Neil Schemenauer43411b52001-08-30 00:05:51 +00002303{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002304 PyGC_Head *g = AS_GC(op);
INADA Naoki5ac9e6e2018-07-10 17:19:53 +09002305 if (_PyObject_GC_IS_TRACKED(op)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002306 gc_list_remove(g);
INADA Naoki5ac9e6e2018-07-10 17:19:53 +09002307 }
Victor Stinner1bcc32f2020-06-10 20:08:26 +02002308 GCState *gcstate = get_gc_state();
Victor Stinner67e0de62019-11-20 11:48:18 +01002309 if (gcstate->generations[0].count > 0) {
2310 gcstate->generations[0].count--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002311 }
Victor Stinner32bd68c2020-12-01 10:37:39 +01002312 PyObject_Free(g);
Neil Schemenauer43411b52001-08-30 00:05:51 +00002313}
Pablo Galindof13072b2020-04-11 01:21:54 +01002314
2315int
2316PyObject_GC_IsTracked(PyObject* obj)
2317{
Hai Shi675d9a32020-04-15 02:11:20 +08002318 if (_PyObject_IS_GC(obj) && _PyObject_GC_IS_TRACKED(obj)) {
Pablo Galindof13072b2020-04-11 01:21:54 +01002319 return 1;
2320 }
2321 return 0;
2322}
2323
2324int
2325PyObject_GC_IsFinalized(PyObject *obj)
2326{
Hai Shi675d9a32020-04-15 02:11:20 +08002327 if (_PyObject_IS_GC(obj) && _PyGCHead_FINALIZED(AS_GC(obj))) {
Pablo Galindof13072b2020-04-11 01:21:54 +01002328 return 1;
2329 }
2330 return 0;
2331}