blob: f782dd0923b6cdd0f51f8e784d1b4d766ec8e895 [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"
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000027#include "frameobject.h" /* for PyFrame_ClearFreeList */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000028
Neil Schemenauer43411b52001-08-30 00:05:51 +000029/* Get an object's GC head */
30#define AS_GC(o) ((PyGC_Head *)(o)-1)
31
32/* Get the object given the GC head */
33#define FROM_GC(g) ((PyObject *)(((PyGC_Head *)g)+1))
34
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000035/*** Global GC state ***/
36
Neil Schemenauer2880ae52002-05-04 05:35:20 +000037struct gc_generation {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000038 PyGC_Head head;
39 int threshold; /* collection threshold */
40 int count; /* count of allocations or collections of younger
41 generations */
Neil Schemenauer2880ae52002-05-04 05:35:20 +000042};
43
44#define NUM_GENERATIONS 3
45#define GEN_HEAD(n) (&generations[n].head)
46
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000047/* linked lists of container objects */
Neil Schemenauer2880ae52002-05-04 05:35:20 +000048static struct gc_generation generations[NUM_GENERATIONS] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000049 /* PyGC_Head, threshold, count */
50 {{{GEN_HEAD(0), GEN_HEAD(0), 0}}, 700, 0},
51 {{{GEN_HEAD(1), GEN_HEAD(1), 0}}, 10, 0},
52 {{{GEN_HEAD(2), GEN_HEAD(2), 0}}, 10, 0},
Neil Schemenauer2880ae52002-05-04 05:35:20 +000053};
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000054
Neil Schemenauer2880ae52002-05-04 05:35:20 +000055PyGC_Head *_PyGC_generation0 = GEN_HEAD(0);
56
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +000057static int enabled = 1; /* automatic collection enabled? */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000058
Neil Schemenauer43411b52001-08-30 00:05:51 +000059/* true if we are currently running the collector */
Tim Petersbf384c22003-04-06 00:11:39 +000060static int collecting = 0;
Neil Schemenauer43411b52001-08-30 00:05:51 +000061
Tim Peters6fc13d92002-07-02 18:12:35 +000062/* list of uncollectable objects */
Tim Petersbf384c22003-04-06 00:11:39 +000063static PyObject *garbage = NULL;
Tim Peters6fc13d92002-07-02 18:12:35 +000064
65/* Python string to use if unhandled exception occurs */
Tim Petersbf384c22003-04-06 00:11:39 +000066static PyObject *gc_str = NULL;
Tim Peters6fc13d92002-07-02 18:12:35 +000067
Kristján Valur Jónsson69c63522012-04-15 11:41:32 +000068/* a list of callbacks to be invoked when collection is performed */
69static PyObject *callbacks = NULL;
70
71/* This is the number of objects that survived the last full collection. It
Antoine Pitrou14b78f52009-01-09 22:27:08 +000072 approximates the number of long lived objects tracked by the GC.
73
74 (by "full collection", we mean a collection of the oldest generation).
75*/
76static Py_ssize_t long_lived_total = 0;
77
Kristján Valur Jónsson69c63522012-04-15 11:41:32 +000078/* This is the number of objects that survived all "non-full" collections,
Antoine Pitrou14b78f52009-01-09 22:27:08 +000079 and are awaiting to undergo a full collection for the first time.
80
81*/
82static Py_ssize_t long_lived_pending = 0;
83
84/*
85 NOTE: about the counting of long-lived objects.
86
87 To limit the cost of garbage collection, there are two strategies;
88 - make each collection faster, e.g. by scanning fewer objects
89 - do less collections
90 This heuristic is about the latter strategy.
91
92 In addition to the various configurable thresholds, we only trigger a
93 full collection if the ratio
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000094 long_lived_pending / long_lived_total
Antoine Pitrou14b78f52009-01-09 22:27:08 +000095 is above a given value (hardwired to 25%).
96
97 The reason is that, while "non-full" collections (i.e., collections of
98 the young and middle generations) will always examine roughly the same
99 number of objects -- determined by the aforementioned thresholds --,
100 the cost of a full collection is proportional to the total number of
101 long-lived objects, which is virtually unbounded.
102
103 Indeed, it has been remarked that doing a full collection every
104 <constant number> of object creations entails a dramatic performance
105 degradation in workloads which consist in creating and storing lots of
106 long-lived objects (e.g. building a large list of GC-tracked objects would
107 show quadratic performance, instead of linear as expected: see issue #4074).
108
109 Using the above ratio, instead, yields amortized linear performance in
110 the total number of objects (the effect of which can be summarized
111 thusly: "each full garbage collection is more and more costly as the
112 number of objects grows, but we do fewer and fewer of them").
113
114 This heuristic was suggested by Martin von Löwis on python-dev in
115 June 2008. His original analysis and proposal can be found at:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000116 http://mail.python.org/pipermail/python-dev/2008-June/080579.html
Antoine Pitrou14b78f52009-01-09 22:27:08 +0000117*/
118
Antoine Pitroue1ad3da2012-05-28 22:22:34 +0200119/*
120 NOTE: about untracking of mutable objects.
121
122 Certain types of container cannot participate in a reference cycle, and
123 so do not need to be tracked by the garbage collector. Untracking these
124 objects reduces the cost of garbage collections. However, determining
125 which objects may be untracked is not free, and the costs must be
126 weighed against the benefits for garbage collection.
127
128 There are two possible strategies for when to untrack a container:
129
130 i) When the container is created.
131 ii) When the container is examined by the garbage collector.
132
133 Tuples containing only immutable objects (integers, strings etc, and
134 recursively, tuples of immutable objects) do not need to be tracked.
135 The interpreter creates a large number of tuples, many of which will
136 not survive until garbage collection. It is therefore not worthwhile
137 to untrack eligible tuples at creation time.
138
139 Instead, all tuples except the empty tuple are tracked when created.
140 During garbage collection it is determined whether any surviving tuples
141 can be untracked. A tuple can be untracked if all of its contents are
142 already not tracked. Tuples are examined for untracking in all garbage
143 collection cycles. It may take more than one cycle to untrack a tuple.
144
145 Dictionaries containing only immutable objects also do not need to be
146 tracked. Dictionaries are untracked when created. If a tracked item is
147 inserted into a dictionary (either as a key or value), the dictionary
148 becomes tracked. During a full garbage collection (all generations),
149 the collector will untrack any dictionaries whose contents are not
150 tracked.
151
152 The module provides the python function is_tracked(obj), which returns
153 the CURRENT tracking status of the object. Subsequent garbage
154 collections may change the tracking status of the object.
155
156 Untracking of certain containers was introduced in issue #4688, and
157 the algorithm was refined in response to issue #14775.
158*/
Antoine Pitrou14b78f52009-01-09 22:27:08 +0000159
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000160/* set for debugging information */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000161#define DEBUG_STATS (1<<0) /* print collection statistics */
162#define DEBUG_COLLECTABLE (1<<1) /* print collectable objects */
163#define DEBUG_UNCOLLECTABLE (1<<2) /* print uncollectable objects */
164#define DEBUG_SAVEALL (1<<5) /* save all garbage in gc.garbage */
165#define DEBUG_LEAK DEBUG_COLLECTABLE | \
166 DEBUG_UNCOLLECTABLE | \
167 DEBUG_SAVEALL
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000168static int debug;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000169static PyObject *tmod = NULL;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000170
Tim Peters6fc13d92002-07-02 18:12:35 +0000171/*--------------------------------------------------------------------------
172gc_refs values.
Neil Schemenauer43411b52001-08-30 00:05:51 +0000173
Tim Peters6fc13d92002-07-02 18:12:35 +0000174Between collections, every gc'ed object has one of two gc_refs values:
175
176GC_UNTRACKED
177 The initial state; objects returned by PyObject_GC_Malloc are in this
178 state. The object doesn't live in any generation list, and its
179 tp_traverse slot must not be called.
180
181GC_REACHABLE
182 The object lives in some generation list, and its tp_traverse is safe to
183 call. An object transitions to GC_REACHABLE when PyObject_GC_Track
184 is called.
185
186During a collection, gc_refs can temporarily take on other states:
187
188>= 0
189 At the start of a collection, update_refs() copies the true refcount
190 to gc_refs, for each object in the generation being collected.
191 subtract_refs() then adjusts gc_refs so that it equals the number of
192 times an object is referenced directly from outside the generation
193 being collected.
Martin v. Löwis774348c2002-11-09 19:54:06 +0000194 gc_refs remains >= 0 throughout these steps.
Tim Peters6fc13d92002-07-02 18:12:35 +0000195
196GC_TENTATIVELY_UNREACHABLE
197 move_unreachable() then moves objects not reachable (whether directly or
198 indirectly) from outside the generation into an "unreachable" set.
199 Objects that are found to be reachable have gc_refs set to GC_REACHABLE
200 again. Objects that are found to be unreachable have gc_refs set to
201 GC_TENTATIVELY_UNREACHABLE. It's "tentatively" because the pass doing
202 this can't be sure until it ends, and GC_TENTATIVELY_UNREACHABLE may
203 transition back to GC_REACHABLE.
204
205 Only objects with GC_TENTATIVELY_UNREACHABLE still set are candidates
206 for collection. If it's decided not to collect such an object (e.g.,
207 it has a __del__ method), its gc_refs is restored to GC_REACHABLE again.
208----------------------------------------------------------------------------
209*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000210#define GC_UNTRACKED _PyGC_REFS_UNTRACKED
211#define GC_REACHABLE _PyGC_REFS_REACHABLE
212#define GC_TENTATIVELY_UNREACHABLE _PyGC_REFS_TENTATIVELY_UNREACHABLE
Tim Peters19b74c72002-07-01 03:52:19 +0000213
Tim Peters6fc13d92002-07-02 18:12:35 +0000214#define IS_TRACKED(o) ((AS_GC(o))->gc.gc_refs != GC_UNTRACKED)
Tim Peters19b74c72002-07-01 03:52:19 +0000215#define IS_REACHABLE(o) ((AS_GC(o))->gc.gc_refs == GC_REACHABLE)
216#define IS_TENTATIVELY_UNREACHABLE(o) ( \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000217 (AS_GC(o))->gc.gc_refs == GC_TENTATIVELY_UNREACHABLE)
Neil Schemenauera2b11ec2002-05-21 15:53:24 +0000218
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000219/*** list functions ***/
220
221static void
222gc_list_init(PyGC_Head *list)
223{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000224 list->gc.gc_prev = list;
225 list->gc.gc_next = list;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000226}
227
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000228static int
229gc_list_is_empty(PyGC_Head *list)
230{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000231 return (list->gc.gc_next == list);
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000232}
233
Tim Peterse2d59182004-11-01 01:39:08 +0000234#if 0
235/* This became unused after gc_list_move() was introduced. */
236/* Append `node` to `list`. */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000237static void
238gc_list_append(PyGC_Head *node, PyGC_Head *list)
239{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000240 node->gc.gc_next = list;
241 node->gc.gc_prev = list->gc.gc_prev;
242 node->gc.gc_prev->gc.gc_next = node;
243 list->gc.gc_prev = node;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000244}
Tim Peterse2d59182004-11-01 01:39:08 +0000245#endif
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000246
Tim Peterse2d59182004-11-01 01:39:08 +0000247/* Remove `node` from the gc list it's currently in. */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000248static void
249gc_list_remove(PyGC_Head *node)
250{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000251 node->gc.gc_prev->gc.gc_next = node->gc.gc_next;
252 node->gc.gc_next->gc.gc_prev = node->gc.gc_prev;
253 node->gc.gc_next = NULL; /* object is not currently tracked */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000254}
255
Tim Peterse2d59182004-11-01 01:39:08 +0000256/* Move `node` from the gc list it's currently in (which is not explicitly
257 * named here) to the end of `list`. This is semantically the same as
258 * gc_list_remove(node) followed by gc_list_append(node, list).
259 */
260static void
261gc_list_move(PyGC_Head *node, PyGC_Head *list)
262{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000263 PyGC_Head *new_prev;
264 PyGC_Head *current_prev = node->gc.gc_prev;
265 PyGC_Head *current_next = node->gc.gc_next;
266 /* Unlink from current list. */
267 current_prev->gc.gc_next = current_next;
268 current_next->gc.gc_prev = current_prev;
269 /* Relink at end of new list. */
270 new_prev = node->gc.gc_prev = list->gc.gc_prev;
271 new_prev->gc.gc_next = list->gc.gc_prev = node;
272 node->gc.gc_next = list;
Tim Peterse2d59182004-11-01 01:39:08 +0000273}
274
275/* append list `from` onto list `to`; `from` becomes an empty list */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000276static void
277gc_list_merge(PyGC_Head *from, PyGC_Head *to)
278{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000279 PyGC_Head *tail;
280 assert(from != to);
281 if (!gc_list_is_empty(from)) {
282 tail = to->gc.gc_prev;
283 tail->gc.gc_next = from->gc.gc_next;
284 tail->gc.gc_next->gc.gc_prev = tail;
285 to->gc.gc_prev = from->gc.gc_prev;
286 to->gc.gc_prev->gc.gc_next = to;
287 }
288 gc_list_init(from);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000289}
290
Neal Norwitz7b216c52006-03-04 20:01:53 +0000291static Py_ssize_t
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000292gc_list_size(PyGC_Head *list)
293{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000294 PyGC_Head *gc;
295 Py_ssize_t n = 0;
296 for (gc = list->gc.gc_next; gc != list; gc = gc->gc.gc_next) {
297 n++;
298 }
299 return n;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000300}
301
Tim Peters259272b2003-04-06 19:41:39 +0000302/* Append objects in a GC list to a Python list.
303 * Return 0 if all OK, < 0 if error (out of memory for list).
304 */
305static int
306append_objects(PyObject *py_list, PyGC_Head *gc_list)
307{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000308 PyGC_Head *gc;
309 for (gc = gc_list->gc.gc_next; gc != gc_list; gc = gc->gc.gc_next) {
310 PyObject *op = FROM_GC(gc);
311 if (op != py_list) {
312 if (PyList_Append(py_list, op)) {
313 return -1; /* exception */
314 }
315 }
316 }
317 return 0;
Tim Peters259272b2003-04-06 19:41:39 +0000318}
319
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000320/*** end of list stuff ***/
321
322
Tim Peters19b74c72002-07-01 03:52:19 +0000323/* Set all gc_refs = ob_refcnt. After this, gc_refs is > 0 for all objects
324 * in containers, and is GC_REACHABLE for all tracked gc objects not in
325 * containers.
Tim Peters88396172002-06-30 17:56:40 +0000326 */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000327static void
328update_refs(PyGC_Head *containers)
329{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000330 PyGC_Head *gc = containers->gc.gc_next;
331 for (; gc != containers; gc = gc->gc.gc_next) {
332 assert(gc->gc.gc_refs == GC_REACHABLE);
333 gc->gc.gc_refs = Py_REFCNT(FROM_GC(gc));
334 /* Python's cyclic gc should never see an incoming refcount
335 * of 0: if something decref'ed to 0, it should have been
336 * deallocated immediately at that time.
337 * Possible cause (if the assert triggers): a tp_dealloc
338 * routine left a gc-aware object tracked during its teardown
339 * phase, and did something-- or allowed something to happen --
340 * that called back into Python. gc can trigger then, and may
341 * see the still-tracked dying object. Before this assert
342 * was added, such mistakes went on to allow gc to try to
343 * delete the object again. In a debug build, that caused
344 * a mysterious segfault, when _Py_ForgetReference tried
345 * to remove the object from the doubly-linked list of all
346 * objects a second time. In a release build, an actual
347 * double deallocation occurred, which leads to corruption
348 * of the allocator's internal bookkeeping pointers. That's
349 * so serious that maybe this should be a release-build
350 * check instead of an assert?
351 */
352 assert(gc->gc.gc_refs != 0);
353 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000354}
355
Tim Peters19b74c72002-07-01 03:52:19 +0000356/* A traversal callback for subtract_refs. */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000357static int
358visit_decref(PyObject *op, void *data)
359{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000360 assert(op != NULL);
361 if (PyObject_IS_GC(op)) {
362 PyGC_Head *gc = AS_GC(op);
363 /* We're only interested in gc_refs for objects in the
364 * generation being collected, which can be recognized
365 * because only they have positive gc_refs.
366 */
367 assert(gc->gc.gc_refs != 0); /* else refcount was too small */
368 if (gc->gc.gc_refs > 0)
369 gc->gc.gc_refs--;
370 }
371 return 0;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000372}
373
Tim Peters19b74c72002-07-01 03:52:19 +0000374/* Subtract internal references from gc_refs. After this, gc_refs is >= 0
375 * for all objects in containers, and is GC_REACHABLE for all tracked gc
376 * objects not in containers. The ones with gc_refs > 0 are directly
377 * reachable from outside containers, and so can't be collected.
378 */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000379static void
380subtract_refs(PyGC_Head *containers)
381{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000382 traverseproc traverse;
383 PyGC_Head *gc = containers->gc.gc_next;
384 for (; gc != containers; gc=gc->gc.gc_next) {
385 traverse = Py_TYPE(FROM_GC(gc))->tp_traverse;
386 (void) traverse(FROM_GC(gc),
387 (visitproc)visit_decref,
388 NULL);
389 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000390}
391
Tim Peters19b74c72002-07-01 03:52:19 +0000392/* A traversal callback for move_unreachable. */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000393static int
Tim Peters19b74c72002-07-01 03:52:19 +0000394visit_reachable(PyObject *op, PyGC_Head *reachable)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000395{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000396 if (PyObject_IS_GC(op)) {
397 PyGC_Head *gc = AS_GC(op);
398 const Py_ssize_t gc_refs = gc->gc.gc_refs;
Tim Peters19b74c72002-07-01 03:52:19 +0000399
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000400 if (gc_refs == 0) {
401 /* This is in move_unreachable's 'young' list, but
402 * the traversal hasn't yet gotten to it. All
403 * we need to do is tell move_unreachable that it's
404 * reachable.
405 */
406 gc->gc.gc_refs = 1;
407 }
408 else if (gc_refs == GC_TENTATIVELY_UNREACHABLE) {
409 /* This had gc_refs = 0 when move_unreachable got
410 * to it, but turns out it's reachable after all.
411 * Move it back to move_unreachable's 'young' list,
412 * and move_unreachable will eventually get to it
413 * again.
414 */
415 gc_list_move(gc, reachable);
416 gc->gc.gc_refs = 1;
417 }
418 /* Else there's nothing to do.
419 * If gc_refs > 0, it must be in move_unreachable's 'young'
420 * list, and move_unreachable will eventually get to it.
421 * If gc_refs == GC_REACHABLE, it's either in some other
422 * generation so we don't care about it, or move_unreachable
423 * already dealt with it.
424 * If gc_refs == GC_UNTRACKED, it must be ignored.
425 */
426 else {
427 assert(gc_refs > 0
428 || gc_refs == GC_REACHABLE
429 || gc_refs == GC_UNTRACKED);
430 }
431 }
432 return 0;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000433}
434
Tim Peters19b74c72002-07-01 03:52:19 +0000435/* Move the unreachable objects from young to unreachable. After this,
436 * all objects in young have gc_refs = GC_REACHABLE, and all objects in
437 * unreachable have gc_refs = GC_TENTATIVELY_UNREACHABLE. All tracked
438 * gc objects not in young or unreachable still have gc_refs = GC_REACHABLE.
439 * All objects in young after this are directly or indirectly reachable
440 * from outside the original young; and all objects in unreachable are
441 * not.
Tim Peters88396172002-06-30 17:56:40 +0000442 */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000443static void
Tim Peters19b74c72002-07-01 03:52:19 +0000444move_unreachable(PyGC_Head *young, PyGC_Head *unreachable)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000445{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000446 PyGC_Head *gc = young->gc.gc_next;
Tim Peters19b74c72002-07-01 03:52:19 +0000447
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000448 /* Invariants: all objects "to the left" of us in young have gc_refs
449 * = GC_REACHABLE, and are indeed reachable (directly or indirectly)
450 * from outside the young list as it was at entry. All other objects
451 * from the original young "to the left" of us are in unreachable now,
452 * and have gc_refs = GC_TENTATIVELY_UNREACHABLE. All objects to the
453 * left of us in 'young' now have been scanned, and no objects here
454 * or to the right have been scanned yet.
455 */
Tim Peters19b74c72002-07-01 03:52:19 +0000456
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000457 while (gc != young) {
458 PyGC_Head *next;
Tim Peters19b74c72002-07-01 03:52:19 +0000459
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000460 if (gc->gc.gc_refs) {
461 /* gc is definitely reachable from outside the
462 * original 'young'. Mark it as such, and traverse
463 * its pointers to find any other objects that may
464 * be directly reachable from it. Note that the
465 * call to tp_traverse may append objects to young,
466 * so we have to wait until it returns to determine
467 * the next object to visit.
468 */
469 PyObject *op = FROM_GC(gc);
470 traverseproc traverse = Py_TYPE(op)->tp_traverse;
471 assert(gc->gc.gc_refs > 0);
472 gc->gc.gc_refs = GC_REACHABLE;
473 (void) traverse(op,
474 (visitproc)visit_reachable,
475 (void *)young);
476 next = gc->gc.gc_next;
477 if (PyTuple_CheckExact(op)) {
478 _PyTuple_MaybeUntrack(op);
479 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000480 }
481 else {
482 /* This *may* be unreachable. To make progress,
483 * assume it is. gc isn't directly reachable from
484 * any object we've already traversed, but may be
485 * reachable from an object we haven't gotten to yet.
486 * visit_reachable will eventually move gc back into
487 * young if that's so, and we'll see it again.
488 */
489 next = gc->gc.gc_next;
490 gc_list_move(gc, unreachable);
491 gc->gc.gc_refs = GC_TENTATIVELY_UNREACHABLE;
492 }
493 gc = next;
494 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000495}
496
Antoine Pitroue1ad3da2012-05-28 22:22:34 +0200497/* Try to untrack all currently tracked dictionaries */
498static void
499untrack_dicts(PyGC_Head *head)
500{
501 PyGC_Head *next, *gc = head->gc.gc_next;
502 while (gc != head) {
503 PyObject *op = FROM_GC(gc);
504 next = gc->gc.gc_next;
505 if (PyDict_CheckExact(op))
506 _PyDict_MaybeUntrack(op);
507 gc = next;
508 }
509}
510
Amaury Forgeot d'Arcad8dcd52007-12-10 23:58:35 +0000511/* Return true if object has a finalization method. */
Neil Schemenauera765c122001-11-01 17:35:23 +0000512static int
513has_finalizer(PyObject *op)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000514{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000515 if (PyGen_CheckExact(op))
516 return PyGen_NeedsFinalizing((PyGenObject *)op);
517 else
518 return op->ob_type->tp_del != NULL;
Neil Schemenauera765c122001-11-01 17:35:23 +0000519}
520
Tim Petersead8b7a2004-10-30 23:09:22 +0000521/* Move the objects in unreachable with __del__ methods into `finalizers`.
522 * Objects moved into `finalizers` have gc_refs set to GC_REACHABLE; the
523 * objects remaining in unreachable are left at GC_TENTATIVELY_UNREACHABLE.
Jeremy Hyltonce136e92003-04-04 19:59:06 +0000524 */
Neil Schemenauera765c122001-11-01 17:35:23 +0000525static void
Tim Petersead8b7a2004-10-30 23:09:22 +0000526move_finalizers(PyGC_Head *unreachable, PyGC_Head *finalizers)
Neil Schemenauera765c122001-11-01 17:35:23 +0000527{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000528 PyGC_Head *gc;
529 PyGC_Head *next;
Tim Petersf6b80452003-04-07 19:21:15 +0000530
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000531 /* March over unreachable. Move objects with finalizers into
532 * `finalizers`.
533 */
534 for (gc = unreachable->gc.gc_next; gc != unreachable; gc = next) {
535 PyObject *op = FROM_GC(gc);
Jeremy Hyltonce136e92003-04-04 19:59:06 +0000536
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000537 assert(IS_TENTATIVELY_UNREACHABLE(op));
538 next = gc->gc.gc_next;
Tim Petersf6ae7a42003-04-05 18:40:50 +0000539
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000540 if (has_finalizer(op)) {
541 gc_list_move(gc, finalizers);
542 gc->gc.gc_refs = GC_REACHABLE;
543 }
544 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000545}
546
Tim Peters19b74c72002-07-01 03:52:19 +0000547/* A traversal callback for move_finalizer_reachable. */
548static int
549visit_move(PyObject *op, PyGC_Head *tolist)
550{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000551 if (PyObject_IS_GC(op)) {
552 if (IS_TENTATIVELY_UNREACHABLE(op)) {
553 PyGC_Head *gc = AS_GC(op);
554 gc_list_move(gc, tolist);
555 gc->gc.gc_refs = GC_REACHABLE;
556 }
557 }
558 return 0;
Tim Peters19b74c72002-07-01 03:52:19 +0000559}
560
561/* Move objects that are reachable from finalizers, from the unreachable set
Tim Petersf6b80452003-04-07 19:21:15 +0000562 * into finalizers set.
Tim Peters19b74c72002-07-01 03:52:19 +0000563 */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000564static void
Tim Petersf6b80452003-04-07 19:21:15 +0000565move_finalizer_reachable(PyGC_Head *finalizers)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000566{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000567 traverseproc traverse;
568 PyGC_Head *gc = finalizers->gc.gc_next;
569 for (; gc != finalizers; gc = gc->gc.gc_next) {
570 /* Note that the finalizers list may grow during this. */
571 traverse = Py_TYPE(FROM_GC(gc))->tp_traverse;
572 (void) traverse(FROM_GC(gc),
573 (visitproc)visit_move,
574 (void *)finalizers);
575 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000576}
577
Tim Petersead8b7a2004-10-30 23:09:22 +0000578/* Clear all weakrefs to unreachable objects, and if such a weakref has a
579 * callback, invoke it if necessary. Note that it's possible for such
580 * weakrefs to be outside the unreachable set -- indeed, those are precisely
581 * the weakrefs whose callbacks must be invoked. See gc_weakref.txt for
582 * overview & some details. Some weakrefs with callbacks may be reclaimed
583 * directly by this routine; the number reclaimed is the return value. Other
584 * weakrefs with callbacks may be moved into the `old` generation. Objects
585 * moved into `old` have gc_refs set to GC_REACHABLE; the objects remaining in
586 * unreachable are left at GC_TENTATIVELY_UNREACHABLE. When this returns,
587 * no object in `unreachable` is weakly referenced anymore.
Tim Peters403a2032003-11-20 21:21:46 +0000588 */
589static int
Tim Petersead8b7a2004-10-30 23:09:22 +0000590handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
Tim Peters403a2032003-11-20 21:21:46 +0000591{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000592 PyGC_Head *gc;
593 PyObject *op; /* generally FROM_GC(gc) */
594 PyWeakReference *wr; /* generally a cast of op */
595 PyGC_Head wrcb_to_call; /* weakrefs with callbacks to call */
596 PyGC_Head *next;
597 int num_freed = 0;
Tim Peters403a2032003-11-20 21:21:46 +0000598
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599 gc_list_init(&wrcb_to_call);
Tim Peters403a2032003-11-20 21:21:46 +0000600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 /* Clear all weakrefs to the objects in unreachable. If such a weakref
602 * also has a callback, move it into `wrcb_to_call` if the callback
603 * needs to be invoked. Note that we cannot invoke any callbacks until
604 * all weakrefs to unreachable objects are cleared, lest the callback
605 * resurrect an unreachable object via a still-active weakref. We
606 * make another pass over wrcb_to_call, invoking callbacks, after this
607 * pass completes.
608 */
609 for (gc = unreachable->gc.gc_next; gc != unreachable; gc = next) {
610 PyWeakReference **wrlist;
Tim Petersead8b7a2004-10-30 23:09:22 +0000611
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000612 op = FROM_GC(gc);
613 assert(IS_TENTATIVELY_UNREACHABLE(op));
614 next = gc->gc.gc_next;
Tim Petersead8b7a2004-10-30 23:09:22 +0000615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000616 if (! PyType_SUPPORTS_WEAKREFS(Py_TYPE(op)))
617 continue;
Tim Petersead8b7a2004-10-30 23:09:22 +0000618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 /* It supports weakrefs. Does it have any? */
620 wrlist = (PyWeakReference **)
621 PyObject_GET_WEAKREFS_LISTPTR(op);
Tim Petersead8b7a2004-10-30 23:09:22 +0000622
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000623 /* `op` may have some weakrefs. March over the list, clear
624 * all the weakrefs, and move the weakrefs with callbacks
625 * that must be called into wrcb_to_call.
626 */
627 for (wr = *wrlist; wr != NULL; wr = *wrlist) {
628 PyGC_Head *wrasgc; /* AS_GC(wr) */
Tim Petersead8b7a2004-10-30 23:09:22 +0000629
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000630 /* _PyWeakref_ClearRef clears the weakref but leaves
631 * the callback pointer intact. Obscure: it also
632 * changes *wrlist.
633 */
634 assert(wr->wr_object == op);
635 _PyWeakref_ClearRef(wr);
636 assert(wr->wr_object == Py_None);
637 if (wr->wr_callback == NULL)
638 continue; /* no callback */
Tim Petersead8b7a2004-10-30 23:09:22 +0000639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000640 /* Headache time. `op` is going away, and is weakly referenced by
641 * `wr`, which has a callback. Should the callback be invoked? If wr
642 * is also trash, no:
643 *
644 * 1. There's no need to call it. The object and the weakref are
645 * both going away, so it's legitimate to pretend the weakref is
646 * going away first. The user has to ensure a weakref outlives its
647 * referent if they want a guarantee that the wr callback will get
648 * invoked.
649 *
650 * 2. It may be catastrophic to call it. If the callback is also in
651 * cyclic trash (CT), then although the CT is unreachable from
652 * outside the current generation, CT may be reachable from the
653 * callback. Then the callback could resurrect insane objects.
654 *
655 * Since the callback is never needed and may be unsafe in this case,
656 * wr is simply left in the unreachable set. Note that because we
657 * already called _PyWeakref_ClearRef(wr), its callback will never
658 * trigger.
659 *
660 * OTOH, if wr isn't part of CT, we should invoke the callback: the
661 * weakref outlived the trash. Note that since wr isn't CT in this
662 * case, its callback can't be CT either -- wr acted as an external
663 * root to this generation, and therefore its callback did too. So
664 * nothing in CT is reachable from the callback either, so it's hard
665 * to imagine how calling it later could create a problem for us. wr
666 * is moved to wrcb_to_call in this case.
667 */
668 if (IS_TENTATIVELY_UNREACHABLE(wr))
669 continue;
670 assert(IS_REACHABLE(wr));
Tim Peterscc2a8662004-10-31 22:12:43 +0000671
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000672 /* Create a new reference so that wr can't go away
673 * before we can process it again.
674 */
675 Py_INCREF(wr);
Tim Petersead8b7a2004-10-30 23:09:22 +0000676
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000677 /* Move wr to wrcb_to_call, for the next pass. */
678 wrasgc = AS_GC(wr);
679 assert(wrasgc != next); /* wrasgc is reachable, but
680 next isn't, so they can't
681 be the same */
682 gc_list_move(wrasgc, &wrcb_to_call);
683 }
684 }
Tim Petersead8b7a2004-10-30 23:09:22 +0000685
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000686 /* Invoke the callbacks we decided to honor. It's safe to invoke them
687 * because they can't reference unreachable objects.
688 */
689 while (! gc_list_is_empty(&wrcb_to_call)) {
690 PyObject *temp;
691 PyObject *callback;
Tim Petersead8b7a2004-10-30 23:09:22 +0000692
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000693 gc = wrcb_to_call.gc.gc_next;
694 op = FROM_GC(gc);
695 assert(IS_REACHABLE(op));
696 assert(PyWeakref_Check(op));
697 wr = (PyWeakReference *)op;
698 callback = wr->wr_callback;
699 assert(callback != NULL);
Tim Petersead8b7a2004-10-30 23:09:22 +0000700
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000701 /* copy-paste of weakrefobject.c's handle_callback() */
702 temp = PyObject_CallFunctionObjArgs(callback, wr, NULL);
703 if (temp == NULL)
704 PyErr_WriteUnraisable(callback);
705 else
706 Py_DECREF(temp);
Tim Petersead8b7a2004-10-30 23:09:22 +0000707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000708 /* Give up the reference we created in the first pass. When
709 * op's refcount hits 0 (which it may or may not do right now),
710 * op's tp_dealloc will decref op->wr_callback too. Note
711 * that the refcount probably will hit 0 now, and because this
712 * weakref was reachable to begin with, gc didn't already
713 * add it to its count of freed objects. Example: a reachable
714 * weak value dict maps some key to this reachable weakref.
715 * The callback removes this key->weakref mapping from the
716 * dict, leaving no other references to the weakref (excepting
717 * ours).
718 */
719 Py_DECREF(op);
720 if (wrcb_to_call.gc.gc_next == gc) {
721 /* object is still alive -- move it */
722 gc_list_move(gc, old);
723 }
724 else
725 ++num_freed;
726 }
Tim Petersead8b7a2004-10-30 23:09:22 +0000727
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000728 return num_freed;
Tim Peters403a2032003-11-20 21:21:46 +0000729}
730
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000731static void
Jeremy Hylton06257772000-08-31 15:10:24 +0000732debug_cycle(char *msg, PyObject *op)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000733{
Victor Stinner499dfcf2011-03-21 13:26:24 +0100734 PySys_FormatStderr("gc: %s <%s %p>\n",
735 msg, Py_TYPE(op)->tp_name, op);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000736}
737
Tim Petersbf384c22003-04-06 00:11:39 +0000738/* Handle uncollectable garbage (cycles with finalizers, and stuff reachable
739 * only from such cycles).
Tim Petersf6b80452003-04-07 19:21:15 +0000740 * If DEBUG_SAVEALL, all objects in finalizers are appended to the module
741 * garbage list (a Python list), else only the objects in finalizers with
742 * __del__ methods are appended to garbage. All objects in finalizers are
743 * merged into the old list regardless.
Tim Peters259272b2003-04-06 19:41:39 +0000744 * Returns 0 if all OK, <0 on error (out of memory to grow the garbage list).
745 * The finalizers list is made empty on a successful return.
Tim Petersbf384c22003-04-06 00:11:39 +0000746 */
Tim Peters259272b2003-04-06 19:41:39 +0000747static int
Tim Petersf6b80452003-04-07 19:21:15 +0000748handle_finalizers(PyGC_Head *finalizers, PyGC_Head *old)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000749{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000750 PyGC_Head *gc = finalizers->gc.gc_next;
Tim Petersf6b80452003-04-07 19:21:15 +0000751
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000752 if (garbage == NULL) {
753 garbage = PyList_New(0);
754 if (garbage == NULL)
755 Py_FatalError("gc couldn't create gc.garbage list");
756 }
757 for (; gc != finalizers; gc = gc->gc.gc_next) {
758 PyObject *op = FROM_GC(gc);
Tim Petersf6b80452003-04-07 19:21:15 +0000759
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000760 if ((debug & DEBUG_SAVEALL) || has_finalizer(op)) {
761 if (PyList_Append(garbage, op) < 0)
762 return -1;
763 }
764 }
Tim Petersf6b80452003-04-07 19:21:15 +0000765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000766 gc_list_merge(finalizers, old);
767 return 0;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000768}
769
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000770/* Break reference cycles by clearing the containers involved. This is
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000771 * tricky business as the lists can be changing and we don't know which
Tim Peters19b74c72002-07-01 03:52:19 +0000772 * objects may be freed. It is possible I screwed something up here.
773 */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000774static void
Jeremy Hyltonce136e92003-04-04 19:59:06 +0000775delete_garbage(PyGC_Head *collectable, PyGC_Head *old)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000776{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000777 inquiry clear;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000778
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000779 while (!gc_list_is_empty(collectable)) {
780 PyGC_Head *gc = collectable->gc.gc_next;
781 PyObject *op = FROM_GC(gc);
Tim Peters88396172002-06-30 17:56:40 +0000782
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000783 assert(IS_TENTATIVELY_UNREACHABLE(op));
784 if (debug & DEBUG_SAVEALL) {
785 PyList_Append(garbage, op);
786 }
787 else {
788 if ((clear = Py_TYPE(op)->tp_clear) != NULL) {
789 Py_INCREF(op);
790 clear(op);
791 Py_DECREF(op);
792 }
793 }
794 if (collectable->gc.gc_next == gc) {
795 /* object is still alive, move it, it may die later */
796 gc_list_move(gc, old);
797 gc->gc.gc_refs = GC_REACHABLE;
798 }
799 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000800}
801
Christian Heimesa156e092008-02-16 07:38:31 +0000802/* Clear all free lists
803 * All free lists are cleared during the collection of the highest generation.
804 * Allocated items in the free list may keep a pymalloc arena occupied.
805 * Clearing the free lists may give back memory to the OS earlier.
806 */
807static void
808clear_freelists(void)
809{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000810 (void)PyMethod_ClearFreeList();
811 (void)PyFrame_ClearFreeList();
812 (void)PyCFunction_ClearFreeList();
813 (void)PyTuple_ClearFreeList();
814 (void)PyUnicode_ClearFreeList();
815 (void)PyFloat_ClearFreeList();
Antoine Pitrou9a812cb2011-11-15 00:00:12 +0100816 (void)PyList_ClearFreeList();
817 (void)PyDict_ClearFreeList();
Antoine Pitrou093ce9c2011-12-16 11:24:27 +0100818 (void)PySet_ClearFreeList();
Christian Heimesa156e092008-02-16 07:38:31 +0000819}
820
Antoine Pitrou621601a2008-12-17 23:18:19 +0000821static double
822get_time(void)
823{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000824 double result = 0;
825 if (tmod != NULL) {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200826 _Py_IDENTIFIER(time);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200827
828 PyObject *f = _PyObject_CallMethodId(tmod, &PyId_time, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000829 if (f == NULL) {
830 PyErr_Clear();
831 }
832 else {
833 if (PyFloat_Check(f))
834 result = PyFloat_AsDouble(f);
835 Py_DECREF(f);
836 }
837 }
838 return result;
Antoine Pitrou621601a2008-12-17 23:18:19 +0000839}
840
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000841/* This is the main function. Read this to understand how the
842 * collection process works. */
Neal Norwitz7b216c52006-03-04 20:01:53 +0000843static Py_ssize_t
Kristján Valur Jónsson69c63522012-04-15 11:41:32 +0000844collect(int generation, Py_ssize_t *n_collected, Py_ssize_t *n_uncollectable)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000845{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000846 int i;
847 Py_ssize_t m = 0; /* # objects collected */
848 Py_ssize_t n = 0; /* # unreachable objects that couldn't be collected */
849 PyGC_Head *young; /* the generation we are examining */
850 PyGC_Head *old; /* next older generation */
851 PyGC_Head unreachable; /* non-problematic unreachable trash */
852 PyGC_Head finalizers; /* objects with, & reachable from, __del__ */
853 PyGC_Head *gc;
854 double t1 = 0.0;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000855
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000856 if (debug & DEBUG_STATS) {
857 PySys_WriteStderr("gc: collecting generation %d...\n",
858 generation);
859 PySys_WriteStderr("gc: objects in each generation:");
860 for (i = 0; i < NUM_GENERATIONS; i++)
861 PySys_WriteStderr(" %" PY_FORMAT_SIZE_T "d",
862 gc_list_size(GEN_HEAD(i)));
863 t1 = get_time();
864 PySys_WriteStderr("\n");
865 }
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000866
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000867 /* update collection and allocation counters */
868 if (generation+1 < NUM_GENERATIONS)
869 generations[generation+1].count += 1;
870 for (i = 0; i <= generation; i++)
871 generations[i].count = 0;
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000872
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000873 /* merge younger generations with one we are currently collecting */
874 for (i = 0; i < generation; i++) {
875 gc_list_merge(GEN_HEAD(i), GEN_HEAD(generation));
876 }
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000877
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000878 /* handy references */
879 young = GEN_HEAD(generation);
880 if (generation < NUM_GENERATIONS-1)
881 old = GEN_HEAD(generation+1);
882 else
883 old = young;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000884
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000885 /* Using ob_refcnt and gc_refs, calculate which objects in the
886 * container set are reachable from outside the set (i.e., have a
887 * refcount greater than 0 when all the references within the
888 * set are taken into account).
889 */
890 update_refs(young);
891 subtract_refs(young);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000892
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000893 /* Leave everything reachable from outside young in young, and move
894 * everything else (in young) to unreachable.
895 * NOTE: This used to move the reachable objects into a reachable
896 * set instead. But most things usually turn out to be reachable,
897 * so it's more efficient to move the unreachable things.
898 */
899 gc_list_init(&unreachable);
900 move_unreachable(young, &unreachable);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000901
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000902 /* Move reachable objects to next generation. */
903 if (young != old) {
904 if (generation == NUM_GENERATIONS - 2) {
905 long_lived_pending += gc_list_size(young);
906 }
907 gc_list_merge(young, old);
908 }
909 else {
Antoine Pitroue1ad3da2012-05-28 22:22:34 +0200910 /* We only untrack dicts in full collections, to avoid quadratic
911 dict build-up. See issue #14775. */
912 untrack_dicts(young);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000913 long_lived_pending = 0;
914 long_lived_total = gc_list_size(young);
915 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000916
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000917 /* All objects in unreachable are trash, but objects reachable from
918 * finalizers can't safely be deleted. Python programmers should take
919 * care not to create such things. For Python, finalizers means
920 * instance objects with __del__ methods. Weakrefs with callbacks
921 * can also call arbitrary Python code but they will be dealt with by
922 * handle_weakrefs().
923 */
924 gc_list_init(&finalizers);
925 move_finalizers(&unreachable, &finalizers);
926 /* finalizers contains the unreachable objects with a finalizer;
927 * unreachable objects reachable *from* those are also uncollectable,
928 * and we move those into the finalizers list too.
929 */
930 move_finalizer_reachable(&finalizers);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000931
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000932 /* Collect statistics on collectable objects found and print
933 * debugging information.
934 */
935 for (gc = unreachable.gc.gc_next; gc != &unreachable;
936 gc = gc->gc.gc_next) {
937 m++;
938 if (debug & DEBUG_COLLECTABLE) {
939 debug_cycle("collectable", FROM_GC(gc));
940 }
941 }
Tim Petersead8b7a2004-10-30 23:09:22 +0000942
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000943 /* Clear weakrefs and invoke callbacks as necessary. */
944 m += handle_weakrefs(&unreachable, old);
Tim Petersead8b7a2004-10-30 23:09:22 +0000945
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000946 /* Call tp_clear on objects in the unreachable set. This will cause
947 * the reference cycles to be broken. It may also cause some objects
948 * in finalizers to be freed.
949 */
950 delete_garbage(&unreachable, old);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000951
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000952 /* Collect statistics on uncollectable objects found and print
953 * debugging information. */
954 for (gc = finalizers.gc.gc_next;
955 gc != &finalizers;
956 gc = gc->gc.gc_next) {
957 n++;
958 if (debug & DEBUG_UNCOLLECTABLE)
959 debug_cycle("uncollectable", FROM_GC(gc));
960 }
961 if (debug & DEBUG_STATS) {
962 double t2 = get_time();
963 if (m == 0 && n == 0)
964 PySys_WriteStderr("gc: done");
965 else
966 PySys_WriteStderr(
967 "gc: done, "
968 "%" PY_FORMAT_SIZE_T "d unreachable, "
969 "%" PY_FORMAT_SIZE_T "d uncollectable",
970 n+m, n);
971 if (t1 && t2) {
972 PySys_WriteStderr(", %.4fs elapsed", t2-t1);
973 }
974 PySys_WriteStderr(".\n");
975 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000976
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000977 /* Append instances in the uncollectable set to a Python
978 * reachable list of garbage. The programmer has to deal with
979 * this if they insist on creating this type of structure.
980 */
981 (void)handle_finalizers(&finalizers, old);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000982
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000983 /* Clear free list only during the collection of the highest
984 * generation */
985 if (generation == NUM_GENERATIONS-1) {
986 clear_freelists();
987 }
Christian Heimesa156e092008-02-16 07:38:31 +0000988
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000989 if (PyErr_Occurred()) {
990 if (gc_str == NULL)
991 gc_str = PyUnicode_FromString("garbage collection");
992 PyErr_WriteUnraisable(gc_str);
993 Py_FatalError("unexpected exception during garbage collection");
994 }
Kristján Valur Jónsson69c63522012-04-15 11:41:32 +0000995
996 if (n_collected)
997 *n_collected = m;
998 if (n_uncollectable)
999 *n_uncollectable = n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001000 return n+m;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001001}
1002
Kristján Valur Jónsson69c63522012-04-15 11:41:32 +00001003/* Invoke progress callbacks to notify clients that garbage collection
1004 * is starting or stopping
1005 */
1006static void
1007invoke_gc_callback(const char *phase, int generation,
1008 Py_ssize_t collected, Py_ssize_t uncollectable)
1009{
1010 Py_ssize_t i;
1011 PyObject *info = NULL;
1012
1013 /* we may get called very early */
1014 if (callbacks == NULL)
1015 return;
1016 /* The local variable cannot be rebound, check it for sanity */
1017 assert(callbacks != NULL && PyList_CheckExact(callbacks));
1018 if (PyList_GET_SIZE(callbacks) != 0) {
1019 info = Py_BuildValue("{sisnsn}",
1020 "generation", generation,
1021 "collected", collected,
1022 "uncollectable", uncollectable);
1023 if (info == NULL) {
1024 PyErr_WriteUnraisable(NULL);
1025 return;
1026 }
1027 }
1028 for (i=0; i<PyList_GET_SIZE(callbacks); i++) {
1029 PyObject *r, *cb = PyList_GET_ITEM(callbacks, i);
1030 Py_INCREF(cb); /* make sure cb doesn't go away */
1031 r = PyObject_CallFunction(cb, "sO", phase, info);
1032 Py_XDECREF(r);
1033 if (r == NULL)
1034 PyErr_WriteUnraisable(cb);
1035 Py_DECREF(cb);
1036 }
1037 Py_XDECREF(info);
1038}
1039
1040/* Perform garbage collection of a generation and invoke
1041 * progress callbacks.
1042 */
1043static Py_ssize_t
1044collect_with_callback(int generation)
1045{
1046 Py_ssize_t result, collected, uncollectable;
1047 invoke_gc_callback("start", generation, 0, 0);
1048 result = collect(generation, &collected, &uncollectable);
1049 invoke_gc_callback("stop", generation, collected, uncollectable);
1050 return result;
1051}
1052
Neal Norwitz7b216c52006-03-04 20:01:53 +00001053static Py_ssize_t
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001054collect_generations(void)
1055{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001056 int i;
1057 Py_ssize_t n = 0;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001058
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001059 /* Find the oldest generation (highest numbered) where the count
1060 * exceeds the threshold. Objects in the that generation and
1061 * generations younger than it will be collected. */
1062 for (i = NUM_GENERATIONS-1; i >= 0; i--) {
1063 if (generations[i].count > generations[i].threshold) {
1064 /* Avoid quadratic performance degradation in number
1065 of tracked objects. See comments at the beginning
1066 of this file, and issue #4074.
1067 */
1068 if (i == NUM_GENERATIONS - 1
1069 && long_lived_pending < long_lived_total / 4)
1070 continue;
Kristján Valur Jónsson69c63522012-04-15 11:41:32 +00001071 n = collect_with_callback(i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001072 break;
1073 }
1074 }
1075 return n;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001076}
1077
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001078PyDoc_STRVAR(gc_enable__doc__,
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001079"enable() -> None\n"
1080"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001081"Enable automatic garbage collection.\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001082
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001083static PyObject *
Tim Peters50c61d52003-04-06 01:50:50 +00001084gc_enable(PyObject *self, PyObject *noargs)
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001085{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001086 enabled = 1;
1087 Py_INCREF(Py_None);
1088 return Py_None;
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001089}
1090
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001091PyDoc_STRVAR(gc_disable__doc__,
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001092"disable() -> None\n"
1093"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001094"Disable automatic garbage collection.\n");
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001095
1096static PyObject *
Tim Peters50c61d52003-04-06 01:50:50 +00001097gc_disable(PyObject *self, PyObject *noargs)
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001098{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001099 enabled = 0;
1100 Py_INCREF(Py_None);
1101 return Py_None;
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001102}
1103
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001104PyDoc_STRVAR(gc_isenabled__doc__,
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001105"isenabled() -> status\n"
1106"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001107"Returns true if automatic garbage collection is enabled.\n");
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001108
1109static PyObject *
Tim Peters50c61d52003-04-06 01:50:50 +00001110gc_isenabled(PyObject *self, PyObject *noargs)
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001111{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001112 return PyBool_FromLong((long)enabled);
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001113}
1114
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001115PyDoc_STRVAR(gc_collect__doc__,
Barry Warsawd3c38ff2006-03-07 09:46:03 +00001116"collect([generation]) -> n\n"
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001117"\n"
Barry Warsawd3c38ff2006-03-07 09:46:03 +00001118"With no arguments, run a full collection. The optional argument\n"
1119"may be an integer specifying which generation to collect. A ValueError\n"
1120"is raised if the generation number is invalid.\n\n"
1121"The number of unreachable objects is returned.\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001122
1123static PyObject *
Barry Warsawd3c38ff2006-03-07 09:46:03 +00001124gc_collect(PyObject *self, PyObject *args, PyObject *kws)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001125{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001126 static char *keywords[] = {"generation", NULL};
1127 int genarg = NUM_GENERATIONS - 1;
1128 Py_ssize_t n;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001129
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001130 if (!PyArg_ParseTupleAndKeywords(args, kws, "|i", keywords, &genarg))
1131 return NULL;
Barry Warsawd3c38ff2006-03-07 09:46:03 +00001132
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001133 else if (genarg < 0 || genarg >= NUM_GENERATIONS) {
1134 PyErr_SetString(PyExc_ValueError, "invalid generation");
1135 return NULL;
1136 }
Barry Warsawd3c38ff2006-03-07 09:46:03 +00001137
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001138 if (collecting)
1139 n = 0; /* already collecting, don't do anything */
1140 else {
1141 collecting = 1;
Kristján Valur Jónsson69c63522012-04-15 11:41:32 +00001142 n = collect_with_callback(genarg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001143 collecting = 0;
1144 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001145
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001146 return PyLong_FromSsize_t(n);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001147}
1148
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001149PyDoc_STRVAR(gc_set_debug__doc__,
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001150"set_debug(flags) -> None\n"
1151"\n"
1152"Set the garbage collection debugging flags. Debugging information is\n"
1153"written to sys.stderr.\n"
1154"\n"
1155"flags is an integer and can have the following bits turned on:\n"
1156"\n"
1157" DEBUG_STATS - Print statistics during collection.\n"
1158" DEBUG_COLLECTABLE - Print collectable objects found.\n"
1159" DEBUG_UNCOLLECTABLE - Print unreachable but uncollectable objects found.\n"
Neil Schemenauer544de1e2000-09-22 15:22:38 +00001160" DEBUG_SAVEALL - Save objects to gc.garbage rather than freeing them.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001161" DEBUG_LEAK - Debug leaking programs (everything but STATS).\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001162
1163static PyObject *
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001164gc_set_debug(PyObject *self, PyObject *args)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001165{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001166 if (!PyArg_ParseTuple(args, "i:set_debug", &debug))
1167 return NULL;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001168
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001169 Py_INCREF(Py_None);
1170 return Py_None;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001171}
1172
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001173PyDoc_STRVAR(gc_get_debug__doc__,
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001174"get_debug() -> flags\n"
1175"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001176"Get the garbage collection debugging flags.\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001177
1178static PyObject *
Tim Peters50c61d52003-04-06 01:50:50 +00001179gc_get_debug(PyObject *self, PyObject *noargs)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001180{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001181 return Py_BuildValue("i", debug);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001182}
1183
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001184PyDoc_STRVAR(gc_set_thresh__doc__,
Neal Norwitz2a47c0f2002-01-29 00:53:41 +00001185"set_threshold(threshold0, [threshold1, threshold2]) -> None\n"
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001186"\n"
1187"Sets the collection thresholds. Setting threshold0 to zero disables\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001188"collection.\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001189
1190static PyObject *
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001191gc_set_thresh(PyObject *self, PyObject *args)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001192{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001193 int i;
1194 if (!PyArg_ParseTuple(args, "i|ii:set_threshold",
1195 &generations[0].threshold,
1196 &generations[1].threshold,
1197 &generations[2].threshold))
1198 return NULL;
1199 for (i = 2; i < NUM_GENERATIONS; i++) {
1200 /* generations higher than 2 get the same threshold */
1201 generations[i].threshold = generations[2].threshold;
1202 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001203
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001204 Py_INCREF(Py_None);
1205 return Py_None;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001206}
1207
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001208PyDoc_STRVAR(gc_get_thresh__doc__,
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001209"get_threshold() -> (threshold0, threshold1, threshold2)\n"
1210"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001211"Return the current collection thresholds\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001212
1213static PyObject *
Tim Peters50c61d52003-04-06 01:50:50 +00001214gc_get_thresh(PyObject *self, PyObject *noargs)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001215{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001216 return Py_BuildValue("(iii)",
1217 generations[0].threshold,
1218 generations[1].threshold,
1219 generations[2].threshold);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001220}
1221
Barry Warsawd3c38ff2006-03-07 09:46:03 +00001222PyDoc_STRVAR(gc_get_count__doc__,
1223"get_count() -> (count0, count1, count2)\n"
1224"\n"
1225"Return the current collection counts\n");
1226
1227static PyObject *
1228gc_get_count(PyObject *self, PyObject *noargs)
1229{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 return Py_BuildValue("(iii)",
1231 generations[0].count,
1232 generations[1].count,
1233 generations[2].count);
Barry Warsawd3c38ff2006-03-07 09:46:03 +00001234}
1235
Neil Schemenauer48c70342001-08-09 15:38:31 +00001236static int
Martin v. Löwis560da622001-11-24 09:24:51 +00001237referrersvisit(PyObject* obj, PyObject *objs)
Neil Schemenauer48c70342001-08-09 15:38:31 +00001238{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001239 Py_ssize_t i;
1240 for (i = 0; i < PyTuple_GET_SIZE(objs); i++)
1241 if (PyTuple_GET_ITEM(objs, i) == obj)
1242 return 1;
1243 return 0;
Neil Schemenauer48c70342001-08-09 15:38:31 +00001244}
1245
Neil Schemenauer17e7be62001-08-10 14:46:47 +00001246static int
Martin v. Löwis560da622001-11-24 09:24:51 +00001247gc_referrers_for(PyObject *objs, PyGC_Head *list, PyObject *resultlist)
Neil Schemenauer48c70342001-08-09 15:38:31 +00001248{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001249 PyGC_Head *gc;
1250 PyObject *obj;
1251 traverseproc traverse;
1252 for (gc = list->gc.gc_next; gc != list; gc = gc->gc.gc_next) {
1253 obj = FROM_GC(gc);
1254 traverse = Py_TYPE(obj)->tp_traverse;
1255 if (obj == objs || obj == resultlist)
1256 continue;
1257 if (traverse(obj, (visitproc)referrersvisit, objs)) {
1258 if (PyList_Append(resultlist, obj) < 0)
1259 return 0; /* error */
1260 }
1261 }
1262 return 1; /* no error */
Neil Schemenauer48c70342001-08-09 15:38:31 +00001263}
1264
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001265PyDoc_STRVAR(gc_get_referrers__doc__,
Martin v. Löwis560da622001-11-24 09:24:51 +00001266"get_referrers(*objs) -> list\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001267Return the list of objects that directly refer to any of objs.");
Neil Schemenauer48c70342001-08-09 15:38:31 +00001268
Neil Schemenauer17e7be62001-08-10 14:46:47 +00001269static PyObject *
Martin v. Löwis560da622001-11-24 09:24:51 +00001270gc_get_referrers(PyObject *self, PyObject *args)
Neil Schemenauer48c70342001-08-09 15:38:31 +00001271{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001272 int i;
1273 PyObject *result = PyList_New(0);
1274 if (!result) return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001275
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001276 for (i = 0; i < NUM_GENERATIONS; i++) {
1277 if (!(gc_referrers_for(args, GEN_HEAD(i), result))) {
1278 Py_DECREF(result);
1279 return NULL;
1280 }
1281 }
1282 return result;
Neil Schemenauer48c70342001-08-09 15:38:31 +00001283}
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001284
Tim Peters0f81ab62003-04-08 16:39:48 +00001285/* Append obj to list; return true if error (out of memory), false if OK. */
Jeremy Hylton5bd378b2003-04-03 16:28:38 +00001286static int
Tim Peters730f5532003-04-08 17:17:17 +00001287referentsvisit(PyObject *obj, PyObject *list)
Jeremy Hylton5bd378b2003-04-03 16:28:38 +00001288{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001289 return PyList_Append(list, obj) < 0;
Jeremy Hylton5bd378b2003-04-03 16:28:38 +00001290}
1291
Tim Peters730f5532003-04-08 17:17:17 +00001292PyDoc_STRVAR(gc_get_referents__doc__,
1293"get_referents(*objs) -> list\n\
Jeremy Hylton059b0942003-04-03 16:29:13 +00001294Return the list of objects that are directly referred to by objs.");
Jeremy Hylton5bd378b2003-04-03 16:28:38 +00001295
1296static PyObject *
Tim Peters730f5532003-04-08 17:17:17 +00001297gc_get_referents(PyObject *self, PyObject *args)
Jeremy Hylton5bd378b2003-04-03 16:28:38 +00001298{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001299 Py_ssize_t i;
1300 PyObject *result = PyList_New(0);
Tim Peters0f81ab62003-04-08 16:39:48 +00001301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001302 if (result == NULL)
1303 return NULL;
Tim Peters0f81ab62003-04-08 16:39:48 +00001304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001305 for (i = 0; i < PyTuple_GET_SIZE(args); i++) {
1306 traverseproc traverse;
1307 PyObject *obj = PyTuple_GET_ITEM(args, i);
Tim Peters0f81ab62003-04-08 16:39:48 +00001308
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 if (! PyObject_IS_GC(obj))
1310 continue;
1311 traverse = Py_TYPE(obj)->tp_traverse;
1312 if (! traverse)
1313 continue;
1314 if (traverse(obj, (visitproc)referentsvisit, result)) {
1315 Py_DECREF(result);
1316 return NULL;
1317 }
1318 }
1319 return result;
Jeremy Hylton5bd378b2003-04-03 16:28:38 +00001320}
1321
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001322PyDoc_STRVAR(gc_get_objects__doc__,
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +00001323"get_objects() -> [...]\n"
1324"\n"
1325"Return a list of objects tracked by the collector (excluding the list\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001326"returned).\n");
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +00001327
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +00001328static PyObject *
Tim Peters50c61d52003-04-06 01:50:50 +00001329gc_get_objects(PyObject *self, PyObject *noargs)
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +00001330{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001331 int i;
1332 PyObject* result;
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +00001333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001334 result = PyList_New(0);
1335 if (result == NULL)
1336 return NULL;
1337 for (i = 0; i < NUM_GENERATIONS; i++) {
1338 if (append_objects(result, GEN_HEAD(i))) {
1339 Py_DECREF(result);
1340 return NULL;
1341 }
1342 }
1343 return result;
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +00001344}
1345
Antoine Pitrou3a652b12009-03-23 18:52:06 +00001346PyDoc_STRVAR(gc_is_tracked__doc__,
1347"is_tracked(obj) -> bool\n"
1348"\n"
1349"Returns true if the object is tracked by the garbage collector.\n"
1350"Simple atomic objects will return false.\n"
1351);
1352
1353static PyObject *
1354gc_is_tracked(PyObject *self, PyObject *obj)
1355{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001356 PyObject *result;
1357
1358 if (PyObject_IS_GC(obj) && IS_TRACKED(obj))
1359 result = Py_True;
1360 else
1361 result = Py_False;
1362 Py_INCREF(result);
1363 return result;
Antoine Pitrou3a652b12009-03-23 18:52:06 +00001364}
1365
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +00001366
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001367PyDoc_STRVAR(gc__doc__,
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001368"This module provides access to the garbage collector for reference cycles.\n"
1369"\n"
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001370"enable() -- Enable automatic garbage collection.\n"
1371"disable() -- Disable automatic garbage collection.\n"
1372"isenabled() -- Returns true if automatic collection is enabled.\n"
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001373"collect() -- Do a full collection right now.\n"
Thomas Wouters89f507f2006-12-13 04:49:30 +00001374"get_count() -- Return the current collection counts.\n"
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001375"set_debug() -- Set debugging flags.\n"
1376"get_debug() -- Get debugging flags.\n"
1377"set_threshold() -- Set the collection thresholds.\n"
1378"get_threshold() -- Return the current the collection thresholds.\n"
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +00001379"get_objects() -- Return a list of all objects tracked by the collector.\n"
Antoine Pitrou3a652b12009-03-23 18:52:06 +00001380"is_tracked() -- Returns true if a given object is tracked.\n"
Jeremy Hylton5bd378b2003-04-03 16:28:38 +00001381"get_referrers() -- Return the list of objects that refer to an object.\n"
Tim Peters730f5532003-04-08 17:17:17 +00001382"get_referents() -- Return the list of objects that an object refers to.\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001383
1384static PyMethodDef GcMethods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001385 {"enable", gc_enable, METH_NOARGS, gc_enable__doc__},
1386 {"disable", gc_disable, METH_NOARGS, gc_disable__doc__},
1387 {"isenabled", gc_isenabled, METH_NOARGS, gc_isenabled__doc__},
1388 {"set_debug", gc_set_debug, METH_VARARGS, gc_set_debug__doc__},
1389 {"get_debug", gc_get_debug, METH_NOARGS, gc_get_debug__doc__},
1390 {"get_count", gc_get_count, METH_NOARGS, gc_get_count__doc__},
1391 {"set_threshold", gc_set_thresh, METH_VARARGS, gc_set_thresh__doc__},
1392 {"get_threshold", gc_get_thresh, METH_NOARGS, gc_get_thresh__doc__},
1393 {"collect", (PyCFunction)gc_collect,
1394 METH_VARARGS | METH_KEYWORDS, gc_collect__doc__},
1395 {"get_objects", gc_get_objects,METH_NOARGS, gc_get_objects__doc__},
1396 {"is_tracked", gc_is_tracked, METH_O, gc_is_tracked__doc__},
1397 {"get_referrers", gc_get_referrers, METH_VARARGS,
1398 gc_get_referrers__doc__},
1399 {"get_referents", gc_get_referents, METH_VARARGS,
1400 gc_get_referents__doc__},
1401 {NULL, NULL} /* Sentinel */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001402};
1403
Martin v. Löwis1a214512008-06-11 05:26:20 +00001404static struct PyModuleDef gcmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001405 PyModuleDef_HEAD_INIT,
Antoine Pitrou696e0352010-08-08 22:18:46 +00001406 "gc", /* m_name */
1407 gc__doc__, /* m_doc */
1408 -1, /* m_size */
1409 GcMethods, /* m_methods */
1410 NULL, /* m_reload */
1411 NULL, /* m_traverse */
1412 NULL, /* m_clear */
1413 NULL /* m_free */
Martin v. Löwis1a214512008-06-11 05:26:20 +00001414};
1415
Jason Tishler6bc06ec2003-09-04 11:59:50 +00001416PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00001417PyInit_gc(void)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001418{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001419 PyObject *m;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001420
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001421 m = PyModule_Create(&gcmodule);
Martin v. Löwis1a214512008-06-11 05:26:20 +00001422
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001423 if (m == NULL)
1424 return NULL;
Tim Peters11558872003-04-06 23:30:52 +00001425
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001426 if (garbage == NULL) {
1427 garbage = PyList_New(0);
1428 if (garbage == NULL)
1429 return NULL;
1430 }
1431 Py_INCREF(garbage);
1432 if (PyModule_AddObject(m, "garbage", garbage) < 0)
1433 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001434
Kristján Valur Jónsson69c63522012-04-15 11:41:32 +00001435 if (callbacks == NULL) {
1436 callbacks = PyList_New(0);
1437 if (callbacks == NULL)
1438 return NULL;
1439 }
1440 Py_INCREF(callbacks);
1441 if (PyModule_AddObject(m, "callbacks", callbacks) < 0)
1442 return NULL;
1443
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001444 /* Importing can't be done in collect() because collect()
1445 * can be called via PyGC_Collect() in Py_Finalize().
1446 * This wouldn't be a problem, except that <initialized> is
1447 * reset to 0 before calling collect which trips up
1448 * the import and triggers an assertion.
1449 */
1450 if (tmod == NULL) {
1451 tmod = PyImport_ImportModuleNoBlock("time");
1452 if (tmod == NULL)
1453 PyErr_Clear();
1454 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001455
Martin v. Löwis1a214512008-06-11 05:26:20 +00001456#define ADD_INT(NAME) if (PyModule_AddIntConstant(m, #NAME, NAME) < 0) return NULL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001457 ADD_INT(DEBUG_STATS);
1458 ADD_INT(DEBUG_COLLECTABLE);
1459 ADD_INT(DEBUG_UNCOLLECTABLE);
1460 ADD_INT(DEBUG_SAVEALL);
1461 ADD_INT(DEBUG_LEAK);
Tim Peters11558872003-04-06 23:30:52 +00001462#undef ADD_INT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001463 return m;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001464}
1465
Guido van Rossume13ddc92003-04-17 17:29:22 +00001466/* API to invoke gc.collect() from C */
Neal Norwitz7b216c52006-03-04 20:01:53 +00001467Py_ssize_t
Guido van Rossume13ddc92003-04-17 17:29:22 +00001468PyGC_Collect(void)
1469{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001470 Py_ssize_t n;
Guido van Rossume13ddc92003-04-17 17:29:22 +00001471
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001472 if (collecting)
1473 n = 0; /* already collecting, don't do anything */
1474 else {
1475 collecting = 1;
Kristján Valur Jónsson69c63522012-04-15 11:41:32 +00001476 n = collect_with_callback(NUM_GENERATIONS - 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001477 collecting = 0;
1478 }
Guido van Rossume13ddc92003-04-17 17:29:22 +00001479
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001480 return n;
Guido van Rossume13ddc92003-04-17 17:29:22 +00001481}
1482
Antoine Pitrou696e0352010-08-08 22:18:46 +00001483void
1484_PyGC_Fini(void)
1485{
Antoine Pitrou2ed94eb2010-09-14 09:48:39 +00001486 if (!(debug & DEBUG_SAVEALL)
1487 && garbage != NULL && PyList_GET_SIZE(garbage) > 0) {
Georg Brandl08be72d2010-10-24 15:11:22 +00001488 char *message;
1489 if (debug & DEBUG_UNCOLLECTABLE)
Antoine Pitroub5d82042010-11-05 00:05:25 +00001490 message = "gc: %zd uncollectable objects at " \
Georg Brandl08be72d2010-10-24 15:11:22 +00001491 "shutdown";
1492 else
Antoine Pitroub5d82042010-11-05 00:05:25 +00001493 message = "gc: %zd uncollectable objects at " \
Georg Brandl08be72d2010-10-24 15:11:22 +00001494 "shutdown; use gc.set_debug(gc.DEBUG_UNCOLLECTABLE) to list them";
1495 if (PyErr_WarnFormat(PyExc_ResourceWarning, 0, message,
1496 PyList_GET_SIZE(garbage)) < 0)
1497 PyErr_WriteUnraisable(NULL);
Antoine Pitrou696e0352010-08-08 22:18:46 +00001498 if (debug & DEBUG_UNCOLLECTABLE) {
1499 PyObject *repr = NULL, *bytes = NULL;
1500 repr = PyObject_Repr(garbage);
1501 if (!repr || !(bytes = PyUnicode_EncodeFSDefault(repr)))
1502 PyErr_WriteUnraisable(garbage);
1503 else {
1504 PySys_WriteStderr(
1505 " %s\n",
1506 PyBytes_AS_STRING(bytes)
1507 );
1508 }
1509 Py_XDECREF(repr);
1510 Py_XDECREF(bytes);
1511 }
Antoine Pitrou696e0352010-08-08 22:18:46 +00001512 }
Kristján Valur Jónsson69c63522012-04-15 11:41:32 +00001513 Py_CLEAR(callbacks);
Antoine Pitrou696e0352010-08-08 22:18:46 +00001514}
1515
Neil Schemenauer43411b52001-08-30 00:05:51 +00001516/* for debugging */
Guido van Rossume13ddc92003-04-17 17:29:22 +00001517void
1518_PyGC_Dump(PyGC_Head *g)
Neil Schemenauer43411b52001-08-30 00:05:51 +00001519{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001520 _PyObject_Dump(FROM_GC(g));
Neil Schemenauer43411b52001-08-30 00:05:51 +00001521}
1522
Neil Schemenauer43411b52001-08-30 00:05:51 +00001523/* extension modules might be compiled with GC support so these
1524 functions must always be available */
1525
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001526#undef PyObject_GC_Track
1527#undef PyObject_GC_UnTrack
1528#undef PyObject_GC_Del
1529#undef _PyObject_GC_Malloc
1530
Neil Schemenauer43411b52001-08-30 00:05:51 +00001531void
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001532PyObject_GC_Track(void *op)
Neil Schemenauer43411b52001-08-30 00:05:51 +00001533{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001534 _PyObject_GC_TRACK(op);
Neil Schemenauer43411b52001-08-30 00:05:51 +00001535}
1536
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001537/* for binary compatibility with 2.2 */
Neil Schemenauer43411b52001-08-30 00:05:51 +00001538void
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001539_PyObject_GC_Track(PyObject *op)
1540{
1541 PyObject_GC_Track(op);
1542}
1543
1544void
1545PyObject_GC_UnTrack(void *op)
Neil Schemenauer43411b52001-08-30 00:05:51 +00001546{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001547 /* Obscure: the Py_TRASHCAN mechanism requires that we be able to
1548 * call PyObject_GC_UnTrack twice on an object.
1549 */
1550 if (IS_TRACKED(op))
1551 _PyObject_GC_UNTRACK(op);
Neil Schemenauer43411b52001-08-30 00:05:51 +00001552}
1553
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001554/* for binary compatibility with 2.2 */
1555void
1556_PyObject_GC_UnTrack(PyObject *op)
1557{
1558 PyObject_GC_UnTrack(op);
1559}
1560
Neil Schemenauer43411b52001-08-30 00:05:51 +00001561PyObject *
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001562_PyObject_GC_Malloc(size_t basicsize)
Neil Schemenauer43411b52001-08-30 00:05:51 +00001563{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001564 PyObject *op;
1565 PyGC_Head *g;
1566 if (basicsize > PY_SSIZE_T_MAX - sizeof(PyGC_Head))
1567 return PyErr_NoMemory();
1568 g = (PyGC_Head *)PyObject_MALLOC(
1569 sizeof(PyGC_Head) + basicsize);
1570 if (g == NULL)
1571 return PyErr_NoMemory();
1572 g->gc.gc_refs = GC_UNTRACKED;
1573 generations[0].count++; /* number of allocated GC objects */
1574 if (generations[0].count > generations[0].threshold &&
1575 enabled &&
1576 generations[0].threshold &&
1577 !collecting &&
1578 !PyErr_Occurred()) {
1579 collecting = 1;
1580 collect_generations();
1581 collecting = 0;
1582 }
1583 op = FROM_GC(g);
1584 return op;
Neil Schemenauer43411b52001-08-30 00:05:51 +00001585}
1586
1587PyObject *
1588_PyObject_GC_New(PyTypeObject *tp)
1589{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001590 PyObject *op = _PyObject_GC_Malloc(_PyObject_SIZE(tp));
1591 if (op != NULL)
1592 op = PyObject_INIT(op, tp);
1593 return op;
Neil Schemenauer43411b52001-08-30 00:05:51 +00001594}
1595
1596PyVarObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001597_PyObject_GC_NewVar(PyTypeObject *tp, Py_ssize_t nitems)
Neil Schemenauer43411b52001-08-30 00:05:51 +00001598{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001599 const size_t size = _PyObject_VAR_SIZE(tp, nitems);
1600 PyVarObject *op = (PyVarObject *) _PyObject_GC_Malloc(size);
1601 if (op != NULL)
1602 op = PyObject_INIT_VAR(op, tp, nitems);
1603 return op;
Neil Schemenauer43411b52001-08-30 00:05:51 +00001604}
1605
1606PyVarObject *
Martin v. Löwis41290682006-02-16 14:56:14 +00001607_PyObject_GC_Resize(PyVarObject *op, Py_ssize_t nitems)
Neil Schemenauer43411b52001-08-30 00:05:51 +00001608{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001609 const size_t basicsize = _PyObject_VAR_SIZE(Py_TYPE(op), nitems);
1610 PyGC_Head *g = AS_GC(op);
1611 if (basicsize > PY_SSIZE_T_MAX - sizeof(PyGC_Head))
1612 return (PyVarObject *)PyErr_NoMemory();
1613 g = (PyGC_Head *)PyObject_REALLOC(g, sizeof(PyGC_Head) + basicsize);
1614 if (g == NULL)
1615 return (PyVarObject *)PyErr_NoMemory();
1616 op = (PyVarObject *) FROM_GC(g);
1617 Py_SIZE(op) = nitems;
1618 return op;
Neil Schemenauer43411b52001-08-30 00:05:51 +00001619}
1620
1621void
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001622PyObject_GC_Del(void *op)
Neil Schemenauer43411b52001-08-30 00:05:51 +00001623{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001624 PyGC_Head *g = AS_GC(op);
1625 if (IS_TRACKED(op))
1626 gc_list_remove(g);
1627 if (generations[0].count > 0) {
1628 generations[0].count--;
1629 }
1630 PyObject_FREE(g);
Neil Schemenauer43411b52001-08-30 00:05:51 +00001631}