blob: d4a0900fcb2eb8d7109463586d32f490d35396f2 [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"
Christian Heimesa156e092008-02-16 07:38:31 +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 {
38 PyGC_Head head;
39 int threshold; /* collection threshold */
40 int count; /* count of allocations or collections of younger
41 generations */
42};
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] = {
49 /* 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},
53};
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
Tim Peters93ad66d2003-04-05 17:15:44 +000068/* Python string used to look for __del__ attribute. */
69static PyObject *delstr = NULL;
Jeremy Hyltonce136e92003-04-04 19:59:06 +000070
Antoine Pitrou14b78f52009-01-09 22:27:08 +000071/* This is the number of objects who survived the last full collection. It
72 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
78/* This is the number of objects who survived all "non-full" collections,
79 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
94 long_lived_pending / long_lived_total
95 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:
116 http://mail.python.org/pipermail/python-dev/2008-June/080579.html
117*/
118
119
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000120/* set for debugging information */
121#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 */
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000124#define DEBUG_SAVEALL (1<<5) /* save all garbage in gc.garbage */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000125#define DEBUG_LEAK DEBUG_COLLECTABLE | \
126 DEBUG_UNCOLLECTABLE | \
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000127 DEBUG_SAVEALL
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000128static int debug;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000129static PyObject *tmod = NULL;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000130
Tim Peters6fc13d92002-07-02 18:12:35 +0000131/*--------------------------------------------------------------------------
132gc_refs values.
Neil Schemenauer43411b52001-08-30 00:05:51 +0000133
Tim Peters6fc13d92002-07-02 18:12:35 +0000134Between collections, every gc'ed object has one of two gc_refs values:
135
136GC_UNTRACKED
137 The initial state; objects returned by PyObject_GC_Malloc are in this
138 state. The object doesn't live in any generation list, and its
139 tp_traverse slot must not be called.
140
141GC_REACHABLE
142 The object lives in some generation list, and its tp_traverse is safe to
143 call. An object transitions to GC_REACHABLE when PyObject_GC_Track
144 is called.
145
146During a collection, gc_refs can temporarily take on other states:
147
148>= 0
149 At the start of a collection, update_refs() copies the true refcount
150 to gc_refs, for each object in the generation being collected.
151 subtract_refs() then adjusts gc_refs so that it equals the number of
152 times an object is referenced directly from outside the generation
153 being collected.
Martin v. Löwis774348c2002-11-09 19:54:06 +0000154 gc_refs remains >= 0 throughout these steps.
Tim Peters6fc13d92002-07-02 18:12:35 +0000155
156GC_TENTATIVELY_UNREACHABLE
157 move_unreachable() then moves objects not reachable (whether directly or
158 indirectly) from outside the generation into an "unreachable" set.
159 Objects that are found to be reachable have gc_refs set to GC_REACHABLE
160 again. Objects that are found to be unreachable have gc_refs set to
161 GC_TENTATIVELY_UNREACHABLE. It's "tentatively" because the pass doing
162 this can't be sure until it ends, and GC_TENTATIVELY_UNREACHABLE may
163 transition back to GC_REACHABLE.
164
165 Only objects with GC_TENTATIVELY_UNREACHABLE still set are candidates
166 for collection. If it's decided not to collect such an object (e.g.,
167 it has a __del__ method), its gc_refs is restored to GC_REACHABLE again.
168----------------------------------------------------------------------------
169*/
Tim Petersea405632002-07-02 00:52:30 +0000170#define GC_UNTRACKED _PyGC_REFS_UNTRACKED
171#define GC_REACHABLE _PyGC_REFS_REACHABLE
172#define GC_TENTATIVELY_UNREACHABLE _PyGC_REFS_TENTATIVELY_UNREACHABLE
Tim Peters19b74c72002-07-01 03:52:19 +0000173
Tim Peters6fc13d92002-07-02 18:12:35 +0000174#define IS_TRACKED(o) ((AS_GC(o))->gc.gc_refs != GC_UNTRACKED)
Tim Peters19b74c72002-07-01 03:52:19 +0000175#define IS_REACHABLE(o) ((AS_GC(o))->gc.gc_refs == GC_REACHABLE)
176#define IS_TENTATIVELY_UNREACHABLE(o) ( \
177 (AS_GC(o))->gc.gc_refs == GC_TENTATIVELY_UNREACHABLE)
Neil Schemenauera2b11ec2002-05-21 15:53:24 +0000178
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000179/*** list functions ***/
180
181static void
182gc_list_init(PyGC_Head *list)
183{
Tim Peters9e4ca102001-10-11 18:31:31 +0000184 list->gc.gc_prev = list;
185 list->gc.gc_next = list;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000186}
187
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000188static int
189gc_list_is_empty(PyGC_Head *list)
190{
191 return (list->gc.gc_next == list);
192}
193
Tim Peterse2d59182004-11-01 01:39:08 +0000194#if 0
195/* This became unused after gc_list_move() was introduced. */
196/* Append `node` to `list`. */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000197static void
198gc_list_append(PyGC_Head *node, PyGC_Head *list)
199{
Tim Peters9e4ca102001-10-11 18:31:31 +0000200 node->gc.gc_next = list;
201 node->gc.gc_prev = list->gc.gc_prev;
202 node->gc.gc_prev->gc.gc_next = node;
203 list->gc.gc_prev = node;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000204}
Tim Peterse2d59182004-11-01 01:39:08 +0000205#endif
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000206
Tim Peterse2d59182004-11-01 01:39:08 +0000207/* Remove `node` from the gc list it's currently in. */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000208static void
209gc_list_remove(PyGC_Head *node)
210{
Tim Peters9e4ca102001-10-11 18:31:31 +0000211 node->gc.gc_prev->gc.gc_next = node->gc.gc_next;
212 node->gc.gc_next->gc.gc_prev = node->gc.gc_prev;
213 node->gc.gc_next = NULL; /* object is not currently tracked */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000214}
215
Tim Peterse2d59182004-11-01 01:39:08 +0000216/* Move `node` from the gc list it's currently in (which is not explicitly
217 * named here) to the end of `list`. This is semantically the same as
218 * gc_list_remove(node) followed by gc_list_append(node, list).
219 */
220static void
221gc_list_move(PyGC_Head *node, PyGC_Head *list)
222{
Tim Petersbc1d1b82004-11-01 16:39:57 +0000223 PyGC_Head *new_prev;
Tim Peterse2d59182004-11-01 01:39:08 +0000224 PyGC_Head *current_prev = node->gc.gc_prev;
225 PyGC_Head *current_next = node->gc.gc_next;
Tim Petersbc1d1b82004-11-01 16:39:57 +0000226 /* Unlink from current list. */
Tim Peterse2d59182004-11-01 01:39:08 +0000227 current_prev->gc.gc_next = current_next;
228 current_next->gc.gc_prev = current_prev;
Tim Petersbc1d1b82004-11-01 16:39:57 +0000229 /* Relink at end of new list. */
230 new_prev = node->gc.gc_prev = list->gc.gc_prev;
Tim Peterse2d59182004-11-01 01:39:08 +0000231 new_prev->gc.gc_next = list->gc.gc_prev = node;
Tim Petersbc1d1b82004-11-01 16:39:57 +0000232 node->gc.gc_next = list;
Tim Peterse2d59182004-11-01 01:39:08 +0000233}
234
235/* append list `from` onto list `to`; `from` becomes an empty list */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000236static void
237gc_list_merge(PyGC_Head *from, PyGC_Head *to)
238{
239 PyGC_Head *tail;
Tim Peterse2d59182004-11-01 01:39:08 +0000240 assert(from != to);
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000241 if (!gc_list_is_empty(from)) {
Tim Peters9e4ca102001-10-11 18:31:31 +0000242 tail = to->gc.gc_prev;
243 tail->gc.gc_next = from->gc.gc_next;
244 tail->gc.gc_next->gc.gc_prev = tail;
245 to->gc.gc_prev = from->gc.gc_prev;
246 to->gc.gc_prev->gc.gc_next = to;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000247 }
248 gc_list_init(from);
249}
250
Neal Norwitz7b216c52006-03-04 20:01:53 +0000251static Py_ssize_t
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000252gc_list_size(PyGC_Head *list)
253{
254 PyGC_Head *gc;
Neal Norwitz7b216c52006-03-04 20:01:53 +0000255 Py_ssize_t n = 0;
Tim Peters9e4ca102001-10-11 18:31:31 +0000256 for (gc = list->gc.gc_next; gc != list; gc = gc->gc.gc_next) {
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000257 n++;
258 }
259 return n;
260}
261
Tim Peters259272b2003-04-06 19:41:39 +0000262/* Append objects in a GC list to a Python list.
263 * Return 0 if all OK, < 0 if error (out of memory for list).
264 */
265static int
266append_objects(PyObject *py_list, PyGC_Head *gc_list)
267{
268 PyGC_Head *gc;
269 for (gc = gc_list->gc.gc_next; gc != gc_list; gc = gc->gc.gc_next) {
270 PyObject *op = FROM_GC(gc);
271 if (op != py_list) {
272 if (PyList_Append(py_list, op)) {
273 return -1; /* exception */
274 }
275 }
276 }
277 return 0;
278}
279
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000280/*** end of list stuff ***/
281
282
Tim Peters19b74c72002-07-01 03:52:19 +0000283/* Set all gc_refs = ob_refcnt. After this, gc_refs is > 0 for all objects
284 * in containers, and is GC_REACHABLE for all tracked gc objects not in
285 * containers.
Tim Peters88396172002-06-30 17:56:40 +0000286 */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000287static void
288update_refs(PyGC_Head *containers)
289{
Tim Peters9e4ca102001-10-11 18:31:31 +0000290 PyGC_Head *gc = containers->gc.gc_next;
Tim Petersea405632002-07-02 00:52:30 +0000291 for (; gc != containers; gc = gc->gc.gc_next) {
292 assert(gc->gc.gc_refs == GC_REACHABLE);
Christian Heimes90aa7642007-12-19 02:45:37 +0000293 gc->gc.gc_refs = Py_REFCNT(FROM_GC(gc));
Tim Peters780c4972003-11-14 00:01:17 +0000294 /* Python's cyclic gc should never see an incoming refcount
295 * of 0: if something decref'ed to 0, it should have been
296 * deallocated immediately at that time.
297 * Possible cause (if the assert triggers): a tp_dealloc
298 * routine left a gc-aware object tracked during its teardown
299 * phase, and did something-- or allowed something to happen --
300 * that called back into Python. gc can trigger then, and may
301 * see the still-tracked dying object. Before this assert
302 * was added, such mistakes went on to allow gc to try to
303 * delete the object again. In a debug build, that caused
304 * a mysterious segfault, when _Py_ForgetReference tried
305 * to remove the object from the doubly-linked list of all
306 * objects a second time. In a release build, an actual
307 * double deallocation occurred, which leads to corruption
308 * of the allocator's internal bookkeeping pointers. That's
309 * so serious that maybe this should be a release-build
310 * check instead of an assert?
311 */
312 assert(gc->gc.gc_refs != 0);
Tim Petersea405632002-07-02 00:52:30 +0000313 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000314}
315
Tim Peters19b74c72002-07-01 03:52:19 +0000316/* A traversal callback for subtract_refs. */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000317static int
318visit_decref(PyObject *op, void *data)
319{
Tim Peters93cd83e2002-06-30 21:31:03 +0000320 assert(op != NULL);
Tim Peters19b74c72002-07-01 03:52:19 +0000321 if (PyObject_IS_GC(op)) {
322 PyGC_Head *gc = AS_GC(op);
323 /* We're only interested in gc_refs for objects in the
324 * generation being collected, which can be recognized
325 * because only they have positive gc_refs.
326 */
Tim Petersaab713b2002-07-02 22:15:28 +0000327 assert(gc->gc.gc_refs != 0); /* else refcount was too small */
Tim Peters19b74c72002-07-01 03:52:19 +0000328 if (gc->gc.gc_refs > 0)
329 gc->gc.gc_refs--;
330 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000331 return 0;
332}
333
Tim Peters19b74c72002-07-01 03:52:19 +0000334/* Subtract internal references from gc_refs. After this, gc_refs is >= 0
335 * for all objects in containers, and is GC_REACHABLE for all tracked gc
336 * objects not in containers. The ones with gc_refs > 0 are directly
337 * reachable from outside containers, and so can't be collected.
338 */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000339static void
340subtract_refs(PyGC_Head *containers)
341{
342 traverseproc traverse;
Tim Peters9e4ca102001-10-11 18:31:31 +0000343 PyGC_Head *gc = containers->gc.gc_next;
344 for (; gc != containers; gc=gc->gc.gc_next) {
Christian Heimes90aa7642007-12-19 02:45:37 +0000345 traverse = Py_TYPE(FROM_GC(gc))->tp_traverse;
Neil Schemenauer43411b52001-08-30 00:05:51 +0000346 (void) traverse(FROM_GC(gc),
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000347 (visitproc)visit_decref,
348 NULL);
349 }
350}
351
Tim Peters19b74c72002-07-01 03:52:19 +0000352/* A traversal callback for move_unreachable. */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000353static int
Tim Peters19b74c72002-07-01 03:52:19 +0000354visit_reachable(PyObject *op, PyGC_Head *reachable)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000355{
Tim Petersea405632002-07-02 00:52:30 +0000356 if (PyObject_IS_GC(op)) {
Tim Peters19b74c72002-07-01 03:52:19 +0000357 PyGC_Head *gc = AS_GC(op);
Martin v. Löwis6db0e002006-03-01 16:56:25 +0000358 const Py_ssize_t gc_refs = gc->gc.gc_refs;
Tim Peters19b74c72002-07-01 03:52:19 +0000359
360 if (gc_refs == 0) {
361 /* This is in move_unreachable's 'young' list, but
362 * the traversal hasn't yet gotten to it. All
363 * we need to do is tell move_unreachable that it's
364 * reachable.
365 */
366 gc->gc.gc_refs = 1;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000367 }
Tim Peters19b74c72002-07-01 03:52:19 +0000368 else if (gc_refs == GC_TENTATIVELY_UNREACHABLE) {
369 /* This had gc_refs = 0 when move_unreachable got
370 * to it, but turns out it's reachable after all.
371 * Move it back to move_unreachable's 'young' list,
372 * and move_unreachable will eventually get to it
373 * again.
374 */
Tim Peterse2d59182004-11-01 01:39:08 +0000375 gc_list_move(gc, reachable);
Tim Peters19b74c72002-07-01 03:52:19 +0000376 gc->gc.gc_refs = 1;
377 }
378 /* Else there's nothing to do.
379 * If gc_refs > 0, it must be in move_unreachable's 'young'
380 * list, and move_unreachable will eventually get to it.
381 * If gc_refs == GC_REACHABLE, it's either in some other
382 * generation so we don't care about it, or move_unreachable
Tim Peters6fc13d92002-07-02 18:12:35 +0000383 * already dealt with it.
Tim Petersea405632002-07-02 00:52:30 +0000384 * If gc_refs == GC_UNTRACKED, it must be ignored.
Tim Peters19b74c72002-07-01 03:52:19 +0000385 */
Tim Petersea405632002-07-02 00:52:30 +0000386 else {
387 assert(gc_refs > 0
388 || gc_refs == GC_REACHABLE
389 || gc_refs == GC_UNTRACKED);
390 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000391 }
392 return 0;
393}
394
Tim Peters19b74c72002-07-01 03:52:19 +0000395/* Move the unreachable objects from young to unreachable. After this,
396 * all objects in young have gc_refs = GC_REACHABLE, and all objects in
397 * unreachable have gc_refs = GC_TENTATIVELY_UNREACHABLE. All tracked
398 * gc objects not in young or unreachable still have gc_refs = GC_REACHABLE.
399 * All objects in young after this are directly or indirectly reachable
400 * from outside the original young; and all objects in unreachable are
401 * not.
Tim Peters88396172002-06-30 17:56:40 +0000402 */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000403static void
Tim Peters19b74c72002-07-01 03:52:19 +0000404move_unreachable(PyGC_Head *young, PyGC_Head *unreachable)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000405{
Tim Peters19b74c72002-07-01 03:52:19 +0000406 PyGC_Head *gc = young->gc.gc_next;
407
408 /* Invariants: all objects "to the left" of us in young have gc_refs
409 * = GC_REACHABLE, and are indeed reachable (directly or indirectly)
410 * from outside the young list as it was at entry. All other objects
411 * from the original young "to the left" of us are in unreachable now,
412 * and have gc_refs = GC_TENTATIVELY_UNREACHABLE. All objects to the
413 * left of us in 'young' now have been scanned, and no objects here
414 * or to the right have been scanned yet.
415 */
416
417 while (gc != young) {
418 PyGC_Head *next;
419
Tim Peters6fc13d92002-07-02 18:12:35 +0000420 if (gc->gc.gc_refs) {
421 /* gc is definitely reachable from outside the
422 * original 'young'. Mark it as such, and traverse
423 * its pointers to find any other objects that may
424 * be directly reachable from it. Note that the
425 * call to tp_traverse may append objects to young,
426 * so we have to wait until it returns to determine
427 * the next object to visit.
428 */
429 PyObject *op = FROM_GC(gc);
Christian Heimes90aa7642007-12-19 02:45:37 +0000430 traverseproc traverse = Py_TYPE(op)->tp_traverse;
Tim Peters6fc13d92002-07-02 18:12:35 +0000431 assert(gc->gc.gc_refs > 0);
432 gc->gc.gc_refs = GC_REACHABLE;
433 (void) traverse(op,
434 (visitproc)visit_reachable,
435 (void *)young);
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000436 next = gc->gc.gc_next;
437 if (PyTuple_CheckExact(op)) {
438 _PyTuple_MaybeUntrack(op);
439 }
440 else if (PyDict_CheckExact(op)) {
441 _PyDict_MaybeUntrack(op);
442 }
Tim Peters6fc13d92002-07-02 18:12:35 +0000443 }
444 else {
Tim Peters19b74c72002-07-01 03:52:19 +0000445 /* This *may* be unreachable. To make progress,
446 * assume it is. gc isn't directly reachable from
447 * any object we've already traversed, but may be
448 * reachable from an object we haven't gotten to yet.
449 * visit_reachable will eventually move gc back into
450 * young if that's so, and we'll see it again.
451 */
452 next = gc->gc.gc_next;
Tim Peterse2d59182004-11-01 01:39:08 +0000453 gc_list_move(gc, unreachable);
Tim Peters19b74c72002-07-01 03:52:19 +0000454 gc->gc.gc_refs = GC_TENTATIVELY_UNREACHABLE;
455 }
Tim Peters19b74c72002-07-01 03:52:19 +0000456 gc = next;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000457 }
458}
459
Amaury Forgeot d'Arcad8dcd52007-12-10 23:58:35 +0000460/* Return true if object has a finalization method. */
Neil Schemenauera765c122001-11-01 17:35:23 +0000461static int
462has_finalizer(PyObject *op)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000463{
Guido van Rossum50e9fb92006-08-17 05:42:55 +0000464 if (PyGen_CheckExact(op))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000465 return PyGen_NeedsFinalizing((PyGenObject *)op);
466 else
Thomas Wouters3dfc3c12006-08-21 22:15:41 +0000467 return op->ob_type->tp_del != NULL;
Neil Schemenauera765c122001-11-01 17:35:23 +0000468}
469
Tim Petersead8b7a2004-10-30 23:09:22 +0000470/* Move the objects in unreachable with __del__ methods into `finalizers`.
471 * Objects moved into `finalizers` have gc_refs set to GC_REACHABLE; the
472 * objects remaining in unreachable are left at GC_TENTATIVELY_UNREACHABLE.
Jeremy Hyltonce136e92003-04-04 19:59:06 +0000473 */
Neil Schemenauera765c122001-11-01 17:35:23 +0000474static void
Tim Petersead8b7a2004-10-30 23:09:22 +0000475move_finalizers(PyGC_Head *unreachable, PyGC_Head *finalizers)
Neil Schemenauera765c122001-11-01 17:35:23 +0000476{
Tim Petersead8b7a2004-10-30 23:09:22 +0000477 PyGC_Head *gc;
478 PyGC_Head *next;
Tim Petersf6b80452003-04-07 19:21:15 +0000479
Tim Petersead8b7a2004-10-30 23:09:22 +0000480 /* March over unreachable. Move objects with finalizers into
481 * `finalizers`.
482 */
483 for (gc = unreachable->gc.gc_next; gc != unreachable; gc = next) {
Neil Schemenauer43411b52001-08-30 00:05:51 +0000484 PyObject *op = FROM_GC(gc);
Jeremy Hyltonce136e92003-04-04 19:59:06 +0000485
Tim Petersf6ae7a42003-04-05 18:40:50 +0000486 assert(IS_TENTATIVELY_UNREACHABLE(op));
Tim Petersead8b7a2004-10-30 23:09:22 +0000487 next = gc->gc.gc_next;
Tim Petersf6ae7a42003-04-05 18:40:50 +0000488
Tim Petersf6b80452003-04-07 19:21:15 +0000489 if (has_finalizer(op)) {
Tim Peterse2d59182004-11-01 01:39:08 +0000490 gc_list_move(gc, finalizers);
Tim Petersf6b80452003-04-07 19:21:15 +0000491 gc->gc.gc_refs = GC_REACHABLE;
Jeremy Hyltonce136e92003-04-04 19:59:06 +0000492 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000493 }
494}
495
Tim Peters19b74c72002-07-01 03:52:19 +0000496/* A traversal callback for move_finalizer_reachable. */
497static int
498visit_move(PyObject *op, PyGC_Head *tolist)
499{
500 if (PyObject_IS_GC(op)) {
Tim Petersea405632002-07-02 00:52:30 +0000501 if (IS_TENTATIVELY_UNREACHABLE(op)) {
Tim Peters19b74c72002-07-01 03:52:19 +0000502 PyGC_Head *gc = AS_GC(op);
Tim Peterse2d59182004-11-01 01:39:08 +0000503 gc_list_move(gc, tolist);
Tim Peters19b74c72002-07-01 03:52:19 +0000504 gc->gc.gc_refs = GC_REACHABLE;
505 }
506 }
507 return 0;
508}
509
510/* Move objects that are reachable from finalizers, from the unreachable set
Tim Petersf6b80452003-04-07 19:21:15 +0000511 * into finalizers set.
Tim Peters19b74c72002-07-01 03:52:19 +0000512 */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000513static void
Tim Petersf6b80452003-04-07 19:21:15 +0000514move_finalizer_reachable(PyGC_Head *finalizers)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000515{
516 traverseproc traverse;
Tim Peters9e4ca102001-10-11 18:31:31 +0000517 PyGC_Head *gc = finalizers->gc.gc_next;
Tim Petersbf384c22003-04-06 00:11:39 +0000518 for (; gc != finalizers; gc = gc->gc.gc_next) {
519 /* Note that the finalizers list may grow during this. */
Christian Heimes90aa7642007-12-19 02:45:37 +0000520 traverse = Py_TYPE(FROM_GC(gc))->tp_traverse;
Tim Peters88396172002-06-30 17:56:40 +0000521 (void) traverse(FROM_GC(gc),
Tim Petersbf384c22003-04-06 00:11:39 +0000522 (visitproc)visit_move,
Tim Petersf6b80452003-04-07 19:21:15 +0000523 (void *)finalizers);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000524 }
525}
526
Tim Petersead8b7a2004-10-30 23:09:22 +0000527/* Clear all weakrefs to unreachable objects, and if such a weakref has a
528 * callback, invoke it if necessary. Note that it's possible for such
529 * weakrefs to be outside the unreachable set -- indeed, those are precisely
530 * the weakrefs whose callbacks must be invoked. See gc_weakref.txt for
531 * overview & some details. Some weakrefs with callbacks may be reclaimed
532 * directly by this routine; the number reclaimed is the return value. Other
533 * weakrefs with callbacks may be moved into the `old` generation. Objects
534 * moved into `old` have gc_refs set to GC_REACHABLE; the objects remaining in
535 * unreachable are left at GC_TENTATIVELY_UNREACHABLE. When this returns,
536 * no object in `unreachable` is weakly referenced anymore.
Tim Peters403a2032003-11-20 21:21:46 +0000537 */
538static int
Tim Petersead8b7a2004-10-30 23:09:22 +0000539handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
Tim Peters403a2032003-11-20 21:21:46 +0000540{
Tim Petersead8b7a2004-10-30 23:09:22 +0000541 PyGC_Head *gc;
542 PyObject *op; /* generally FROM_GC(gc) */
543 PyWeakReference *wr; /* generally a cast of op */
Tim Petersead8b7a2004-10-30 23:09:22 +0000544 PyGC_Head wrcb_to_call; /* weakrefs with callbacks to call */
Tim Petersead8b7a2004-10-30 23:09:22 +0000545 PyGC_Head *next;
Tim Peters403a2032003-11-20 21:21:46 +0000546 int num_freed = 0;
547
Tim Petersead8b7a2004-10-30 23:09:22 +0000548 gc_list_init(&wrcb_to_call);
Tim Peters403a2032003-11-20 21:21:46 +0000549
Tim Petersead8b7a2004-10-30 23:09:22 +0000550 /* Clear all weakrefs to the objects in unreachable. If such a weakref
551 * also has a callback, move it into `wrcb_to_call` if the callback
Tim Peterscc2a8662004-10-31 22:12:43 +0000552 * needs to be invoked. Note that we cannot invoke any callbacks until
553 * all weakrefs to unreachable objects are cleared, lest the callback
554 * resurrect an unreachable object via a still-active weakref. We
555 * make another pass over wrcb_to_call, invoking callbacks, after this
556 * pass completes.
Tim Petersead8b7a2004-10-30 23:09:22 +0000557 */
558 for (gc = unreachable->gc.gc_next; gc != unreachable; gc = next) {
559 PyWeakReference **wrlist;
560
561 op = FROM_GC(gc);
562 assert(IS_TENTATIVELY_UNREACHABLE(op));
563 next = gc->gc.gc_next;
564
Christian Heimes90aa7642007-12-19 02:45:37 +0000565 if (! PyType_SUPPORTS_WEAKREFS(Py_TYPE(op)))
Tim Petersead8b7a2004-10-30 23:09:22 +0000566 continue;
567
568 /* It supports weakrefs. Does it have any? */
569 wrlist = (PyWeakReference **)
570 PyObject_GET_WEAKREFS_LISTPTR(op);
571
572 /* `op` may have some weakrefs. March over the list, clear
573 * all the weakrefs, and move the weakrefs with callbacks
Tim Peterscc2a8662004-10-31 22:12:43 +0000574 * that must be called into wrcb_to_call.
Tim Petersead8b7a2004-10-30 23:09:22 +0000575 */
576 for (wr = *wrlist; wr != NULL; wr = *wrlist) {
577 PyGC_Head *wrasgc; /* AS_GC(wr) */
578
579 /* _PyWeakref_ClearRef clears the weakref but leaves
580 * the callback pointer intact. Obscure: it also
581 * changes *wrlist.
582 */
583 assert(wr->wr_object == op);
584 _PyWeakref_ClearRef(wr);
585 assert(wr->wr_object == Py_None);
586 if (wr->wr_callback == NULL)
587 continue; /* no callback */
588
589 /* Headache time. `op` is going away, and is weakly referenced by
590 * `wr`, which has a callback. Should the callback be invoked? If wr
591 * is also trash, no:
592 *
593 * 1. There's no need to call it. The object and the weakref are
594 * both going away, so it's legitimate to pretend the weakref is
595 * going away first. The user has to ensure a weakref outlives its
596 * referent if they want a guarantee that the wr callback will get
597 * invoked.
598 *
599 * 2. It may be catastrophic to call it. If the callback is also in
600 * cyclic trash (CT), then although the CT is unreachable from
601 * outside the current generation, CT may be reachable from the
602 * callback. Then the callback could resurrect insane objects.
603 *
604 * Since the callback is never needed and may be unsafe in this case,
Tim Peterscc2a8662004-10-31 22:12:43 +0000605 * wr is simply left in the unreachable set. Note that because we
606 * already called _PyWeakref_ClearRef(wr), its callback will never
607 * trigger.
Tim Petersead8b7a2004-10-30 23:09:22 +0000608 *
609 * OTOH, if wr isn't part of CT, we should invoke the callback: the
610 * weakref outlived the trash. Note that since wr isn't CT in this
611 * case, its callback can't be CT either -- wr acted as an external
612 * root to this generation, and therefore its callback did too. So
613 * nothing in CT is reachable from the callback either, so it's hard
614 * to imagine how calling it later could create a problem for us. wr
615 * is moved to wrcb_to_call in this case.
Tim Petersead8b7a2004-10-30 23:09:22 +0000616 */
Tim Peterscc2a8662004-10-31 22:12:43 +0000617 if (IS_TENTATIVELY_UNREACHABLE(wr))
618 continue;
619 assert(IS_REACHABLE(wr));
620
Tim Petersead8b7a2004-10-30 23:09:22 +0000621 /* Create a new reference so that wr can't go away
622 * before we can process it again.
623 */
624 Py_INCREF(wr);
625
Tim Peterscc2a8662004-10-31 22:12:43 +0000626 /* Move wr to wrcb_to_call, for the next pass. */
Tim Petersead8b7a2004-10-30 23:09:22 +0000627 wrasgc = AS_GC(wr);
Tim Peterscc2a8662004-10-31 22:12:43 +0000628 assert(wrasgc != next); /* wrasgc is reachable, but
629 next isn't, so they can't
630 be the same */
Tim Peterse2d59182004-11-01 01:39:08 +0000631 gc_list_move(wrasgc, &wrcb_to_call);
Tim Petersead8b7a2004-10-30 23:09:22 +0000632 }
633 }
634
Tim Peterscc2a8662004-10-31 22:12:43 +0000635 /* Invoke the callbacks we decided to honor. It's safe to invoke them
636 * because they can't reference unreachable objects.
Tim Petersead8b7a2004-10-30 23:09:22 +0000637 */
638 while (! gc_list_is_empty(&wrcb_to_call)) {
639 PyObject *temp;
640 PyObject *callback;
641
642 gc = wrcb_to_call.gc.gc_next;
643 op = FROM_GC(gc);
644 assert(IS_REACHABLE(op));
645 assert(PyWeakref_Check(op));
646 wr = (PyWeakReference *)op;
647 callback = wr->wr_callback;
648 assert(callback != NULL);
649
650 /* copy-paste of weakrefobject.c's handle_callback() */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000651 temp = PyObject_CallFunctionObjArgs(callback, wr, NULL);
Tim Petersead8b7a2004-10-30 23:09:22 +0000652 if (temp == NULL)
653 PyErr_WriteUnraisable(callback);
654 else
655 Py_DECREF(temp);
656
657 /* Give up the reference we created in the first pass. When
658 * op's refcount hits 0 (which it may or may not do right now),
Tim Peterscc2a8662004-10-31 22:12:43 +0000659 * op's tp_dealloc will decref op->wr_callback too. Note
660 * that the refcount probably will hit 0 now, and because this
661 * weakref was reachable to begin with, gc didn't already
662 * add it to its count of freed objects. Example: a reachable
663 * weak value dict maps some key to this reachable weakref.
664 * The callback removes this key->weakref mapping from the
665 * dict, leaving no other references to the weakref (excepting
666 * ours).
Tim Petersead8b7a2004-10-30 23:09:22 +0000667 */
668 Py_DECREF(op);
669 if (wrcb_to_call.gc.gc_next == gc) {
670 /* object is still alive -- move it */
Tim Peterse2d59182004-11-01 01:39:08 +0000671 gc_list_move(gc, old);
Tim Petersead8b7a2004-10-30 23:09:22 +0000672 }
673 else
674 ++num_freed;
675 }
676
Tim Peters403a2032003-11-20 21:21:46 +0000677 return num_freed;
678}
679
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000680static void
Jeremy Hylton06257772000-08-31 15:10:24 +0000681debug_cycle(char *msg, PyObject *op)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000682{
Amaury Forgeot d'Arcad8dcd52007-12-10 23:58:35 +0000683 PySys_WriteStderr("gc: %.100s <%.100s %p>\n",
Christian Heimes90aa7642007-12-19 02:45:37 +0000684 msg, Py_TYPE(op)->tp_name, op);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000685}
686
Tim Petersbf384c22003-04-06 00:11:39 +0000687/* Handle uncollectable garbage (cycles with finalizers, and stuff reachable
688 * only from such cycles).
Tim Petersf6b80452003-04-07 19:21:15 +0000689 * If DEBUG_SAVEALL, all objects in finalizers are appended to the module
690 * garbage list (a Python list), else only the objects in finalizers with
691 * __del__ methods are appended to garbage. All objects in finalizers are
692 * merged into the old list regardless.
Tim Peters259272b2003-04-06 19:41:39 +0000693 * Returns 0 if all OK, <0 on error (out of memory to grow the garbage list).
694 * The finalizers list is made empty on a successful return.
Tim Petersbf384c22003-04-06 00:11:39 +0000695 */
Tim Peters259272b2003-04-06 19:41:39 +0000696static int
Tim Petersf6b80452003-04-07 19:21:15 +0000697handle_finalizers(PyGC_Head *finalizers, PyGC_Head *old)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000698{
Tim Petersf6b80452003-04-07 19:21:15 +0000699 PyGC_Head *gc = finalizers->gc.gc_next;
700
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000701 if (garbage == NULL) {
702 garbage = PyList_New(0);
Tim Petersbf384c22003-04-06 00:11:39 +0000703 if (garbage == NULL)
704 Py_FatalError("gc couldn't create gc.garbage list");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000705 }
Tim Petersf6b80452003-04-07 19:21:15 +0000706 for (; gc != finalizers; gc = gc->gc.gc_next) {
707 PyObject *op = FROM_GC(gc);
708
709 if ((debug & DEBUG_SAVEALL) || has_finalizer(op)) {
710 if (PyList_Append(garbage, op) < 0)
711 return -1;
712 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000713 }
Tim Petersf6b80452003-04-07 19:21:15 +0000714
Tim Peters259272b2003-04-06 19:41:39 +0000715 gc_list_merge(finalizers, old);
716 return 0;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000717}
718
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000719/* Break reference cycles by clearing the containers involved. This is
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000720 * tricky business as the lists can be changing and we don't know which
Tim Peters19b74c72002-07-01 03:52:19 +0000721 * objects may be freed. It is possible I screwed something up here.
722 */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000723static void
Jeremy Hyltonce136e92003-04-04 19:59:06 +0000724delete_garbage(PyGC_Head *collectable, PyGC_Head *old)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000725{
726 inquiry clear;
727
Jeremy Hyltonce136e92003-04-04 19:59:06 +0000728 while (!gc_list_is_empty(collectable)) {
729 PyGC_Head *gc = collectable->gc.gc_next;
Neil Schemenauer43411b52001-08-30 00:05:51 +0000730 PyObject *op = FROM_GC(gc);
Tim Peters88396172002-06-30 17:56:40 +0000731
Tim Peters19b74c72002-07-01 03:52:19 +0000732 assert(IS_TENTATIVELY_UNREACHABLE(op));
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000733 if (debug & DEBUG_SAVEALL) {
734 PyList_Append(garbage, op);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000735 }
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000736 else {
Christian Heimes90aa7642007-12-19 02:45:37 +0000737 if ((clear = Py_TYPE(op)->tp_clear) != NULL) {
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000738 Py_INCREF(op);
Jeremy Hylton8a135182002-06-06 23:23:55 +0000739 clear(op);
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000740 Py_DECREF(op);
741 }
742 }
Jeremy Hyltonce136e92003-04-04 19:59:06 +0000743 if (collectable->gc.gc_next == gc) {
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000744 /* object is still alive, move it, it may die later */
Tim Peterse2d59182004-11-01 01:39:08 +0000745 gc_list_move(gc, old);
Tim Peters19b74c72002-07-01 03:52:19 +0000746 gc->gc.gc_refs = GC_REACHABLE;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000747 }
748 }
749}
750
Christian Heimesa156e092008-02-16 07:38:31 +0000751/* Clear all free lists
752 * All free lists are cleared during the collection of the highest generation.
753 * Allocated items in the free list may keep a pymalloc arena occupied.
754 * Clearing the free lists may give back memory to the OS earlier.
755 */
756static void
757clear_freelists(void)
758{
759 (void)PyMethod_ClearFreeList();
760 (void)PyFrame_ClearFreeList();
761 (void)PyCFunction_ClearFreeList();
762 (void)PyTuple_ClearFreeList();
763 (void)PyUnicode_ClearFreeList();
Georg Brandl2ee470f2008-07-16 12:55:28 +0000764 (void)PyFloat_ClearFreeList();
Christian Heimesa156e092008-02-16 07:38:31 +0000765}
766
Antoine Pitrou621601a2008-12-17 23:18:19 +0000767static double
768get_time(void)
769{
770 double result = 0;
771 if (tmod != NULL) {
772 PyObject *f = PyObject_CallMethod(tmod, "time", NULL);
773 if (f == NULL) {
774 PyErr_Clear();
775 }
776 else {
777 if (PyFloat_Check(f))
778 result = PyFloat_AsDouble(f);
779 Py_DECREF(f);
780 }
781 }
782 return result;
783}
784
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000785/* This is the main function. Read this to understand how the
786 * collection process works. */
Neal Norwitz7b216c52006-03-04 20:01:53 +0000787static Py_ssize_t
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000788collect(int generation)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000789{
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000790 int i;
Neal Norwitz7b216c52006-03-04 20:01:53 +0000791 Py_ssize_t m = 0; /* # objects collected */
792 Py_ssize_t n = 0; /* # unreachable objects that couldn't be collected */
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000793 PyGC_Head *young; /* the generation we are examining */
794 PyGC_Head *old; /* next older generation */
Tim Peters403a2032003-11-20 21:21:46 +0000795 PyGC_Head unreachable; /* non-problematic unreachable trash */
796 PyGC_Head finalizers; /* objects with, & reachable from, __del__ */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000797 PyGC_Head *gc;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000798 double t1 = 0.0;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000799
Tim Peters93ad66d2003-04-05 17:15:44 +0000800 if (delstr == NULL) {
Martin v. Löwis5b222132007-06-10 09:51:05 +0000801 delstr = PyUnicode_InternFromString("__del__");
Tim Peters93ad66d2003-04-05 17:15:44 +0000802 if (delstr == NULL)
803 Py_FatalError("gc couldn't allocate \"__del__\"");
804 }
805
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000806 if (debug & DEBUG_STATS) {
Antoine Pitrou621601a2008-12-17 23:18:19 +0000807 t1 = get_time();
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000808 PySys_WriteStderr("gc: collecting generation %d...\n",
809 generation);
810 PySys_WriteStderr("gc: objects in each generation:");
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000811 for (i = 0; i < NUM_GENERATIONS; i++)
812 PySys_WriteStderr(" %" PY_FORMAT_SIZE_T "d",
813 gc_list_size(GEN_HEAD(i)));
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000814 PySys_WriteStderr("\n");
815 }
816
817 /* update collection and allocation counters */
818 if (generation+1 < NUM_GENERATIONS)
819 generations[generation+1].count += 1;
820 for (i = 0; i <= generation; i++)
Neil Schemenauerc9051642002-06-28 19:16:04 +0000821 generations[i].count = 0;
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000822
823 /* merge younger generations with one we are currently collecting */
824 for (i = 0; i < generation; i++) {
825 gc_list_merge(GEN_HEAD(i), GEN_HEAD(generation));
826 }
827
828 /* handy references */
829 young = GEN_HEAD(generation);
Tim Peters19b74c72002-07-01 03:52:19 +0000830 if (generation < NUM_GENERATIONS-1)
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000831 old = GEN_HEAD(generation+1);
Tim Peters19b74c72002-07-01 03:52:19 +0000832 else
833 old = young;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000834
835 /* Using ob_refcnt and gc_refs, calculate which objects in the
Tim Petersead8b7a2004-10-30 23:09:22 +0000836 * container set are reachable from outside the set (i.e., have a
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000837 * refcount greater than 0 when all the references within the
Tim Petersead8b7a2004-10-30 23:09:22 +0000838 * set are taken into account).
Tim Peters19b74c72002-07-01 03:52:19 +0000839 */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000840 update_refs(young);
841 subtract_refs(young);
842
Tim Peters19b74c72002-07-01 03:52:19 +0000843 /* Leave everything reachable from outside young in young, and move
844 * everything else (in young) to unreachable.
845 * NOTE: This used to move the reachable objects into a reachable
846 * set instead. But most things usually turn out to be reachable,
847 * so it's more efficient to move the unreachable things.
848 */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000849 gc_list_init(&unreachable);
Tim Peters19b74c72002-07-01 03:52:19 +0000850 move_unreachable(young, &unreachable);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000851
Tim Peters19b74c72002-07-01 03:52:19 +0000852 /* Move reachable objects to next generation. */
Antoine Pitrou14b78f52009-01-09 22:27:08 +0000853 if (young != old) {
854 if (generation == NUM_GENERATIONS - 2) {
855 long_lived_pending += gc_list_size(young);
856 }
Tim Peters19b74c72002-07-01 03:52:19 +0000857 gc_list_merge(young, old);
Antoine Pitrou14b78f52009-01-09 22:27:08 +0000858 }
859 else {
860 long_lived_pending = 0;
861 long_lived_total = gc_list_size(young);
862 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000863
Tim Peters19b74c72002-07-01 03:52:19 +0000864 /* All objects in unreachable are trash, but objects reachable from
865 * finalizers can't safely be deleted. Python programmers should take
866 * care not to create such things. For Python, finalizers means
Tim Peters403a2032003-11-20 21:21:46 +0000867 * instance objects with __del__ methods. Weakrefs with callbacks
Tim Petersead8b7a2004-10-30 23:09:22 +0000868 * can also call arbitrary Python code but they will be dealt with by
869 * handle_weakrefs().
Tim Petersf6b80452003-04-07 19:21:15 +0000870 */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000871 gc_list_init(&finalizers);
Tim Petersead8b7a2004-10-30 23:09:22 +0000872 move_finalizers(&unreachable, &finalizers);
Tim Petersbf384c22003-04-06 00:11:39 +0000873 /* finalizers contains the unreachable objects with a finalizer;
Tim Peters403a2032003-11-20 21:21:46 +0000874 * unreachable objects reachable *from* those are also uncollectable,
875 * and we move those into the finalizers list too.
Tim Petersbf384c22003-04-06 00:11:39 +0000876 */
Tim Petersf6b80452003-04-07 19:21:15 +0000877 move_finalizer_reachable(&finalizers);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000878
879 /* Collect statistics on collectable objects found and print
Tim Peters403a2032003-11-20 21:21:46 +0000880 * debugging information.
881 */
Tim Petersf6b80452003-04-07 19:21:15 +0000882 for (gc = unreachable.gc.gc_next; gc != &unreachable;
Tim Peters9e4ca102001-10-11 18:31:31 +0000883 gc = gc->gc.gc_next) {
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000884 m++;
Jeremy Hylton06257772000-08-31 15:10:24 +0000885 if (debug & DEBUG_COLLECTABLE) {
Neil Schemenauer43411b52001-08-30 00:05:51 +0000886 debug_cycle("collectable", FROM_GC(gc));
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000887 }
888 }
Tim Petersead8b7a2004-10-30 23:09:22 +0000889
890 /* Clear weakrefs and invoke callbacks as necessary. */
891 m += handle_weakrefs(&unreachable, old);
892
Tim Petersfb2ab4d2003-04-07 22:41:24 +0000893 /* Call tp_clear on objects in the unreachable set. This will cause
894 * the reference cycles to be broken. It may also cause some objects
895 * in finalizers to be freed.
896 */
Tim Petersf6b80452003-04-07 19:21:15 +0000897 delete_garbage(&unreachable, old);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000898
899 /* Collect statistics on uncollectable objects found and print
900 * debugging information. */
Tim Peters50c61d52003-04-06 01:50:50 +0000901 for (gc = finalizers.gc.gc_next;
Tim Petersbf384c22003-04-06 00:11:39 +0000902 gc != &finalizers;
903 gc = gc->gc.gc_next) {
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000904 n++;
Tim Petersbf384c22003-04-06 00:11:39 +0000905 if (debug & DEBUG_UNCOLLECTABLE)
Neil Schemenauer43411b52001-08-30 00:05:51 +0000906 debug_cycle("uncollectable", FROM_GC(gc));
Tim Petersbf384c22003-04-06 00:11:39 +0000907 }
Jeremy Hylton06257772000-08-31 15:10:24 +0000908 if (debug & DEBUG_STATS) {
Antoine Pitrou621601a2008-12-17 23:18:19 +0000909 double t2 = get_time();
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000910 if (m == 0 && n == 0)
Antoine Pitrou621601a2008-12-17 23:18:19 +0000911 PySys_WriteStderr("gc: done");
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000912 else
Neal Norwitze22373d2006-03-06 23:31:56 +0000913 PySys_WriteStderr(
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000914 "gc: done, "
915 "%" PY_FORMAT_SIZE_T "d unreachable, "
Antoine Pitrou621601a2008-12-17 23:18:19 +0000916 "%" PY_FORMAT_SIZE_T "d uncollectable",
Neal Norwitze22373d2006-03-06 23:31:56 +0000917 n+m, n);
Antoine Pitrou621601a2008-12-17 23:18:19 +0000918 if (t1 && t2) {
919 PySys_WriteStderr(", %.4fs elapsed", t2-t1);
920 }
921 PySys_WriteStderr(".\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000922 }
923
924 /* Append instances in the uncollectable set to a Python
925 * reachable list of garbage. The programmer has to deal with
Tim Petersbf384c22003-04-06 00:11:39 +0000926 * this if they insist on creating this type of structure.
927 */
Tim Petersf6b80452003-04-07 19:21:15 +0000928 (void)handle_finalizers(&finalizers, old);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000929
Christian Heimesa156e092008-02-16 07:38:31 +0000930 /* Clear free list only during the collection of the higest
931 * generation */
932 if (generation == NUM_GENERATIONS-1) {
933 clear_freelists();
934 }
935
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000936 if (PyErr_Occurred()) {
Tim Petersf6b80452003-04-07 19:21:15 +0000937 if (gc_str == NULL)
Neal Norwitz53cbdaa2007-08-23 21:42:55 +0000938 gc_str = PyUnicode_FromString("garbage collection");
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000939 PyErr_WriteUnraisable(gc_str);
940 Py_FatalError("unexpected exception during garbage collection");
941 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000942 return n+m;
943}
944
Neal Norwitz7b216c52006-03-04 20:01:53 +0000945static Py_ssize_t
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000946collect_generations(void)
947{
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000948 int i;
Neal Norwitz7b216c52006-03-04 20:01:53 +0000949 Py_ssize_t n = 0;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000950
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000951 /* Find the oldest generation (higest numbered) where the count
952 * exceeds the threshold. Objects in the that generation and
953 * generations younger than it will be collected. */
954 for (i = NUM_GENERATIONS-1; i >= 0; i--) {
955 if (generations[i].count > generations[i].threshold) {
Antoine Pitrou14b78f52009-01-09 22:27:08 +0000956 /* Avoid quadratic performance degradation in number
957 of tracked objects. See comments at the beginning
958 of this file, and issue #4074.
959 */
960 if (i == NUM_GENERATIONS - 1
961 && long_lived_pending < long_lived_total / 4)
962 continue;
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000963 n = collect(i);
964 break;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000965 }
966 }
967 return n;
968}
969
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000970PyDoc_STRVAR(gc_enable__doc__,
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000971"enable() -> None\n"
972"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000973"Enable automatic garbage collection.\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000974
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000975static PyObject *
Tim Peters50c61d52003-04-06 01:50:50 +0000976gc_enable(PyObject *self, PyObject *noargs)
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000977{
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000978 enabled = 1;
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000979 Py_INCREF(Py_None);
980 return Py_None;
981}
982
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000983PyDoc_STRVAR(gc_disable__doc__,
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000984"disable() -> None\n"
985"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000986"Disable automatic garbage collection.\n");
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000987
988static PyObject *
Tim Peters50c61d52003-04-06 01:50:50 +0000989gc_disable(PyObject *self, PyObject *noargs)
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000990{
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000991 enabled = 0;
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000992 Py_INCREF(Py_None);
993 return Py_None;
994}
995
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000996PyDoc_STRVAR(gc_isenabled__doc__,
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000997"isenabled() -> status\n"
998"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000999"Returns true if automatic garbage collection is enabled.\n");
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001000
1001static PyObject *
Tim Peters50c61d52003-04-06 01:50:50 +00001002gc_isenabled(PyObject *self, PyObject *noargs)
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001003{
Raymond Hettinger674d56b2004-01-04 04:00:13 +00001004 return PyBool_FromLong((long)enabled);
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001005}
1006
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001007PyDoc_STRVAR(gc_collect__doc__,
Barry Warsawd3c38ff2006-03-07 09:46:03 +00001008"collect([generation]) -> n\n"
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001009"\n"
Barry Warsawd3c38ff2006-03-07 09:46:03 +00001010"With no arguments, run a full collection. The optional argument\n"
1011"may be an integer specifying which generation to collect. A ValueError\n"
1012"is raised if the generation number is invalid.\n\n"
1013"The number of unreachable objects is returned.\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001014
1015static PyObject *
Barry Warsawd3c38ff2006-03-07 09:46:03 +00001016gc_collect(PyObject *self, PyObject *args, PyObject *kws)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001017{
Barry Warsawd3c38ff2006-03-07 09:46:03 +00001018 static char *keywords[] = {"generation", NULL};
1019 int genarg = NUM_GENERATIONS - 1;
Neal Norwitz7b216c52006-03-04 20:01:53 +00001020 Py_ssize_t n;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001021
Barry Warsawd3c38ff2006-03-07 09:46:03 +00001022 if (!PyArg_ParseTupleAndKeywords(args, kws, "|i", keywords, &genarg))
1023 return NULL;
1024
1025 else if (genarg < 0 || genarg >= NUM_GENERATIONS) {
1026 PyErr_SetString(PyExc_ValueError, "invalid generation");
1027 return NULL;
1028 }
1029
Tim Peters50c61d52003-04-06 01:50:50 +00001030 if (collecting)
Neil Schemenauere8c40cb2001-10-31 23:09:35 +00001031 n = 0; /* already collecting, don't do anything */
Neil Schemenauere8c40cb2001-10-31 23:09:35 +00001032 else {
1033 collecting = 1;
Barry Warsawd3c38ff2006-03-07 09:46:03 +00001034 n = collect(genarg);
Neil Schemenauere8c40cb2001-10-31 23:09:35 +00001035 collecting = 0;
1036 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001037
Christian Heimes217cfd12007-12-02 14:31:20 +00001038 return PyLong_FromSsize_t(n);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001039}
1040
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001041PyDoc_STRVAR(gc_set_debug__doc__,
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001042"set_debug(flags) -> None\n"
1043"\n"
1044"Set the garbage collection debugging flags. Debugging information is\n"
1045"written to sys.stderr.\n"
1046"\n"
1047"flags is an integer and can have the following bits turned on:\n"
1048"\n"
1049" DEBUG_STATS - Print statistics during collection.\n"
1050" DEBUG_COLLECTABLE - Print collectable objects found.\n"
1051" DEBUG_UNCOLLECTABLE - Print unreachable but uncollectable objects found.\n"
Neil Schemenauer544de1e2000-09-22 15:22:38 +00001052" DEBUG_SAVEALL - Save objects to gc.garbage rather than freeing them.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001053" DEBUG_LEAK - Debug leaking programs (everything but STATS).\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001054
1055static PyObject *
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001056gc_set_debug(PyObject *self, PyObject *args)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001057{
Neil Schemenauer7760cff2000-09-22 22:35:36 +00001058 if (!PyArg_ParseTuple(args, "i:set_debug", &debug))
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001059 return NULL;
1060
1061 Py_INCREF(Py_None);
1062 return Py_None;
1063}
1064
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001065PyDoc_STRVAR(gc_get_debug__doc__,
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001066"get_debug() -> flags\n"
1067"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001068"Get the garbage collection debugging flags.\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001069
1070static PyObject *
Tim Peters50c61d52003-04-06 01:50:50 +00001071gc_get_debug(PyObject *self, PyObject *noargs)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001072{
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001073 return Py_BuildValue("i", debug);
1074}
1075
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001076PyDoc_STRVAR(gc_set_thresh__doc__,
Neal Norwitz2a47c0f2002-01-29 00:53:41 +00001077"set_threshold(threshold0, [threshold1, threshold2]) -> None\n"
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001078"\n"
1079"Sets the collection thresholds. Setting threshold0 to zero disables\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001080"collection.\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001081
1082static PyObject *
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001083gc_set_thresh(PyObject *self, PyObject *args)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001084{
Neil Schemenauer2880ae52002-05-04 05:35:20 +00001085 int i;
1086 if (!PyArg_ParseTuple(args, "i|ii:set_threshold",
1087 &generations[0].threshold,
1088 &generations[1].threshold,
1089 &generations[2].threshold))
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001090 return NULL;
Neil Schemenauer2880ae52002-05-04 05:35:20 +00001091 for (i = 2; i < NUM_GENERATIONS; i++) {
1092 /* generations higher than 2 get the same threshold */
1093 generations[i].threshold = generations[2].threshold;
1094 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001095
1096 Py_INCREF(Py_None);
1097 return Py_None;
1098}
1099
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001100PyDoc_STRVAR(gc_get_thresh__doc__,
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001101"get_threshold() -> (threshold0, threshold1, threshold2)\n"
1102"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001103"Return the current collection thresholds\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001104
1105static PyObject *
Tim Peters50c61d52003-04-06 01:50:50 +00001106gc_get_thresh(PyObject *self, PyObject *noargs)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001107{
Neil Schemenauer2880ae52002-05-04 05:35:20 +00001108 return Py_BuildValue("(iii)",
1109 generations[0].threshold,
1110 generations[1].threshold,
1111 generations[2].threshold);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001112}
1113
Barry Warsawd3c38ff2006-03-07 09:46:03 +00001114PyDoc_STRVAR(gc_get_count__doc__,
1115"get_count() -> (count0, count1, count2)\n"
1116"\n"
1117"Return the current collection counts\n");
1118
1119static PyObject *
1120gc_get_count(PyObject *self, PyObject *noargs)
1121{
1122 return Py_BuildValue("(iii)",
1123 generations[0].count,
1124 generations[1].count,
1125 generations[2].count);
1126}
1127
Neil Schemenauer48c70342001-08-09 15:38:31 +00001128static int
Martin v. Löwis560da622001-11-24 09:24:51 +00001129referrersvisit(PyObject* obj, PyObject *objs)
Neil Schemenauer48c70342001-08-09 15:38:31 +00001130{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001131 Py_ssize_t i;
Martin v. Löwisc8fe77b2001-11-29 18:08:31 +00001132 for (i = 0; i < PyTuple_GET_SIZE(objs); i++)
1133 if (PyTuple_GET_ITEM(objs, i) == obj)
1134 return 1;
Neil Schemenauer48c70342001-08-09 15:38:31 +00001135 return 0;
1136}
1137
Neil Schemenauer17e7be62001-08-10 14:46:47 +00001138static int
Martin v. Löwis560da622001-11-24 09:24:51 +00001139gc_referrers_for(PyObject *objs, PyGC_Head *list, PyObject *resultlist)
Neil Schemenauer48c70342001-08-09 15:38:31 +00001140{
1141 PyGC_Head *gc;
1142 PyObject *obj;
1143 traverseproc traverse;
Tim Peters9e4ca102001-10-11 18:31:31 +00001144 for (gc = list->gc.gc_next; gc != list; gc = gc->gc.gc_next) {
Neil Schemenauer43411b52001-08-30 00:05:51 +00001145 obj = FROM_GC(gc);
Christian Heimes90aa7642007-12-19 02:45:37 +00001146 traverse = Py_TYPE(obj)->tp_traverse;
Neil Schemenauer48c70342001-08-09 15:38:31 +00001147 if (obj == objs || obj == resultlist)
1148 continue;
Martin v. Löwis560da622001-11-24 09:24:51 +00001149 if (traverse(obj, (visitproc)referrersvisit, objs)) {
Neil Schemenauer17e7be62001-08-10 14:46:47 +00001150 if (PyList_Append(resultlist, obj) < 0)
1151 return 0; /* error */
Neil Schemenauer48c70342001-08-09 15:38:31 +00001152 }
1153 }
Neil Schemenauer17e7be62001-08-10 14:46:47 +00001154 return 1; /* no error */
Neil Schemenauer48c70342001-08-09 15:38:31 +00001155}
1156
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001157PyDoc_STRVAR(gc_get_referrers__doc__,
Martin v. Löwis560da622001-11-24 09:24:51 +00001158"get_referrers(*objs) -> list\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001159Return the list of objects that directly refer to any of objs.");
Neil Schemenauer48c70342001-08-09 15:38:31 +00001160
Neil Schemenauer17e7be62001-08-10 14:46:47 +00001161static PyObject *
Martin v. Löwis560da622001-11-24 09:24:51 +00001162gc_get_referrers(PyObject *self, PyObject *args)
Neil Schemenauer48c70342001-08-09 15:38:31 +00001163{
Neil Schemenauer2880ae52002-05-04 05:35:20 +00001164 int i;
Neil Schemenauer48c70342001-08-09 15:38:31 +00001165 PyObject *result = PyList_New(0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001166 if (!result) return NULL;
1167
Neil Schemenauer2880ae52002-05-04 05:35:20 +00001168 for (i = 0; i < NUM_GENERATIONS; i++) {
1169 if (!(gc_referrers_for(args, GEN_HEAD(i), result))) {
1170 Py_DECREF(result);
1171 return NULL;
1172 }
Neil Schemenauer17e7be62001-08-10 14:46:47 +00001173 }
Neil Schemenauer48c70342001-08-09 15:38:31 +00001174 return result;
1175}
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001176
Tim Peters0f81ab62003-04-08 16:39:48 +00001177/* Append obj to list; return true if error (out of memory), false if OK. */
Jeremy Hylton5bd378b2003-04-03 16:28:38 +00001178static int
Tim Peters730f5532003-04-08 17:17:17 +00001179referentsvisit(PyObject *obj, PyObject *list)
Jeremy Hylton5bd378b2003-04-03 16:28:38 +00001180{
Tim Peters0f81ab62003-04-08 16:39:48 +00001181 return PyList_Append(list, obj) < 0;
Jeremy Hylton5bd378b2003-04-03 16:28:38 +00001182}
1183
Tim Peters730f5532003-04-08 17:17:17 +00001184PyDoc_STRVAR(gc_get_referents__doc__,
1185"get_referents(*objs) -> list\n\
Jeremy Hylton059b0942003-04-03 16:29:13 +00001186Return the list of objects that are directly referred to by objs.");
Jeremy Hylton5bd378b2003-04-03 16:28:38 +00001187
1188static PyObject *
Tim Peters730f5532003-04-08 17:17:17 +00001189gc_get_referents(PyObject *self, PyObject *args)
Jeremy Hylton5bd378b2003-04-03 16:28:38 +00001190{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001191 Py_ssize_t i;
Jeremy Hylton5bd378b2003-04-03 16:28:38 +00001192 PyObject *result = PyList_New(0);
Tim Peters0f81ab62003-04-08 16:39:48 +00001193
1194 if (result == NULL)
1195 return NULL;
1196
Jeremy Hylton5bd378b2003-04-03 16:28:38 +00001197 for (i = 0; i < PyTuple_GET_SIZE(args); i++) {
Tim Peters0f81ab62003-04-08 16:39:48 +00001198 traverseproc traverse;
Tim Peters93ad66d2003-04-05 17:15:44 +00001199 PyObject *obj = PyTuple_GET_ITEM(args, i);
Tim Peters0f81ab62003-04-08 16:39:48 +00001200
1201 if (! PyObject_IS_GC(obj))
Jeremy Hylton5bd378b2003-04-03 16:28:38 +00001202 continue;
Christian Heimes90aa7642007-12-19 02:45:37 +00001203 traverse = Py_TYPE(obj)->tp_traverse;
Tim Peters0f81ab62003-04-08 16:39:48 +00001204 if (! traverse)
1205 continue;
Tim Peters730f5532003-04-08 17:17:17 +00001206 if (traverse(obj, (visitproc)referentsvisit, result)) {
Tim Peters0f81ab62003-04-08 16:39:48 +00001207 Py_DECREF(result);
Jeremy Hylton5bd378b2003-04-03 16:28:38 +00001208 return NULL;
Tim Peters0f81ab62003-04-08 16:39:48 +00001209 }
Jeremy Hylton5bd378b2003-04-03 16:28:38 +00001210 }
1211 return result;
1212}
1213
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001214PyDoc_STRVAR(gc_get_objects__doc__,
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +00001215"get_objects() -> [...]\n"
1216"\n"
1217"Return a list of objects tracked by the collector (excluding the list\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001218"returned).\n");
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +00001219
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +00001220static PyObject *
Tim Peters50c61d52003-04-06 01:50:50 +00001221gc_get_objects(PyObject *self, PyObject *noargs)
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +00001222{
Neil Schemenauer2880ae52002-05-04 05:35:20 +00001223 int i;
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +00001224 PyObject* result;
1225
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +00001226 result = PyList_New(0);
Tim Peters50c61d52003-04-06 01:50:50 +00001227 if (result == NULL)
Martin v. Löwisf8a6f242001-12-02 18:31:02 +00001228 return NULL;
Neil Schemenauer2880ae52002-05-04 05:35:20 +00001229 for (i = 0; i < NUM_GENERATIONS; i++) {
1230 if (append_objects(result, GEN_HEAD(i))) {
1231 Py_DECREF(result);
1232 return NULL;
1233 }
Martin v. Löwis155aad12001-12-02 12:21:34 +00001234 }
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +00001235 return result;
1236}
1237
Antoine Pitrou3a652b12009-03-23 18:52:06 +00001238PyDoc_STRVAR(gc_is_tracked__doc__,
1239"is_tracked(obj) -> bool\n"
1240"\n"
1241"Returns true if the object is tracked by the garbage collector.\n"
1242"Simple atomic objects will return false.\n"
1243);
1244
1245static PyObject *
1246gc_is_tracked(PyObject *self, PyObject *obj)
1247{
1248 PyObject *result;
1249
1250 if (PyObject_IS_GC(obj) && IS_TRACKED(obj))
1251 result = Py_True;
1252 else
1253 result = Py_False;
1254 Py_INCREF(result);
1255 return result;
1256}
1257
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +00001258
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001259PyDoc_STRVAR(gc__doc__,
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001260"This module provides access to the garbage collector for reference cycles.\n"
1261"\n"
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001262"enable() -- Enable automatic garbage collection.\n"
1263"disable() -- Disable automatic garbage collection.\n"
1264"isenabled() -- Returns true if automatic collection is enabled.\n"
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001265"collect() -- Do a full collection right now.\n"
Thomas Wouters89f507f2006-12-13 04:49:30 +00001266"get_count() -- Return the current collection counts.\n"
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001267"set_debug() -- Set debugging flags.\n"
1268"get_debug() -- Get debugging flags.\n"
1269"set_threshold() -- Set the collection thresholds.\n"
1270"get_threshold() -- Return the current the collection thresholds.\n"
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +00001271"get_objects() -- Return a list of all objects tracked by the collector.\n"
Antoine Pitrou3a652b12009-03-23 18:52:06 +00001272"is_tracked() -- Returns true if a given object is tracked.\n"
Jeremy Hylton5bd378b2003-04-03 16:28:38 +00001273"get_referrers() -- Return the list of objects that refer to an object.\n"
Tim Peters730f5532003-04-08 17:17:17 +00001274"get_referents() -- Return the list of objects that an object refers to.\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001275
1276static PyMethodDef GcMethods[] = {
Tim Peters50c61d52003-04-06 01:50:50 +00001277 {"enable", gc_enable, METH_NOARGS, gc_enable__doc__},
1278 {"disable", gc_disable, METH_NOARGS, gc_disable__doc__},
1279 {"isenabled", gc_isenabled, METH_NOARGS, gc_isenabled__doc__},
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001280 {"set_debug", gc_set_debug, METH_VARARGS, gc_set_debug__doc__},
Tim Peters50c61d52003-04-06 01:50:50 +00001281 {"get_debug", gc_get_debug, METH_NOARGS, gc_get_debug__doc__},
Barry Warsawd3c38ff2006-03-07 09:46:03 +00001282 {"get_count", gc_get_count, METH_NOARGS, gc_get_count__doc__},
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001283 {"set_threshold", gc_set_thresh, METH_VARARGS, gc_set_thresh__doc__},
Tim Peters50c61d52003-04-06 01:50:50 +00001284 {"get_threshold", gc_get_thresh, METH_NOARGS, gc_get_thresh__doc__},
Barry Warsawd3c38ff2006-03-07 09:46:03 +00001285 {"collect", (PyCFunction)gc_collect,
1286 METH_VARARGS | METH_KEYWORDS, gc_collect__doc__},
Tim Peters50c61d52003-04-06 01:50:50 +00001287 {"get_objects", gc_get_objects,METH_NOARGS, gc_get_objects__doc__},
Antoine Pitrou3a652b12009-03-23 18:52:06 +00001288 {"is_tracked", gc_is_tracked, METH_O, gc_is_tracked__doc__},
Martin v. Löwis560da622001-11-24 09:24:51 +00001289 {"get_referrers", gc_get_referrers, METH_VARARGS,
1290 gc_get_referrers__doc__},
Tim Peters730f5532003-04-08 17:17:17 +00001291 {"get_referents", gc_get_referents, METH_VARARGS,
1292 gc_get_referents__doc__},
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001293 {NULL, NULL} /* Sentinel */
1294};
1295
Martin v. Löwis1a214512008-06-11 05:26:20 +00001296static struct PyModuleDef gcmodule = {
1297 PyModuleDef_HEAD_INIT,
1298 "gc",
1299 gc__doc__,
1300 -1,
1301 GcMethods,
1302 NULL,
1303 NULL,
1304 NULL,
1305 NULL
1306};
1307
1308
Jason Tishler6bc06ec2003-09-04 11:59:50 +00001309PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00001310PyInit_gc(void)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001311{
1312 PyObject *m;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001313
Martin v. Löwis1a214512008-06-11 05:26:20 +00001314 m = PyModule_Create(&gcmodule);
1315
Neal Norwitz1ac754f2006-01-19 06:09:39 +00001316 if (m == NULL)
Martin v. Löwis1a214512008-06-11 05:26:20 +00001317 return NULL;
Tim Peters11558872003-04-06 23:30:52 +00001318
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001319 if (garbage == NULL) {
1320 garbage = PyList_New(0);
Tim Peters11558872003-04-06 23:30:52 +00001321 if (garbage == NULL)
Martin v. Löwis1a214512008-06-11 05:26:20 +00001322 return NULL;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001323 }
Neil Schemenauer3b1cbf92005-06-18 17:37:06 +00001324 Py_INCREF(garbage);
Tim Peters11558872003-04-06 23:30:52 +00001325 if (PyModule_AddObject(m, "garbage", garbage) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00001326 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001327
1328 /* Importing can't be done in collect() because collect()
1329 * can be called via PyGC_Collect() in Py_Finalize().
1330 * This wouldn't be a problem, except that <initialized> is
1331 * reset to 0 before calling collect which trips up
1332 * the import and triggers an assertion.
1333 */
1334 if (tmod == NULL) {
Christian Heimes072c0f12008-01-03 23:01:04 +00001335 tmod = PyImport_ImportModuleNoBlock("time");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001336 if (tmod == NULL)
1337 PyErr_Clear();
1338 }
1339
Martin v. Löwis1a214512008-06-11 05:26:20 +00001340#define ADD_INT(NAME) if (PyModule_AddIntConstant(m, #NAME, NAME) < 0) return NULL
Tim Peters11558872003-04-06 23:30:52 +00001341 ADD_INT(DEBUG_STATS);
1342 ADD_INT(DEBUG_COLLECTABLE);
1343 ADD_INT(DEBUG_UNCOLLECTABLE);
Tim Peters11558872003-04-06 23:30:52 +00001344 ADD_INT(DEBUG_SAVEALL);
1345 ADD_INT(DEBUG_LEAK);
1346#undef ADD_INT
Martin v. Löwis1a214512008-06-11 05:26:20 +00001347 return m;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001348}
1349
Guido van Rossume13ddc92003-04-17 17:29:22 +00001350/* API to invoke gc.collect() from C */
Neal Norwitz7b216c52006-03-04 20:01:53 +00001351Py_ssize_t
Guido van Rossume13ddc92003-04-17 17:29:22 +00001352PyGC_Collect(void)
1353{
Neal Norwitz7b216c52006-03-04 20:01:53 +00001354 Py_ssize_t n;
Guido van Rossume13ddc92003-04-17 17:29:22 +00001355
1356 if (collecting)
1357 n = 0; /* already collecting, don't do anything */
1358 else {
1359 collecting = 1;
1360 n = collect(NUM_GENERATIONS - 1);
1361 collecting = 0;
1362 }
1363
1364 return n;
1365}
1366
Neil Schemenauer43411b52001-08-30 00:05:51 +00001367/* for debugging */
Guido van Rossume13ddc92003-04-17 17:29:22 +00001368void
1369_PyGC_Dump(PyGC_Head *g)
Neil Schemenauer43411b52001-08-30 00:05:51 +00001370{
1371 _PyObject_Dump(FROM_GC(g));
1372}
1373
Neil Schemenauer43411b52001-08-30 00:05:51 +00001374/* extension modules might be compiled with GC support so these
1375 functions must always be available */
1376
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001377#undef PyObject_GC_Track
1378#undef PyObject_GC_UnTrack
1379#undef PyObject_GC_Del
1380#undef _PyObject_GC_Malloc
1381
Neil Schemenauer43411b52001-08-30 00:05:51 +00001382void
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001383PyObject_GC_Track(void *op)
Neil Schemenauer43411b52001-08-30 00:05:51 +00001384{
1385 _PyObject_GC_TRACK(op);
1386}
1387
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001388/* for binary compatibility with 2.2 */
Neil Schemenauer43411b52001-08-30 00:05:51 +00001389void
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001390_PyObject_GC_Track(PyObject *op)
1391{
1392 PyObject_GC_Track(op);
1393}
1394
1395void
1396PyObject_GC_UnTrack(void *op)
Neil Schemenauer43411b52001-08-30 00:05:51 +00001397{
Tim Peters803526b2002-07-07 05:13:56 +00001398 /* Obscure: the Py_TRASHCAN mechanism requires that we be able to
1399 * call PyObject_GC_UnTrack twice on an object.
1400 */
Neil Schemenauera2b11ec2002-05-21 15:53:24 +00001401 if (IS_TRACKED(op))
Guido van Rossumff413af2002-03-28 20:34:59 +00001402 _PyObject_GC_UNTRACK(op);
Neil Schemenauer43411b52001-08-30 00:05:51 +00001403}
1404
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001405/* for binary compatibility with 2.2 */
1406void
1407_PyObject_GC_UnTrack(PyObject *op)
1408{
1409 PyObject_GC_UnTrack(op);
1410}
1411
Neil Schemenauer43411b52001-08-30 00:05:51 +00001412PyObject *
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001413_PyObject_GC_Malloc(size_t basicsize)
Neil Schemenauer43411b52001-08-30 00:05:51 +00001414{
1415 PyObject *op;
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001416 PyGC_Head *g;
1417 if (basicsize > PY_SSIZE_T_MAX - sizeof(PyGC_Head))
1418 return PyErr_NoMemory();
1419 g = (PyGC_Head *)PyObject_MALLOC(
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001420 sizeof(PyGC_Head) + basicsize);
Neil Schemenauer43411b52001-08-30 00:05:51 +00001421 if (g == NULL)
Jeremy Hylton8a135182002-06-06 23:23:55 +00001422 return PyErr_NoMemory();
Tim Petersea405632002-07-02 00:52:30 +00001423 g->gc.gc_refs = GC_UNTRACKED;
Neil Schemenauer2880ae52002-05-04 05:35:20 +00001424 generations[0].count++; /* number of allocated GC objects */
1425 if (generations[0].count > generations[0].threshold &&
Neil Schemenauer43411b52001-08-30 00:05:51 +00001426 enabled &&
Neil Schemenauer2880ae52002-05-04 05:35:20 +00001427 generations[0].threshold &&
Neil Schemenauer43411b52001-08-30 00:05:51 +00001428 !collecting &&
1429 !PyErr_Occurred()) {
1430 collecting = 1;
Neil Schemenauer2880ae52002-05-04 05:35:20 +00001431 collect_generations();
Neil Schemenauer43411b52001-08-30 00:05:51 +00001432 collecting = 0;
1433 }
1434 op = FROM_GC(g);
Neil Schemenauer43411b52001-08-30 00:05:51 +00001435 return op;
1436}
1437
1438PyObject *
1439_PyObject_GC_New(PyTypeObject *tp)
1440{
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001441 PyObject *op = _PyObject_GC_Malloc(_PyObject_SIZE(tp));
Tim Petersfa8efab2002-04-28 01:57:25 +00001442 if (op != NULL)
1443 op = PyObject_INIT(op, tp);
1444 return op;
Neil Schemenauer43411b52001-08-30 00:05:51 +00001445}
1446
1447PyVarObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001448_PyObject_GC_NewVar(PyTypeObject *tp, Py_ssize_t nitems)
Neil Schemenauer43411b52001-08-30 00:05:51 +00001449{
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001450 const size_t size = _PyObject_VAR_SIZE(tp, nitems);
1451 PyVarObject *op = (PyVarObject *) _PyObject_GC_Malloc(size);
Tim Petersfa8efab2002-04-28 01:57:25 +00001452 if (op != NULL)
1453 op = PyObject_INIT_VAR(op, tp, nitems);
1454 return op;
Neil Schemenauer43411b52001-08-30 00:05:51 +00001455}
1456
1457PyVarObject *
Martin v. Löwis41290682006-02-16 14:56:14 +00001458_PyObject_GC_Resize(PyVarObject *op, Py_ssize_t nitems)
Neil Schemenauer43411b52001-08-30 00:05:51 +00001459{
Christian Heimes90aa7642007-12-19 02:45:37 +00001460 const size_t basicsize = _PyObject_VAR_SIZE(Py_TYPE(op), nitems);
Neil Schemenauer43411b52001-08-30 00:05:51 +00001461 PyGC_Head *g = AS_GC(op);
Neal Norwitz3ce5d922008-08-24 07:08:55 +00001462 if (basicsize > PY_SSIZE_T_MAX - sizeof(PyGC_Head))
1463 return (PyVarObject *)PyErr_NoMemory();
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001464 g = (PyGC_Head *)PyObject_REALLOC(g, sizeof(PyGC_Head) + basicsize);
Neil Schemenauer43411b52001-08-30 00:05:51 +00001465 if (g == NULL)
1466 return (PyVarObject *)PyErr_NoMemory();
1467 op = (PyVarObject *) FROM_GC(g);
Christian Heimes90aa7642007-12-19 02:45:37 +00001468 Py_SIZE(op) = nitems;
Neil Schemenauer43411b52001-08-30 00:05:51 +00001469 return op;
1470}
1471
1472void
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001473PyObject_GC_Del(void *op)
Neil Schemenauer43411b52001-08-30 00:05:51 +00001474{
Neil Schemenauer43411b52001-08-30 00:05:51 +00001475 PyGC_Head *g = AS_GC(op);
Neil Schemenauera2b11ec2002-05-21 15:53:24 +00001476 if (IS_TRACKED(op))
Neil Schemenauer43411b52001-08-30 00:05:51 +00001477 gc_list_remove(g);
Neil Schemenauer2880ae52002-05-04 05:35:20 +00001478 if (generations[0].count > 0) {
1479 generations[0].count--;
Neil Schemenauer43411b52001-08-30 00:05:51 +00001480 }
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001481 PyObject_FREE(g);
Neil Schemenauer43411b52001-08-30 00:05:51 +00001482}
1483
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001484/* for binary compatibility with 2.2 */
1485#undef _PyObject_GC_Del
1486void
1487_PyObject_GC_Del(PyObject *op)
1488{
1489 PyObject_GC_Del(op);
1490}