blob: d9bea73c33b0837d3b15c863e21f1c918405acb9 [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/
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000012 http://www.python.org/pipermail/python-dev/2000-March/003869.html
13 http://www.python.org/pipermail/python-dev/2000-March/004010.html
14 http://www.python.org/pipermail/python-dev/2000-March/004022.html
15
16 For a highlevel view of the collection process, read the collect
17 function.
18
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000019*/
20
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000021#include "Python.h"
Christian Heimes3b718a72008-02-14 12:47:33 +000022#include "frameobject.h" /* for PyFrame_ClearFreeList */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000023
Neil Schemenauer43411b52001-08-30 00:05:51 +000024/* Get an object's GC head */
25#define AS_GC(o) ((PyGC_Head *)(o)-1)
26
27/* Get the object given the GC head */
28#define FROM_GC(g) ((PyObject *)(((PyGC_Head *)g)+1))
29
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000030/*** Global GC state ***/
31
Neil Schemenauer2880ae52002-05-04 05:35:20 +000032struct gc_generation {
33 PyGC_Head head;
34 int threshold; /* collection threshold */
35 int count; /* count of allocations or collections of younger
36 generations */
37};
38
39#define NUM_GENERATIONS 3
40#define GEN_HEAD(n) (&generations[n].head)
41
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000042/* linked lists of container objects */
Neil Schemenauer2880ae52002-05-04 05:35:20 +000043static struct gc_generation generations[NUM_GENERATIONS] = {
44 /* PyGC_Head, threshold, count */
45 {{{GEN_HEAD(0), GEN_HEAD(0), 0}}, 700, 0},
46 {{{GEN_HEAD(1), GEN_HEAD(1), 0}}, 10, 0},
47 {{{GEN_HEAD(2), GEN_HEAD(2), 0}}, 10, 0},
48};
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000049
Neil Schemenauer2880ae52002-05-04 05:35:20 +000050PyGC_Head *_PyGC_generation0 = GEN_HEAD(0);
51
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +000052static int enabled = 1; /* automatic collection enabled? */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000053
Neil Schemenauer43411b52001-08-30 00:05:51 +000054/* true if we are currently running the collector */
Tim Petersbf384c22003-04-06 00:11:39 +000055static int collecting = 0;
Neil Schemenauer43411b52001-08-30 00:05:51 +000056
Tim Peters6fc13d92002-07-02 18:12:35 +000057/* list of uncollectable objects */
Tim Petersbf384c22003-04-06 00:11:39 +000058static PyObject *garbage = NULL;
Tim Peters6fc13d92002-07-02 18:12:35 +000059
60/* Python string to use if unhandled exception occurs */
Tim Petersbf384c22003-04-06 00:11:39 +000061static PyObject *gc_str = NULL;
Tim Peters6fc13d92002-07-02 18:12:35 +000062
Tim Peters93ad66d2003-04-05 17:15:44 +000063/* Python string used to look for __del__ attribute. */
64static PyObject *delstr = NULL;
Jeremy Hyltonce136e92003-04-04 19:59:06 +000065
Antoine Pitrou4c5ecb72009-01-09 21:40:55 +000066/* This is the number of objects who survived the last full collection. It
67 approximates the number of long lived objects tracked by the GC.
68
69 (by "full collection", we mean a collection of the oldest generation).
70*/
71static Py_ssize_t long_lived_total = 0;
72
73/* This is the number of objects who survived all "non-full" collections,
74 and are awaiting to undergo a full collection for the first time.
75
76*/
77static Py_ssize_t long_lived_pending = 0;
78
79/*
80 NOTE: about the counting of long-lived objects.
81
82 To limit the cost of garbage collection, there are two strategies;
83 - make each collection faster, e.g. by scanning fewer objects
84 - do less collections
85 This heuristic is about the latter strategy.
86
87 In addition to the various configurable thresholds, we only trigger a
88 full collection if the ratio
89 long_lived_pending / long_lived_total
90 is above a given value (hardwired to 25%).
91
92 The reason is that, while "non-full" collections (i.e., collections of
93 the young and middle generations) will always examine roughly the same
94 number of objects -- determined by the aforementioned thresholds --,
95 the cost of a full collection is proportional to the total number of
96 long-lived objects, which is virtually unbounded.
97
98 Indeed, it has been remarked that doing a full collection every
99 <constant number> of object creations entails a dramatic performance
100 degradation in workloads which consist in creating and storing lots of
101 long-lived objects (e.g. building a large list of GC-tracked objects would
102 show quadratic performance, instead of linear as expected: see issue #4074).
103
104 Using the above ratio, instead, yields amortized linear performance in
105 the total number of objects (the effect of which can be summarized
106 thusly: "each full garbage collection is more and more costly as the
107 number of objects grows, but we do fewer and fewer of them").
108
109 This heuristic was suggested by Martin von Löwis on python-dev in
110 June 2008. His original analysis and proposal can be found at:
111 http://mail.python.org/pipermail/python-dev/2008-June/080579.html
112*/
113
114
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000115/* set for debugging information */
116#define DEBUG_STATS (1<<0) /* print collection statistics */
117#define DEBUG_COLLECTABLE (1<<1) /* print collectable objects */
118#define DEBUG_UNCOLLECTABLE (1<<2) /* print uncollectable objects */
119#define DEBUG_INSTANCES (1<<3) /* print instances */
120#define DEBUG_OBJECTS (1<<4) /* print other objects */
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000121#define DEBUG_SAVEALL (1<<5) /* save all garbage in gc.garbage */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000122#define DEBUG_LEAK DEBUG_COLLECTABLE | \
123 DEBUG_UNCOLLECTABLE | \
124 DEBUG_INSTANCES | \
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000125 DEBUG_OBJECTS | \
126 DEBUG_SAVEALL
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000127static int debug;
Neal Norwitz57a03612006-04-26 05:34:03 +0000128static PyObject *tmod = NULL;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000129
Tim Peters6fc13d92002-07-02 18:12:35 +0000130/*--------------------------------------------------------------------------
131gc_refs values.
Neil Schemenauer43411b52001-08-30 00:05:51 +0000132
Tim Peters6fc13d92002-07-02 18:12:35 +0000133Between collections, every gc'ed object has one of two gc_refs values:
134
135GC_UNTRACKED
136 The initial state; objects returned by PyObject_GC_Malloc are in this
137 state. The object doesn't live in any generation list, and its
138 tp_traverse slot must not be called.
139
140GC_REACHABLE
141 The object lives in some generation list, and its tp_traverse is safe to
142 call. An object transitions to GC_REACHABLE when PyObject_GC_Track
143 is called.
144
145During a collection, gc_refs can temporarily take on other states:
146
147>= 0
148 At the start of a collection, update_refs() copies the true refcount
149 to gc_refs, for each object in the generation being collected.
150 subtract_refs() then adjusts gc_refs so that it equals the number of
151 times an object is referenced directly from outside the generation
152 being collected.
Martin v. Löwis774348c2002-11-09 19:54:06 +0000153 gc_refs remains >= 0 throughout these steps.
Tim Peters6fc13d92002-07-02 18:12:35 +0000154
155GC_TENTATIVELY_UNREACHABLE
156 move_unreachable() then moves objects not reachable (whether directly or
157 indirectly) from outside the generation into an "unreachable" set.
158 Objects that are found to be reachable have gc_refs set to GC_REACHABLE
159 again. Objects that are found to be unreachable have gc_refs set to
160 GC_TENTATIVELY_UNREACHABLE. It's "tentatively" because the pass doing
161 this can't be sure until it ends, and GC_TENTATIVELY_UNREACHABLE may
162 transition back to GC_REACHABLE.
163
164 Only objects with GC_TENTATIVELY_UNREACHABLE still set are candidates
165 for collection. If it's decided not to collect such an object (e.g.,
166 it has a __del__ method), its gc_refs is restored to GC_REACHABLE again.
167----------------------------------------------------------------------------
168*/
Tim Petersea405632002-07-02 00:52:30 +0000169#define GC_UNTRACKED _PyGC_REFS_UNTRACKED
170#define GC_REACHABLE _PyGC_REFS_REACHABLE
171#define GC_TENTATIVELY_UNREACHABLE _PyGC_REFS_TENTATIVELY_UNREACHABLE
Tim Peters19b74c72002-07-01 03:52:19 +0000172
Tim Peters6fc13d92002-07-02 18:12:35 +0000173#define IS_TRACKED(o) ((AS_GC(o))->gc.gc_refs != GC_UNTRACKED)
Tim Peters19b74c72002-07-01 03:52:19 +0000174#define IS_REACHABLE(o) ((AS_GC(o))->gc.gc_refs == GC_REACHABLE)
175#define IS_TENTATIVELY_UNREACHABLE(o) ( \
176 (AS_GC(o))->gc.gc_refs == GC_TENTATIVELY_UNREACHABLE)
Neil Schemenauera2b11ec2002-05-21 15:53:24 +0000177
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000178/*** list functions ***/
179
180static void
181gc_list_init(PyGC_Head *list)
182{
Tim Peters9e4ca102001-10-11 18:31:31 +0000183 list->gc.gc_prev = list;
184 list->gc.gc_next = list;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000185}
186
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000187static int
188gc_list_is_empty(PyGC_Head *list)
189{
190 return (list->gc.gc_next == list);
191}
192
Tim Peterse2d59182004-11-01 01:39:08 +0000193#if 0
194/* This became unused after gc_list_move() was introduced. */
195/* Append `node` to `list`. */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000196static void
197gc_list_append(PyGC_Head *node, PyGC_Head *list)
198{
Tim Peters9e4ca102001-10-11 18:31:31 +0000199 node->gc.gc_next = list;
200 node->gc.gc_prev = list->gc.gc_prev;
201 node->gc.gc_prev->gc.gc_next = node;
202 list->gc.gc_prev = node;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000203}
Tim Peterse2d59182004-11-01 01:39:08 +0000204#endif
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000205
Tim Peterse2d59182004-11-01 01:39:08 +0000206/* Remove `node` from the gc list it's currently in. */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000207static void
208gc_list_remove(PyGC_Head *node)
209{
Tim Peters9e4ca102001-10-11 18:31:31 +0000210 node->gc.gc_prev->gc.gc_next = node->gc.gc_next;
211 node->gc.gc_next->gc.gc_prev = node->gc.gc_prev;
212 node->gc.gc_next = NULL; /* object is not currently tracked */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000213}
214
Tim Peterse2d59182004-11-01 01:39:08 +0000215/* Move `node` from the gc list it's currently in (which is not explicitly
216 * named here) to the end of `list`. This is semantically the same as
217 * gc_list_remove(node) followed by gc_list_append(node, list).
218 */
219static void
220gc_list_move(PyGC_Head *node, PyGC_Head *list)
221{
Tim Petersbc1d1b82004-11-01 16:39:57 +0000222 PyGC_Head *new_prev;
Tim Peterse2d59182004-11-01 01:39:08 +0000223 PyGC_Head *current_prev = node->gc.gc_prev;
224 PyGC_Head *current_next = node->gc.gc_next;
Tim Petersbc1d1b82004-11-01 16:39:57 +0000225 /* Unlink from current list. */
Tim Peterse2d59182004-11-01 01:39:08 +0000226 current_prev->gc.gc_next = current_next;
227 current_next->gc.gc_prev = current_prev;
Tim Petersbc1d1b82004-11-01 16:39:57 +0000228 /* Relink at end of new list. */
229 new_prev = node->gc.gc_prev = list->gc.gc_prev;
Tim Peterse2d59182004-11-01 01:39:08 +0000230 new_prev->gc.gc_next = list->gc.gc_prev = node;
Tim Petersbc1d1b82004-11-01 16:39:57 +0000231 node->gc.gc_next = list;
Tim Peterse2d59182004-11-01 01:39:08 +0000232}
233
234/* append list `from` onto list `to`; `from` becomes an empty list */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000235static void
236gc_list_merge(PyGC_Head *from, PyGC_Head *to)
237{
238 PyGC_Head *tail;
Tim Peterse2d59182004-11-01 01:39:08 +0000239 assert(from != to);
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000240 if (!gc_list_is_empty(from)) {
Tim Peters9e4ca102001-10-11 18:31:31 +0000241 tail = to->gc.gc_prev;
242 tail->gc.gc_next = from->gc.gc_next;
243 tail->gc.gc_next->gc.gc_prev = tail;
244 to->gc.gc_prev = from->gc.gc_prev;
245 to->gc.gc_prev->gc.gc_next = to;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000246 }
247 gc_list_init(from);
248}
249
Neal Norwitz7b216c52006-03-04 20:01:53 +0000250static Py_ssize_t
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000251gc_list_size(PyGC_Head *list)
252{
253 PyGC_Head *gc;
Neal Norwitz7b216c52006-03-04 20:01:53 +0000254 Py_ssize_t n = 0;
Tim Peters9e4ca102001-10-11 18:31:31 +0000255 for (gc = list->gc.gc_next; gc != list; gc = gc->gc.gc_next) {
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000256 n++;
257 }
258 return n;
259}
260
Tim Peters259272b2003-04-06 19:41:39 +0000261/* Append objects in a GC list to a Python list.
262 * Return 0 if all OK, < 0 if error (out of memory for list).
263 */
264static int
265append_objects(PyObject *py_list, PyGC_Head *gc_list)
266{
267 PyGC_Head *gc;
268 for (gc = gc_list->gc.gc_next; gc != gc_list; gc = gc->gc.gc_next) {
269 PyObject *op = FROM_GC(gc);
270 if (op != py_list) {
271 if (PyList_Append(py_list, op)) {
272 return -1; /* exception */
273 }
274 }
275 }
276 return 0;
277}
278
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000279/*** end of list stuff ***/
280
281
Tim Peters19b74c72002-07-01 03:52:19 +0000282/* Set all gc_refs = ob_refcnt. After this, gc_refs is > 0 for all objects
283 * in containers, and is GC_REACHABLE for all tracked gc objects not in
284 * containers.
Tim Peters88396172002-06-30 17:56:40 +0000285 */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000286static void
287update_refs(PyGC_Head *containers)
288{
Tim Peters9e4ca102001-10-11 18:31:31 +0000289 PyGC_Head *gc = containers->gc.gc_next;
Tim Petersea405632002-07-02 00:52:30 +0000290 for (; gc != containers; gc = gc->gc.gc_next) {
291 assert(gc->gc.gc_refs == GC_REACHABLE);
Christian Heimese93237d2007-12-19 02:37:44 +0000292 gc->gc.gc_refs = Py_REFCNT(FROM_GC(gc));
Tim Peters780c4972003-11-14 00:01:17 +0000293 /* Python's cyclic gc should never see an incoming refcount
294 * of 0: if something decref'ed to 0, it should have been
295 * deallocated immediately at that time.
296 * Possible cause (if the assert triggers): a tp_dealloc
297 * routine left a gc-aware object tracked during its teardown
298 * phase, and did something-- or allowed something to happen --
299 * that called back into Python. gc can trigger then, and may
300 * see the still-tracked dying object. Before this assert
301 * was added, such mistakes went on to allow gc to try to
302 * delete the object again. In a debug build, that caused
303 * a mysterious segfault, when _Py_ForgetReference tried
304 * to remove the object from the doubly-linked list of all
305 * objects a second time. In a release build, an actual
306 * double deallocation occurred, which leads to corruption
307 * of the allocator's internal bookkeeping pointers. That's
308 * so serious that maybe this should be a release-build
309 * check instead of an assert?
310 */
311 assert(gc->gc.gc_refs != 0);
Tim Petersea405632002-07-02 00:52:30 +0000312 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000313}
314
Tim Peters19b74c72002-07-01 03:52:19 +0000315/* A traversal callback for subtract_refs. */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000316static int
317visit_decref(PyObject *op, void *data)
318{
Tim Peters93cd83e2002-06-30 21:31:03 +0000319 assert(op != NULL);
Tim Peters19b74c72002-07-01 03:52:19 +0000320 if (PyObject_IS_GC(op)) {
321 PyGC_Head *gc = AS_GC(op);
322 /* We're only interested in gc_refs for objects in the
323 * generation being collected, which can be recognized
324 * because only they have positive gc_refs.
325 */
Tim Petersaab713b2002-07-02 22:15:28 +0000326 assert(gc->gc.gc_refs != 0); /* else refcount was too small */
Tim Peters19b74c72002-07-01 03:52:19 +0000327 if (gc->gc.gc_refs > 0)
328 gc->gc.gc_refs--;
329 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000330 return 0;
331}
332
Tim Peters19b74c72002-07-01 03:52:19 +0000333/* Subtract internal references from gc_refs. After this, gc_refs is >= 0
334 * for all objects in containers, and is GC_REACHABLE for all tracked gc
335 * objects not in containers. The ones with gc_refs > 0 are directly
336 * reachable from outside containers, and so can't be collected.
337 */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000338static void
339subtract_refs(PyGC_Head *containers)
340{
341 traverseproc traverse;
Tim Peters9e4ca102001-10-11 18:31:31 +0000342 PyGC_Head *gc = containers->gc.gc_next;
343 for (; gc != containers; gc=gc->gc.gc_next) {
Christian Heimese93237d2007-12-19 02:37:44 +0000344 traverse = Py_TYPE(FROM_GC(gc))->tp_traverse;
Neil Schemenauer43411b52001-08-30 00:05:51 +0000345 (void) traverse(FROM_GC(gc),
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000346 (visitproc)visit_decref,
347 NULL);
348 }
349}
350
Tim Peters19b74c72002-07-01 03:52:19 +0000351/* A traversal callback for move_unreachable. */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000352static int
Tim Peters19b74c72002-07-01 03:52:19 +0000353visit_reachable(PyObject *op, PyGC_Head *reachable)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000354{
Tim Petersea405632002-07-02 00:52:30 +0000355 if (PyObject_IS_GC(op)) {
Tim Peters19b74c72002-07-01 03:52:19 +0000356 PyGC_Head *gc = AS_GC(op);
Martin v. Löwis6db0e002006-03-01 16:56:25 +0000357 const Py_ssize_t gc_refs = gc->gc.gc_refs;
Tim Peters19b74c72002-07-01 03:52:19 +0000358
359 if (gc_refs == 0) {
360 /* This is in move_unreachable's 'young' list, but
361 * the traversal hasn't yet gotten to it. All
362 * we need to do is tell move_unreachable that it's
363 * reachable.
364 */
365 gc->gc.gc_refs = 1;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000366 }
Tim Peters19b74c72002-07-01 03:52:19 +0000367 else if (gc_refs == GC_TENTATIVELY_UNREACHABLE) {
368 /* This had gc_refs = 0 when move_unreachable got
369 * to it, but turns out it's reachable after all.
370 * Move it back to move_unreachable's 'young' list,
371 * and move_unreachable will eventually get to it
372 * again.
373 */
Tim Peterse2d59182004-11-01 01:39:08 +0000374 gc_list_move(gc, reachable);
Tim Peters19b74c72002-07-01 03:52:19 +0000375 gc->gc.gc_refs = 1;
376 }
377 /* Else there's nothing to do.
378 * If gc_refs > 0, it must be in move_unreachable's 'young'
379 * list, and move_unreachable will eventually get to it.
380 * If gc_refs == GC_REACHABLE, it's either in some other
381 * generation so we don't care about it, or move_unreachable
Tim Peters6fc13d92002-07-02 18:12:35 +0000382 * already dealt with it.
Tim Petersea405632002-07-02 00:52:30 +0000383 * If gc_refs == GC_UNTRACKED, it must be ignored.
Tim Peters19b74c72002-07-01 03:52:19 +0000384 */
Tim Petersea405632002-07-02 00:52:30 +0000385 else {
386 assert(gc_refs > 0
387 || gc_refs == GC_REACHABLE
388 || gc_refs == GC_UNTRACKED);
389 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000390 }
391 return 0;
392}
393
Tim Peters19b74c72002-07-01 03:52:19 +0000394/* Move the unreachable objects from young to unreachable. After this,
395 * all objects in young have gc_refs = GC_REACHABLE, and all objects in
396 * unreachable have gc_refs = GC_TENTATIVELY_UNREACHABLE. All tracked
397 * gc objects not in young or unreachable still have gc_refs = GC_REACHABLE.
398 * All objects in young after this are directly or indirectly reachable
399 * from outside the original young; and all objects in unreachable are
400 * not.
Tim Peters88396172002-06-30 17:56:40 +0000401 */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000402static void
Tim Peters19b74c72002-07-01 03:52:19 +0000403move_unreachable(PyGC_Head *young, PyGC_Head *unreachable)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000404{
Tim Peters19b74c72002-07-01 03:52:19 +0000405 PyGC_Head *gc = young->gc.gc_next;
406
407 /* Invariants: all objects "to the left" of us in young have gc_refs
408 * = GC_REACHABLE, and are indeed reachable (directly or indirectly)
409 * from outside the young list as it was at entry. All other objects
410 * from the original young "to the left" of us are in unreachable now,
411 * and have gc_refs = GC_TENTATIVELY_UNREACHABLE. All objects to the
412 * left of us in 'young' now have been scanned, and no objects here
413 * or to the right have been scanned yet.
414 */
415
416 while (gc != young) {
417 PyGC_Head *next;
418
Tim Peters6fc13d92002-07-02 18:12:35 +0000419 if (gc->gc.gc_refs) {
420 /* gc is definitely reachable from outside the
421 * original 'young'. Mark it as such, and traverse
422 * its pointers to find any other objects that may
423 * be directly reachable from it. Note that the
424 * call to tp_traverse may append objects to young,
425 * so we have to wait until it returns to determine
426 * the next object to visit.
427 */
428 PyObject *op = FROM_GC(gc);
Christian Heimese93237d2007-12-19 02:37:44 +0000429 traverseproc traverse = Py_TYPE(op)->tp_traverse;
Tim Peters6fc13d92002-07-02 18:12:35 +0000430 assert(gc->gc.gc_refs > 0);
431 gc->gc.gc_refs = GC_REACHABLE;
432 (void) traverse(op,
433 (visitproc)visit_reachable,
434 (void *)young);
Antoine Pitrouf8387af2009-03-23 18:41:45 +0000435 next = gc->gc.gc_next;
436 if (PyTuple_CheckExact(op)) {
437 _PyTuple_MaybeUntrack(op);
438 }
439 else if (PyDict_CheckExact(op)) {
440 _PyDict_MaybeUntrack(op);
441 }
Tim Peters6fc13d92002-07-02 18:12:35 +0000442 }
443 else {
Tim Peters19b74c72002-07-01 03:52:19 +0000444 /* This *may* be unreachable. To make progress,
445 * assume it is. gc isn't directly reachable from
446 * any object we've already traversed, but may be
447 * reachable from an object we haven't gotten to yet.
448 * visit_reachable will eventually move gc back into
449 * young if that's so, and we'll see it again.
450 */
451 next = gc->gc.gc_next;
Tim Peterse2d59182004-11-01 01:39:08 +0000452 gc_list_move(gc, unreachable);
Tim Peters19b74c72002-07-01 03:52:19 +0000453 gc->gc.gc_refs = GC_TENTATIVELY_UNREACHABLE;
454 }
Tim Peters19b74c72002-07-01 03:52:19 +0000455 gc = next;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000456 }
457}
458
Tim Peters86b993b2003-04-05 17:35:54 +0000459/* Return true if object has a finalization method.
460 * CAUTION: An instance of an old-style class has to be checked for a
Tim Petersf6b80452003-04-07 19:21:15 +0000461 *__del__ method, and earlier versions of this used to call PyObject_HasAttr,
462 * which in turn could call the class's __getattr__ hook (if any). That
463 * could invoke arbitrary Python code, mutating the object graph in arbitrary
464 * ways, and that was the source of some excruciatingly subtle bugs.
Tim Peters86b993b2003-04-05 17:35:54 +0000465 */
Neil Schemenauera765c122001-11-01 17:35:23 +0000466static int
467has_finalizer(PyObject *op)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000468{
Tim Peters86b993b2003-04-05 17:35:54 +0000469 if (PyInstance_Check(op)) {
Tim Peters86b993b2003-04-05 17:35:54 +0000470 assert(delstr != NULL);
Tim Petersf6b80452003-04-07 19:21:15 +0000471 return _PyInstance_Lookup(op, delstr) != NULL;
Tim Peters86b993b2003-04-05 17:35:54 +0000472 }
Phillip J. Eby2ba96612006-04-10 17:51:05 +0000473 else if (PyType_HasFeature(op->ob_type, Py_TPFLAGS_HEAPTYPE))
Tim Peters86b993b2003-04-05 17:35:54 +0000474 return op->ob_type->tp_del != NULL;
Phillip J. Eby2ba96612006-04-10 17:51:05 +0000475 else if (PyGen_CheckExact(op))
476 return PyGen_NeedsFinalizing((PyGenObject *)op);
477 else
478 return 0;
Neil Schemenauera765c122001-11-01 17:35:23 +0000479}
480
Tim Petersead8b7a2004-10-30 23:09:22 +0000481/* Move the objects in unreachable with __del__ methods into `finalizers`.
482 * Objects moved into `finalizers` have gc_refs set to GC_REACHABLE; the
483 * objects remaining in unreachable are left at GC_TENTATIVELY_UNREACHABLE.
Jeremy Hyltonce136e92003-04-04 19:59:06 +0000484 */
Neil Schemenauera765c122001-11-01 17:35:23 +0000485static void
Tim Petersead8b7a2004-10-30 23:09:22 +0000486move_finalizers(PyGC_Head *unreachable, PyGC_Head *finalizers)
Neil Schemenauera765c122001-11-01 17:35:23 +0000487{
Tim Petersead8b7a2004-10-30 23:09:22 +0000488 PyGC_Head *gc;
489 PyGC_Head *next;
Tim Petersf6b80452003-04-07 19:21:15 +0000490
Tim Petersead8b7a2004-10-30 23:09:22 +0000491 /* March over unreachable. Move objects with finalizers into
492 * `finalizers`.
493 */
494 for (gc = unreachable->gc.gc_next; gc != unreachable; gc = next) {
Neil Schemenauer43411b52001-08-30 00:05:51 +0000495 PyObject *op = FROM_GC(gc);
Jeremy Hyltonce136e92003-04-04 19:59:06 +0000496
Tim Petersf6ae7a42003-04-05 18:40:50 +0000497 assert(IS_TENTATIVELY_UNREACHABLE(op));
Tim Petersead8b7a2004-10-30 23:09:22 +0000498 next = gc->gc.gc_next;
Tim Petersf6ae7a42003-04-05 18:40:50 +0000499
Tim Petersf6b80452003-04-07 19:21:15 +0000500 if (has_finalizer(op)) {
Tim Peterse2d59182004-11-01 01:39:08 +0000501 gc_list_move(gc, finalizers);
Tim Petersf6b80452003-04-07 19:21:15 +0000502 gc->gc.gc_refs = GC_REACHABLE;
Jeremy Hyltonce136e92003-04-04 19:59:06 +0000503 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000504 }
505}
506
Tim Peters19b74c72002-07-01 03:52:19 +0000507/* A traversal callback for move_finalizer_reachable. */
508static int
509visit_move(PyObject *op, PyGC_Head *tolist)
510{
511 if (PyObject_IS_GC(op)) {
Tim Petersea405632002-07-02 00:52:30 +0000512 if (IS_TENTATIVELY_UNREACHABLE(op)) {
Tim Peters19b74c72002-07-01 03:52:19 +0000513 PyGC_Head *gc = AS_GC(op);
Tim Peterse2d59182004-11-01 01:39:08 +0000514 gc_list_move(gc, tolist);
Tim Peters19b74c72002-07-01 03:52:19 +0000515 gc->gc.gc_refs = GC_REACHABLE;
516 }
517 }
518 return 0;
519}
520
521/* Move objects that are reachable from finalizers, from the unreachable set
Tim Petersf6b80452003-04-07 19:21:15 +0000522 * into finalizers set.
Tim Peters19b74c72002-07-01 03:52:19 +0000523 */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000524static void
Tim Petersf6b80452003-04-07 19:21:15 +0000525move_finalizer_reachable(PyGC_Head *finalizers)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000526{
527 traverseproc traverse;
Tim Peters9e4ca102001-10-11 18:31:31 +0000528 PyGC_Head *gc = finalizers->gc.gc_next;
Tim Petersbf384c22003-04-06 00:11:39 +0000529 for (; gc != finalizers; gc = gc->gc.gc_next) {
530 /* Note that the finalizers list may grow during this. */
Christian Heimese93237d2007-12-19 02:37:44 +0000531 traverse = Py_TYPE(FROM_GC(gc))->tp_traverse;
Tim Peters88396172002-06-30 17:56:40 +0000532 (void) traverse(FROM_GC(gc),
Tim Petersbf384c22003-04-06 00:11:39 +0000533 (visitproc)visit_move,
Tim Petersf6b80452003-04-07 19:21:15 +0000534 (void *)finalizers);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000535 }
536}
537
Tim Petersead8b7a2004-10-30 23:09:22 +0000538/* Clear all weakrefs to unreachable objects, and if such a weakref has a
539 * callback, invoke it if necessary. Note that it's possible for such
540 * weakrefs to be outside the unreachable set -- indeed, those are precisely
541 * the weakrefs whose callbacks must be invoked. See gc_weakref.txt for
542 * overview & some details. Some weakrefs with callbacks may be reclaimed
543 * directly by this routine; the number reclaimed is the return value. Other
544 * weakrefs with callbacks may be moved into the `old` generation. Objects
545 * moved into `old` have gc_refs set to GC_REACHABLE; the objects remaining in
546 * unreachable are left at GC_TENTATIVELY_UNREACHABLE. When this returns,
547 * no object in `unreachable` is weakly referenced anymore.
Tim Peters403a2032003-11-20 21:21:46 +0000548 */
549static int
Tim Petersead8b7a2004-10-30 23:09:22 +0000550handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
Tim Peters403a2032003-11-20 21:21:46 +0000551{
Tim Petersead8b7a2004-10-30 23:09:22 +0000552 PyGC_Head *gc;
553 PyObject *op; /* generally FROM_GC(gc) */
554 PyWeakReference *wr; /* generally a cast of op */
Tim Petersead8b7a2004-10-30 23:09:22 +0000555 PyGC_Head wrcb_to_call; /* weakrefs with callbacks to call */
Tim Petersead8b7a2004-10-30 23:09:22 +0000556 PyGC_Head *next;
Tim Peters403a2032003-11-20 21:21:46 +0000557 int num_freed = 0;
558
Tim Petersead8b7a2004-10-30 23:09:22 +0000559 gc_list_init(&wrcb_to_call);
Tim Peters403a2032003-11-20 21:21:46 +0000560
Tim Petersead8b7a2004-10-30 23:09:22 +0000561 /* Clear all weakrefs to the objects in unreachable. If such a weakref
562 * also has a callback, move it into `wrcb_to_call` if the callback
Tim Peterscc2a8662004-10-31 22:12:43 +0000563 * needs to be invoked. Note that we cannot invoke any callbacks until
564 * all weakrefs to unreachable objects are cleared, lest the callback
565 * resurrect an unreachable object via a still-active weakref. We
566 * make another pass over wrcb_to_call, invoking callbacks, after this
567 * pass completes.
Tim Petersead8b7a2004-10-30 23:09:22 +0000568 */
569 for (gc = unreachable->gc.gc_next; gc != unreachable; gc = next) {
570 PyWeakReference **wrlist;
571
572 op = FROM_GC(gc);
573 assert(IS_TENTATIVELY_UNREACHABLE(op));
574 next = gc->gc.gc_next;
575
Christian Heimese93237d2007-12-19 02:37:44 +0000576 if (! PyType_SUPPORTS_WEAKREFS(Py_TYPE(op)))
Tim Petersead8b7a2004-10-30 23:09:22 +0000577 continue;
578
579 /* It supports weakrefs. Does it have any? */
580 wrlist = (PyWeakReference **)
581 PyObject_GET_WEAKREFS_LISTPTR(op);
582
583 /* `op` may have some weakrefs. March over the list, clear
584 * all the weakrefs, and move the weakrefs with callbacks
Tim Peterscc2a8662004-10-31 22:12:43 +0000585 * that must be called into wrcb_to_call.
Tim Petersead8b7a2004-10-30 23:09:22 +0000586 */
587 for (wr = *wrlist; wr != NULL; wr = *wrlist) {
588 PyGC_Head *wrasgc; /* AS_GC(wr) */
589
590 /* _PyWeakref_ClearRef clears the weakref but leaves
591 * the callback pointer intact. Obscure: it also
592 * changes *wrlist.
593 */
594 assert(wr->wr_object == op);
595 _PyWeakref_ClearRef(wr);
596 assert(wr->wr_object == Py_None);
597 if (wr->wr_callback == NULL)
598 continue; /* no callback */
599
600 /* Headache time. `op` is going away, and is weakly referenced by
601 * `wr`, which has a callback. Should the callback be invoked? If wr
602 * is also trash, no:
603 *
604 * 1. There's no need to call it. The object and the weakref are
605 * both going away, so it's legitimate to pretend the weakref is
606 * going away first. The user has to ensure a weakref outlives its
607 * referent if they want a guarantee that the wr callback will get
608 * invoked.
609 *
610 * 2. It may be catastrophic to call it. If the callback is also in
611 * cyclic trash (CT), then although the CT is unreachable from
612 * outside the current generation, CT may be reachable from the
613 * callback. Then the callback could resurrect insane objects.
614 *
615 * Since the callback is never needed and may be unsafe in this case,
Tim Peterscc2a8662004-10-31 22:12:43 +0000616 * wr is simply left in the unreachable set. Note that because we
617 * already called _PyWeakref_ClearRef(wr), its callback will never
618 * trigger.
Tim Petersead8b7a2004-10-30 23:09:22 +0000619 *
620 * OTOH, if wr isn't part of CT, we should invoke the callback: the
621 * weakref outlived the trash. Note that since wr isn't CT in this
622 * case, its callback can't be CT either -- wr acted as an external
623 * root to this generation, and therefore its callback did too. So
624 * nothing in CT is reachable from the callback either, so it's hard
625 * to imagine how calling it later could create a problem for us. wr
626 * is moved to wrcb_to_call in this case.
Tim Petersead8b7a2004-10-30 23:09:22 +0000627 */
Tim Peterscc2a8662004-10-31 22:12:43 +0000628 if (IS_TENTATIVELY_UNREACHABLE(wr))
629 continue;
630 assert(IS_REACHABLE(wr));
631
Tim Petersead8b7a2004-10-30 23:09:22 +0000632 /* Create a new reference so that wr can't go away
633 * before we can process it again.
634 */
635 Py_INCREF(wr);
636
Tim Peterscc2a8662004-10-31 22:12:43 +0000637 /* Move wr to wrcb_to_call, for the next pass. */
Tim Petersead8b7a2004-10-30 23:09:22 +0000638 wrasgc = AS_GC(wr);
Tim Peterscc2a8662004-10-31 22:12:43 +0000639 assert(wrasgc != next); /* wrasgc is reachable, but
640 next isn't, so they can't
641 be the same */
Tim Peterse2d59182004-11-01 01:39:08 +0000642 gc_list_move(wrasgc, &wrcb_to_call);
Tim Petersead8b7a2004-10-30 23:09:22 +0000643 }
644 }
645
Tim Peterscc2a8662004-10-31 22:12:43 +0000646 /* Invoke the callbacks we decided to honor. It's safe to invoke them
647 * because they can't reference unreachable objects.
Tim Petersead8b7a2004-10-30 23:09:22 +0000648 */
649 while (! gc_list_is_empty(&wrcb_to_call)) {
650 PyObject *temp;
651 PyObject *callback;
652
653 gc = wrcb_to_call.gc.gc_next;
654 op = FROM_GC(gc);
655 assert(IS_REACHABLE(op));
656 assert(PyWeakref_Check(op));
657 wr = (PyWeakReference *)op;
658 callback = wr->wr_callback;
659 assert(callback != NULL);
660
661 /* copy-paste of weakrefobject.c's handle_callback() */
Georg Brandl684fd0c2006-05-25 19:15:31 +0000662 temp = PyObject_CallFunctionObjArgs(callback, wr, NULL);
Tim Petersead8b7a2004-10-30 23:09:22 +0000663 if (temp == NULL)
664 PyErr_WriteUnraisable(callback);
665 else
666 Py_DECREF(temp);
667
668 /* Give up the reference we created in the first pass. When
669 * op's refcount hits 0 (which it may or may not do right now),
Tim Peterscc2a8662004-10-31 22:12:43 +0000670 * op's tp_dealloc will decref op->wr_callback too. Note
671 * that the refcount probably will hit 0 now, and because this
672 * weakref was reachable to begin with, gc didn't already
673 * add it to its count of freed objects. Example: a reachable
674 * weak value dict maps some key to this reachable weakref.
675 * The callback removes this key->weakref mapping from the
676 * dict, leaving no other references to the weakref (excepting
677 * ours).
Tim Petersead8b7a2004-10-30 23:09:22 +0000678 */
679 Py_DECREF(op);
680 if (wrcb_to_call.gc.gc_next == gc) {
681 /* object is still alive -- move it */
Tim Peterse2d59182004-11-01 01:39:08 +0000682 gc_list_move(gc, old);
Tim Petersead8b7a2004-10-30 23:09:22 +0000683 }
684 else
685 ++num_freed;
686 }
687
Tim Peters403a2032003-11-20 21:21:46 +0000688 return num_freed;
689}
690
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000691static void
Jeremy Hylton06257772000-08-31 15:10:24 +0000692debug_instance(char *msg, PyInstanceObject *inst)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000693{
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000694 char *cname;
Neil Schemenauera765c122001-11-01 17:35:23 +0000695 /* simple version of instance_repr */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000696 PyObject *classname = inst->in_class->cl_name;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000697 if (classname != NULL && PyString_Check(classname))
698 cname = PyString_AsString(classname);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000699 else
700 cname = "?";
Jeremy Hylton06257772000-08-31 15:10:24 +0000701 PySys_WriteStderr("gc: %.100s <%.100s instance at %p>\n",
702 msg, cname, inst);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000703}
704
705static void
Jeremy Hylton06257772000-08-31 15:10:24 +0000706debug_cycle(char *msg, PyObject *op)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000707{
708 if ((debug & DEBUG_INSTANCES) && PyInstance_Check(op)) {
Jeremy Hylton06257772000-08-31 15:10:24 +0000709 debug_instance(msg, (PyInstanceObject *)op);
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000710 }
711 else if (debug & DEBUG_OBJECTS) {
Jeremy Hylton06257772000-08-31 15:10:24 +0000712 PySys_WriteStderr("gc: %.100s <%.100s %p>\n",
Christian Heimese93237d2007-12-19 02:37:44 +0000713 msg, Py_TYPE(op)->tp_name, op);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000714 }
715}
716
Tim Petersbf384c22003-04-06 00:11:39 +0000717/* Handle uncollectable garbage (cycles with finalizers, and stuff reachable
718 * only from such cycles).
Tim Petersf6b80452003-04-07 19:21:15 +0000719 * If DEBUG_SAVEALL, all objects in finalizers are appended to the module
720 * garbage list (a Python list), else only the objects in finalizers with
721 * __del__ methods are appended to garbage. All objects in finalizers are
722 * merged into the old list regardless.
Tim Peters259272b2003-04-06 19:41:39 +0000723 * Returns 0 if all OK, <0 on error (out of memory to grow the garbage list).
724 * The finalizers list is made empty on a successful return.
Tim Petersbf384c22003-04-06 00:11:39 +0000725 */
Tim Peters259272b2003-04-06 19:41:39 +0000726static int
Tim Petersf6b80452003-04-07 19:21:15 +0000727handle_finalizers(PyGC_Head *finalizers, PyGC_Head *old)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000728{
Tim Petersf6b80452003-04-07 19:21:15 +0000729 PyGC_Head *gc = finalizers->gc.gc_next;
730
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000731 if (garbage == NULL) {
732 garbage = PyList_New(0);
Tim Petersbf384c22003-04-06 00:11:39 +0000733 if (garbage == NULL)
734 Py_FatalError("gc couldn't create gc.garbage list");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000735 }
Tim Petersf6b80452003-04-07 19:21:15 +0000736 for (; gc != finalizers; gc = gc->gc.gc_next) {
737 PyObject *op = FROM_GC(gc);
738
739 if ((debug & DEBUG_SAVEALL) || has_finalizer(op)) {
740 if (PyList_Append(garbage, op) < 0)
741 return -1;
742 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000743 }
Tim Petersf6b80452003-04-07 19:21:15 +0000744
Tim Peters259272b2003-04-06 19:41:39 +0000745 gc_list_merge(finalizers, old);
746 return 0;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000747}
748
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000749/* Break reference cycles by clearing the containers involved. This is
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000750 * tricky business as the lists can be changing and we don't know which
Tim Peters19b74c72002-07-01 03:52:19 +0000751 * objects may be freed. It is possible I screwed something up here.
752 */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000753static void
Jeremy Hyltonce136e92003-04-04 19:59:06 +0000754delete_garbage(PyGC_Head *collectable, PyGC_Head *old)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000755{
756 inquiry clear;
757
Jeremy Hyltonce136e92003-04-04 19:59:06 +0000758 while (!gc_list_is_empty(collectable)) {
759 PyGC_Head *gc = collectable->gc.gc_next;
Neil Schemenauer43411b52001-08-30 00:05:51 +0000760 PyObject *op = FROM_GC(gc);
Tim Peters88396172002-06-30 17:56:40 +0000761
Tim Peters19b74c72002-07-01 03:52:19 +0000762 assert(IS_TENTATIVELY_UNREACHABLE(op));
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000763 if (debug & DEBUG_SAVEALL) {
764 PyList_Append(garbage, op);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000765 }
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000766 else {
Christian Heimese93237d2007-12-19 02:37:44 +0000767 if ((clear = Py_TYPE(op)->tp_clear) != NULL) {
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000768 Py_INCREF(op);
Jeremy Hylton8a135182002-06-06 23:23:55 +0000769 clear(op);
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000770 Py_DECREF(op);
771 }
772 }
Jeremy Hyltonce136e92003-04-04 19:59:06 +0000773 if (collectable->gc.gc_next == gc) {
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000774 /* object is still alive, move it, it may die later */
Tim Peterse2d59182004-11-01 01:39:08 +0000775 gc_list_move(gc, old);
Tim Peters19b74c72002-07-01 03:52:19 +0000776 gc->gc.gc_refs = GC_REACHABLE;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000777 }
778 }
779}
780
Christian Heimes3b718a72008-02-14 12:47:33 +0000781/* Clear all free lists
782 * All free lists are cleared during the collection of the highest generation.
783 * Allocated items in the free list may keep a pymalloc arena occupied.
784 * Clearing the free lists may give back memory to the OS earlier.
785 */
786static void
787clear_freelists(void)
788{
789 (void)PyMethod_ClearFreeList();
790 (void)PyFrame_ClearFreeList();
791 (void)PyCFunction_ClearFreeList();
792 (void)PyTuple_ClearFreeList();
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000793#ifdef Py_USING_UNICODE
Christian Heimes3b718a72008-02-14 12:47:33 +0000794 (void)PyUnicode_ClearFreeList();
Benjamin Peterson78821dd2009-01-25 17:15:10 +0000795#endif
Gregory P. Smith2fe77062008-07-06 03:35:58 +0000796 (void)PyInt_ClearFreeList();
797 (void)PyFloat_ClearFreeList();
Christian Heimes3b718a72008-02-14 12:47:33 +0000798}
799
Antoine Pitrou73c0e652008-12-17 22:46:54 +0000800static double
801get_time(void)
802{
803 double result = 0;
804 if (tmod != NULL) {
805 PyObject *f = PyObject_CallMethod(tmod, "time", NULL);
806 if (f == NULL) {
807 PyErr_Clear();
808 }
809 else {
810 if (PyFloat_Check(f))
811 result = PyFloat_AsDouble(f);
812 Py_DECREF(f);
813 }
814 }
815 return result;
816}
817
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000818/* This is the main function. Read this to understand how the
819 * collection process works. */
Neal Norwitz7b216c52006-03-04 20:01:53 +0000820static Py_ssize_t
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000821collect(int generation)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000822{
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000823 int i;
Neal Norwitz7b216c52006-03-04 20:01:53 +0000824 Py_ssize_t m = 0; /* # objects collected */
825 Py_ssize_t n = 0; /* # unreachable objects that couldn't be collected */
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000826 PyGC_Head *young; /* the generation we are examining */
827 PyGC_Head *old; /* next older generation */
Tim Peters403a2032003-11-20 21:21:46 +0000828 PyGC_Head unreachable; /* non-problematic unreachable trash */
829 PyGC_Head finalizers; /* objects with, & reachable from, __del__ */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000830 PyGC_Head *gc;
Skip Montanaroc34b9312006-04-21 01:33:40 +0000831 double t1 = 0.0;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000832
Tim Peters93ad66d2003-04-05 17:15:44 +0000833 if (delstr == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000834 delstr = PyString_InternFromString("__del__");
Tim Peters93ad66d2003-04-05 17:15:44 +0000835 if (delstr == NULL)
836 Py_FatalError("gc couldn't allocate \"__del__\"");
837 }
838
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000839 if (debug & DEBUG_STATS) {
Antoine Pitrou73c0e652008-12-17 22:46:54 +0000840 t1 = get_time();
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000841 PySys_WriteStderr("gc: collecting generation %d...\n",
842 generation);
843 PySys_WriteStderr("gc: objects in each generation:");
Tim Peters62e97f02006-03-28 21:44:32 +0000844 for (i = 0; i < NUM_GENERATIONS; i++)
845 PySys_WriteStderr(" %" PY_FORMAT_SIZE_T "d",
846 gc_list_size(GEN_HEAD(i)));
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000847 PySys_WriteStderr("\n");
848 }
849
850 /* update collection and allocation counters */
851 if (generation+1 < NUM_GENERATIONS)
852 generations[generation+1].count += 1;
853 for (i = 0; i <= generation; i++)
Neil Schemenauerc9051642002-06-28 19:16:04 +0000854 generations[i].count = 0;
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000855
856 /* merge younger generations with one we are currently collecting */
857 for (i = 0; i < generation; i++) {
858 gc_list_merge(GEN_HEAD(i), GEN_HEAD(generation));
859 }
860
861 /* handy references */
862 young = GEN_HEAD(generation);
Tim Peters19b74c72002-07-01 03:52:19 +0000863 if (generation < NUM_GENERATIONS-1)
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000864 old = GEN_HEAD(generation+1);
Tim Peters19b74c72002-07-01 03:52:19 +0000865 else
866 old = young;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000867
868 /* Using ob_refcnt and gc_refs, calculate which objects in the
Tim Petersead8b7a2004-10-30 23:09:22 +0000869 * container set are reachable from outside the set (i.e., have a
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000870 * refcount greater than 0 when all the references within the
Tim Petersead8b7a2004-10-30 23:09:22 +0000871 * set are taken into account).
Tim Peters19b74c72002-07-01 03:52:19 +0000872 */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000873 update_refs(young);
874 subtract_refs(young);
875
Tim Peters19b74c72002-07-01 03:52:19 +0000876 /* Leave everything reachable from outside young in young, and move
877 * everything else (in young) to unreachable.
878 * NOTE: This used to move the reachable objects into a reachable
879 * set instead. But most things usually turn out to be reachable,
880 * so it's more efficient to move the unreachable things.
881 */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000882 gc_list_init(&unreachable);
Tim Peters19b74c72002-07-01 03:52:19 +0000883 move_unreachable(young, &unreachable);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000884
Tim Peters19b74c72002-07-01 03:52:19 +0000885 /* Move reachable objects to next generation. */
Antoine Pitrou4c5ecb72009-01-09 21:40:55 +0000886 if (young != old) {
887 if (generation == NUM_GENERATIONS - 2) {
888 long_lived_pending += gc_list_size(young);
889 }
Tim Peters19b74c72002-07-01 03:52:19 +0000890 gc_list_merge(young, old);
Antoine Pitrou4c5ecb72009-01-09 21:40:55 +0000891 }
892 else {
893 long_lived_pending = 0;
894 long_lived_total = gc_list_size(young);
895 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000896
Tim Peters19b74c72002-07-01 03:52:19 +0000897 /* All objects in unreachable are trash, but objects reachable from
898 * finalizers can't safely be deleted. Python programmers should take
899 * care not to create such things. For Python, finalizers means
Tim Peters403a2032003-11-20 21:21:46 +0000900 * instance objects with __del__ methods. Weakrefs with callbacks
Tim Petersead8b7a2004-10-30 23:09:22 +0000901 * can also call arbitrary Python code but they will be dealt with by
902 * handle_weakrefs().
Tim Petersf6b80452003-04-07 19:21:15 +0000903 */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000904 gc_list_init(&finalizers);
Tim Petersead8b7a2004-10-30 23:09:22 +0000905 move_finalizers(&unreachable, &finalizers);
Tim Petersbf384c22003-04-06 00:11:39 +0000906 /* finalizers contains the unreachable objects with a finalizer;
Tim Peters403a2032003-11-20 21:21:46 +0000907 * unreachable objects reachable *from* those are also uncollectable,
908 * and we move those into the finalizers list too.
Tim Petersbf384c22003-04-06 00:11:39 +0000909 */
Tim Petersf6b80452003-04-07 19:21:15 +0000910 move_finalizer_reachable(&finalizers);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000911
912 /* Collect statistics on collectable objects found and print
Tim Peters403a2032003-11-20 21:21:46 +0000913 * debugging information.
914 */
Tim Petersf6b80452003-04-07 19:21:15 +0000915 for (gc = unreachable.gc.gc_next; gc != &unreachable;
Tim Peters9e4ca102001-10-11 18:31:31 +0000916 gc = gc->gc.gc_next) {
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000917 m++;
Jeremy Hylton06257772000-08-31 15:10:24 +0000918 if (debug & DEBUG_COLLECTABLE) {
Neil Schemenauer43411b52001-08-30 00:05:51 +0000919 debug_cycle("collectable", FROM_GC(gc));
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000920 }
921 }
Tim Petersead8b7a2004-10-30 23:09:22 +0000922
923 /* Clear weakrefs and invoke callbacks as necessary. */
924 m += handle_weakrefs(&unreachable, old);
925
Tim Petersfb2ab4d2003-04-07 22:41:24 +0000926 /* Call tp_clear on objects in the unreachable set. This will cause
927 * the reference cycles to be broken. It may also cause some objects
928 * in finalizers to be freed.
929 */
Tim Petersf6b80452003-04-07 19:21:15 +0000930 delete_garbage(&unreachable, old);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000931
932 /* Collect statistics on uncollectable objects found and print
933 * debugging information. */
Tim Peters50c61d52003-04-06 01:50:50 +0000934 for (gc = finalizers.gc.gc_next;
Tim Petersbf384c22003-04-06 00:11:39 +0000935 gc != &finalizers;
936 gc = gc->gc.gc_next) {
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000937 n++;
Tim Petersbf384c22003-04-06 00:11:39 +0000938 if (debug & DEBUG_UNCOLLECTABLE)
Neil Schemenauer43411b52001-08-30 00:05:51 +0000939 debug_cycle("uncollectable", FROM_GC(gc));
Tim Petersbf384c22003-04-06 00:11:39 +0000940 }
Jeremy Hylton06257772000-08-31 15:10:24 +0000941 if (debug & DEBUG_STATS) {
Antoine Pitrou73c0e652008-12-17 22:46:54 +0000942 double t2 = get_time();
Tim Peters62e97f02006-03-28 21:44:32 +0000943 if (m == 0 && n == 0)
Antoine Pitrou73c0e652008-12-17 22:46:54 +0000944 PySys_WriteStderr("gc: done");
Tim Peters62e97f02006-03-28 21:44:32 +0000945 else
Neal Norwitze22373d2006-03-06 23:31:56 +0000946 PySys_WriteStderr(
Tim Peters62e97f02006-03-28 21:44:32 +0000947 "gc: done, "
948 "%" PY_FORMAT_SIZE_T "d unreachable, "
Antoine Pitrou73c0e652008-12-17 22:46:54 +0000949 "%" PY_FORMAT_SIZE_T "d uncollectable",
Neal Norwitze22373d2006-03-06 23:31:56 +0000950 n+m, n);
Antoine Pitrou73c0e652008-12-17 22:46:54 +0000951 if (t1 && t2) {
952 PySys_WriteStderr(", %.4fs elapsed", t2-t1);
953 }
954 PySys_WriteStderr(".\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000955 }
956
957 /* Append instances in the uncollectable set to a Python
958 * reachable list of garbage. The programmer has to deal with
Tim Petersbf384c22003-04-06 00:11:39 +0000959 * this if they insist on creating this type of structure.
960 */
Tim Petersf6b80452003-04-07 19:21:15 +0000961 (void)handle_finalizers(&finalizers, old);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000962
Christian Heimes3b718a72008-02-14 12:47:33 +0000963 /* Clear free list only during the collection of the higest
964 * generation */
965 if (generation == NUM_GENERATIONS-1) {
966 clear_freelists();
967 }
968
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000969 if (PyErr_Occurred()) {
Tim Petersf6b80452003-04-07 19:21:15 +0000970 if (gc_str == NULL)
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000971 gc_str = PyString_FromString("garbage collection");
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000972 PyErr_WriteUnraisable(gc_str);
973 Py_FatalError("unexpected exception during garbage collection");
974 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000975 return n+m;
976}
977
Neal Norwitz7b216c52006-03-04 20:01:53 +0000978static Py_ssize_t
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000979collect_generations(void)
980{
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000981 int i;
Neal Norwitz7b216c52006-03-04 20:01:53 +0000982 Py_ssize_t n = 0;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000983
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000984 /* Find the oldest generation (higest numbered) where the count
985 * exceeds the threshold. Objects in the that generation and
986 * generations younger than it will be collected. */
987 for (i = NUM_GENERATIONS-1; i >= 0; i--) {
988 if (generations[i].count > generations[i].threshold) {
Antoine Pitrou4c5ecb72009-01-09 21:40:55 +0000989 /* Avoid quadratic performance degradation in number
990 of tracked objects. See comments at the beginning
991 of this file, and issue #4074.
992 */
993 if (i == NUM_GENERATIONS - 1
994 && long_lived_pending < long_lived_total / 4)
995 continue;
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000996 n = collect(i);
997 break;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000998 }
999 }
1000 return n;
1001}
1002
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001003PyDoc_STRVAR(gc_enable__doc__,
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001004"enable() -> None\n"
1005"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001006"Enable automatic garbage collection.\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001007
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001008static PyObject *
Tim Peters50c61d52003-04-06 01:50:50 +00001009gc_enable(PyObject *self, PyObject *noargs)
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001010{
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001011 enabled = 1;
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001012 Py_INCREF(Py_None);
1013 return Py_None;
1014}
1015
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001016PyDoc_STRVAR(gc_disable__doc__,
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001017"disable() -> None\n"
1018"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001019"Disable automatic garbage collection.\n");
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001020
1021static PyObject *
Tim Peters50c61d52003-04-06 01:50:50 +00001022gc_disable(PyObject *self, PyObject *noargs)
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001023{
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001024 enabled = 0;
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001025 Py_INCREF(Py_None);
1026 return Py_None;
1027}
1028
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001029PyDoc_STRVAR(gc_isenabled__doc__,
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001030"isenabled() -> status\n"
1031"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001032"Returns true if automatic garbage collection is enabled.\n");
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001033
1034static PyObject *
Tim Peters50c61d52003-04-06 01:50:50 +00001035gc_isenabled(PyObject *self, PyObject *noargs)
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001036{
Raymond Hettinger674d56b2004-01-04 04:00:13 +00001037 return PyBool_FromLong((long)enabled);
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001038}
1039
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001040PyDoc_STRVAR(gc_collect__doc__,
Barry Warsawd3c38ff2006-03-07 09:46:03 +00001041"collect([generation]) -> n\n"
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001042"\n"
Barry Warsawd3c38ff2006-03-07 09:46:03 +00001043"With no arguments, run a full collection. The optional argument\n"
1044"may be an integer specifying which generation to collect. A ValueError\n"
1045"is raised if the generation number is invalid.\n\n"
1046"The number of unreachable objects is returned.\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001047
1048static PyObject *
Barry Warsawd3c38ff2006-03-07 09:46:03 +00001049gc_collect(PyObject *self, PyObject *args, PyObject *kws)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001050{
Barry Warsawd3c38ff2006-03-07 09:46:03 +00001051 static char *keywords[] = {"generation", NULL};
1052 int genarg = NUM_GENERATIONS - 1;
Neal Norwitz7b216c52006-03-04 20:01:53 +00001053 Py_ssize_t n;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001054
Barry Warsawd3c38ff2006-03-07 09:46:03 +00001055 if (!PyArg_ParseTupleAndKeywords(args, kws, "|i", keywords, &genarg))
1056 return NULL;
1057
1058 else if (genarg < 0 || genarg >= NUM_GENERATIONS) {
1059 PyErr_SetString(PyExc_ValueError, "invalid generation");
1060 return NULL;
1061 }
1062
Tim Peters50c61d52003-04-06 01:50:50 +00001063 if (collecting)
Neil Schemenauere8c40cb2001-10-31 23:09:35 +00001064 n = 0; /* already collecting, don't do anything */
Neil Schemenauere8c40cb2001-10-31 23:09:35 +00001065 else {
1066 collecting = 1;
Barry Warsawd3c38ff2006-03-07 09:46:03 +00001067 n = collect(genarg);
Neil Schemenauere8c40cb2001-10-31 23:09:35 +00001068 collecting = 0;
1069 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001070
Neal Norwitz7b216c52006-03-04 20:01:53 +00001071 return PyInt_FromSsize_t(n);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001072}
1073
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001074PyDoc_STRVAR(gc_set_debug__doc__,
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001075"set_debug(flags) -> None\n"
1076"\n"
1077"Set the garbage collection debugging flags. Debugging information is\n"
1078"written to sys.stderr.\n"
1079"\n"
1080"flags is an integer and can have the following bits turned on:\n"
1081"\n"
1082" DEBUG_STATS - Print statistics during collection.\n"
1083" DEBUG_COLLECTABLE - Print collectable objects found.\n"
1084" DEBUG_UNCOLLECTABLE - Print unreachable but uncollectable objects found.\n"
1085" DEBUG_INSTANCES - Print instance objects.\n"
1086" DEBUG_OBJECTS - Print objects other than instances.\n"
Neil Schemenauer544de1e2000-09-22 15:22:38 +00001087" DEBUG_SAVEALL - Save objects to gc.garbage rather than freeing them.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001088" DEBUG_LEAK - Debug leaking programs (everything but STATS).\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001089
1090static PyObject *
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001091gc_set_debug(PyObject *self, PyObject *args)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001092{
Neil Schemenauer7760cff2000-09-22 22:35:36 +00001093 if (!PyArg_ParseTuple(args, "i:set_debug", &debug))
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001094 return NULL;
1095
1096 Py_INCREF(Py_None);
1097 return Py_None;
1098}
1099
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001100PyDoc_STRVAR(gc_get_debug__doc__,
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001101"get_debug() -> flags\n"
1102"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001103"Get the garbage collection debugging flags.\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001104
1105static PyObject *
Tim Peters50c61d52003-04-06 01:50:50 +00001106gc_get_debug(PyObject *self, PyObject *noargs)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001107{
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001108 return Py_BuildValue("i", debug);
1109}
1110
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001111PyDoc_STRVAR(gc_set_thresh__doc__,
Neal Norwitz2a47c0f2002-01-29 00:53:41 +00001112"set_threshold(threshold0, [threshold1, threshold2]) -> None\n"
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001113"\n"
1114"Sets the collection thresholds. Setting threshold0 to zero disables\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001115"collection.\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001116
1117static PyObject *
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001118gc_set_thresh(PyObject *self, PyObject *args)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001119{
Neil Schemenauer2880ae52002-05-04 05:35:20 +00001120 int i;
1121 if (!PyArg_ParseTuple(args, "i|ii:set_threshold",
1122 &generations[0].threshold,
1123 &generations[1].threshold,
1124 &generations[2].threshold))
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001125 return NULL;
Neil Schemenauer2880ae52002-05-04 05:35:20 +00001126 for (i = 2; i < NUM_GENERATIONS; i++) {
1127 /* generations higher than 2 get the same threshold */
1128 generations[i].threshold = generations[2].threshold;
1129 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001130
1131 Py_INCREF(Py_None);
1132 return Py_None;
1133}
1134
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001135PyDoc_STRVAR(gc_get_thresh__doc__,
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001136"get_threshold() -> (threshold0, threshold1, threshold2)\n"
1137"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001138"Return the current collection thresholds\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001139
1140static PyObject *
Tim Peters50c61d52003-04-06 01:50:50 +00001141gc_get_thresh(PyObject *self, PyObject *noargs)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001142{
Neil Schemenauer2880ae52002-05-04 05:35:20 +00001143 return Py_BuildValue("(iii)",
1144 generations[0].threshold,
1145 generations[1].threshold,
1146 generations[2].threshold);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001147}
1148
Barry Warsawd3c38ff2006-03-07 09:46:03 +00001149PyDoc_STRVAR(gc_get_count__doc__,
1150"get_count() -> (count0, count1, count2)\n"
1151"\n"
1152"Return the current collection counts\n");
1153
1154static PyObject *
1155gc_get_count(PyObject *self, PyObject *noargs)
1156{
1157 return Py_BuildValue("(iii)",
1158 generations[0].count,
1159 generations[1].count,
1160 generations[2].count);
1161}
1162
Neil Schemenauer48c70342001-08-09 15:38:31 +00001163static int
Martin v. Löwis560da622001-11-24 09:24:51 +00001164referrersvisit(PyObject* obj, PyObject *objs)
Neil Schemenauer48c70342001-08-09 15:38:31 +00001165{
Neal Norwitzffb0d902006-04-06 08:07:25 +00001166 Py_ssize_t i;
Martin v. Löwisc8fe77b2001-11-29 18:08:31 +00001167 for (i = 0; i < PyTuple_GET_SIZE(objs); i++)
1168 if (PyTuple_GET_ITEM(objs, i) == obj)
1169 return 1;
Neil Schemenauer48c70342001-08-09 15:38:31 +00001170 return 0;
1171}
1172
Neil Schemenauer17e7be62001-08-10 14:46:47 +00001173static int
Martin v. Löwis560da622001-11-24 09:24:51 +00001174gc_referrers_for(PyObject *objs, PyGC_Head *list, PyObject *resultlist)
Neil Schemenauer48c70342001-08-09 15:38:31 +00001175{
1176 PyGC_Head *gc;
1177 PyObject *obj;
1178 traverseproc traverse;
Tim Peters9e4ca102001-10-11 18:31:31 +00001179 for (gc = list->gc.gc_next; gc != list; gc = gc->gc.gc_next) {
Neil Schemenauer43411b52001-08-30 00:05:51 +00001180 obj = FROM_GC(gc);
Christian Heimese93237d2007-12-19 02:37:44 +00001181 traverse = Py_TYPE(obj)->tp_traverse;
Neil Schemenauer48c70342001-08-09 15:38:31 +00001182 if (obj == objs || obj == resultlist)
1183 continue;
Martin v. Löwis560da622001-11-24 09:24:51 +00001184 if (traverse(obj, (visitproc)referrersvisit, objs)) {
Neil Schemenauer17e7be62001-08-10 14:46:47 +00001185 if (PyList_Append(resultlist, obj) < 0)
1186 return 0; /* error */
Neil Schemenauer48c70342001-08-09 15:38:31 +00001187 }
1188 }
Neil Schemenauer17e7be62001-08-10 14:46:47 +00001189 return 1; /* no error */
Neil Schemenauer48c70342001-08-09 15:38:31 +00001190}
1191
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001192PyDoc_STRVAR(gc_get_referrers__doc__,
Martin v. Löwis560da622001-11-24 09:24:51 +00001193"get_referrers(*objs) -> list\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001194Return the list of objects that directly refer to any of objs.");
Neil Schemenauer48c70342001-08-09 15:38:31 +00001195
Neil Schemenauer17e7be62001-08-10 14:46:47 +00001196static PyObject *
Martin v. Löwis560da622001-11-24 09:24:51 +00001197gc_get_referrers(PyObject *self, PyObject *args)
Neil Schemenauer48c70342001-08-09 15:38:31 +00001198{
Neil Schemenauer2880ae52002-05-04 05:35:20 +00001199 int i;
Neil Schemenauer48c70342001-08-09 15:38:31 +00001200 PyObject *result = PyList_New(0);
Georg Brandl5c170fd2006-03-17 19:03:25 +00001201 if (!result) return NULL;
1202
Neil Schemenauer2880ae52002-05-04 05:35:20 +00001203 for (i = 0; i < NUM_GENERATIONS; i++) {
1204 if (!(gc_referrers_for(args, GEN_HEAD(i), result))) {
1205 Py_DECREF(result);
1206 return NULL;
1207 }
Neil Schemenauer17e7be62001-08-10 14:46:47 +00001208 }
Neil Schemenauer48c70342001-08-09 15:38:31 +00001209 return result;
1210}
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001211
Tim Peters0f81ab62003-04-08 16:39:48 +00001212/* Append obj to list; return true if error (out of memory), false if OK. */
Jeremy Hylton5bd378b2003-04-03 16:28:38 +00001213static int
Tim Peters730f5532003-04-08 17:17:17 +00001214referentsvisit(PyObject *obj, PyObject *list)
Jeremy Hylton5bd378b2003-04-03 16:28:38 +00001215{
Tim Peters0f81ab62003-04-08 16:39:48 +00001216 return PyList_Append(list, obj) < 0;
Jeremy Hylton5bd378b2003-04-03 16:28:38 +00001217}
1218
Tim Peters730f5532003-04-08 17:17:17 +00001219PyDoc_STRVAR(gc_get_referents__doc__,
1220"get_referents(*objs) -> list\n\
Jeremy Hylton059b0942003-04-03 16:29:13 +00001221Return the list of objects that are directly referred to by objs.");
Jeremy Hylton5bd378b2003-04-03 16:28:38 +00001222
1223static PyObject *
Tim Peters730f5532003-04-08 17:17:17 +00001224gc_get_referents(PyObject *self, PyObject *args)
Jeremy Hylton5bd378b2003-04-03 16:28:38 +00001225{
Neal Norwitzffb0d902006-04-06 08:07:25 +00001226 Py_ssize_t i;
Jeremy Hylton5bd378b2003-04-03 16:28:38 +00001227 PyObject *result = PyList_New(0);
Tim Peters0f81ab62003-04-08 16:39:48 +00001228
1229 if (result == NULL)
1230 return NULL;
1231
Jeremy Hylton5bd378b2003-04-03 16:28:38 +00001232 for (i = 0; i < PyTuple_GET_SIZE(args); i++) {
Tim Peters0f81ab62003-04-08 16:39:48 +00001233 traverseproc traverse;
Tim Peters93ad66d2003-04-05 17:15:44 +00001234 PyObject *obj = PyTuple_GET_ITEM(args, i);
Tim Peters0f81ab62003-04-08 16:39:48 +00001235
1236 if (! PyObject_IS_GC(obj))
Jeremy Hylton5bd378b2003-04-03 16:28:38 +00001237 continue;
Christian Heimese93237d2007-12-19 02:37:44 +00001238 traverse = Py_TYPE(obj)->tp_traverse;
Tim Peters0f81ab62003-04-08 16:39:48 +00001239 if (! traverse)
1240 continue;
Tim Peters730f5532003-04-08 17:17:17 +00001241 if (traverse(obj, (visitproc)referentsvisit, result)) {
Tim Peters0f81ab62003-04-08 16:39:48 +00001242 Py_DECREF(result);
Jeremy Hylton5bd378b2003-04-03 16:28:38 +00001243 return NULL;
Tim Peters0f81ab62003-04-08 16:39:48 +00001244 }
Jeremy Hylton5bd378b2003-04-03 16:28:38 +00001245 }
1246 return result;
1247}
1248
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001249PyDoc_STRVAR(gc_get_objects__doc__,
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +00001250"get_objects() -> [...]\n"
1251"\n"
1252"Return a list of objects tracked by the collector (excluding the list\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001253"returned).\n");
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +00001254
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +00001255static PyObject *
Tim Peters50c61d52003-04-06 01:50:50 +00001256gc_get_objects(PyObject *self, PyObject *noargs)
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +00001257{
Neil Schemenauer2880ae52002-05-04 05:35:20 +00001258 int i;
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +00001259 PyObject* result;
1260
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +00001261 result = PyList_New(0);
Tim Peters50c61d52003-04-06 01:50:50 +00001262 if (result == NULL)
Martin v. Löwisf8a6f242001-12-02 18:31:02 +00001263 return NULL;
Neil Schemenauer2880ae52002-05-04 05:35:20 +00001264 for (i = 0; i < NUM_GENERATIONS; i++) {
1265 if (append_objects(result, GEN_HEAD(i))) {
1266 Py_DECREF(result);
1267 return NULL;
1268 }
Martin v. Löwis155aad12001-12-02 12:21:34 +00001269 }
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +00001270 return result;
1271}
1272
Antoine Pitrouf8387af2009-03-23 18:41:45 +00001273PyDoc_STRVAR(gc_is_tracked__doc__,
1274"is_tracked(obj) -> bool\n"
1275"\n"
1276"Returns true if the object is tracked by the garbage collector.\n"
1277"Simple atomic objects will return false.\n"
1278);
1279
1280static PyObject *
1281gc_is_tracked(PyObject *self, PyObject *obj)
1282{
1283 PyObject *result;
1284
1285 if (PyObject_IS_GC(obj) && IS_TRACKED(obj))
1286 result = Py_True;
1287 else
1288 result = Py_False;
1289 Py_INCREF(result);
1290 return result;
1291}
1292
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +00001293
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001294PyDoc_STRVAR(gc__doc__,
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001295"This module provides access to the garbage collector for reference cycles.\n"
1296"\n"
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001297"enable() -- Enable automatic garbage collection.\n"
1298"disable() -- Disable automatic garbage collection.\n"
1299"isenabled() -- Returns true if automatic collection is enabled.\n"
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001300"collect() -- Do a full collection right now.\n"
Barry Warsawe5ec6132006-10-09 19:43:24 +00001301"get_count() -- Return the current collection counts.\n"
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001302"set_debug() -- Set debugging flags.\n"
1303"get_debug() -- Get debugging flags.\n"
1304"set_threshold() -- Set the collection thresholds.\n"
1305"get_threshold() -- Return the current the collection thresholds.\n"
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +00001306"get_objects() -- Return a list of all objects tracked by the collector.\n"
Antoine Pitrouf8387af2009-03-23 18:41:45 +00001307"is_tracked() -- Returns true if a given object is tracked.\n"
Jeremy Hylton5bd378b2003-04-03 16:28:38 +00001308"get_referrers() -- Return the list of objects that refer to an object.\n"
Tim Peters730f5532003-04-08 17:17:17 +00001309"get_referents() -- Return the list of objects that an object refers to.\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001310
1311static PyMethodDef GcMethods[] = {
Tim Peters50c61d52003-04-06 01:50:50 +00001312 {"enable", gc_enable, METH_NOARGS, gc_enable__doc__},
1313 {"disable", gc_disable, METH_NOARGS, gc_disable__doc__},
1314 {"isenabled", gc_isenabled, METH_NOARGS, gc_isenabled__doc__},
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001315 {"set_debug", gc_set_debug, METH_VARARGS, gc_set_debug__doc__},
Tim Peters50c61d52003-04-06 01:50:50 +00001316 {"get_debug", gc_get_debug, METH_NOARGS, gc_get_debug__doc__},
Barry Warsawd3c38ff2006-03-07 09:46:03 +00001317 {"get_count", gc_get_count, METH_NOARGS, gc_get_count__doc__},
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +00001318 {"set_threshold", gc_set_thresh, METH_VARARGS, gc_set_thresh__doc__},
Tim Peters50c61d52003-04-06 01:50:50 +00001319 {"get_threshold", gc_get_thresh, METH_NOARGS, gc_get_thresh__doc__},
Barry Warsawd3c38ff2006-03-07 09:46:03 +00001320 {"collect", (PyCFunction)gc_collect,
1321 METH_VARARGS | METH_KEYWORDS, gc_collect__doc__},
Tim Peters50c61d52003-04-06 01:50:50 +00001322 {"get_objects", gc_get_objects,METH_NOARGS, gc_get_objects__doc__},
Antoine Pitrouf8387af2009-03-23 18:41:45 +00001323 {"is_tracked", gc_is_tracked, METH_O, gc_is_tracked__doc__},
Martin v. Löwis560da622001-11-24 09:24:51 +00001324 {"get_referrers", gc_get_referrers, METH_VARARGS,
1325 gc_get_referrers__doc__},
Tim Peters730f5532003-04-08 17:17:17 +00001326 {"get_referents", gc_get_referents, METH_VARARGS,
1327 gc_get_referents__doc__},
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001328 {NULL, NULL} /* Sentinel */
1329};
1330
Jason Tishler6bc06ec2003-09-04 11:59:50 +00001331PyMODINIT_FUNC
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001332initgc(void)
1333{
1334 PyObject *m;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001335
1336 m = Py_InitModule4("gc",
1337 GcMethods,
1338 gc__doc__,
1339 NULL,
1340 PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00001341 if (m == NULL)
1342 return;
Tim Peters11558872003-04-06 23:30:52 +00001343
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001344 if (garbage == NULL) {
1345 garbage = PyList_New(0);
Tim Peters11558872003-04-06 23:30:52 +00001346 if (garbage == NULL)
1347 return;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001348 }
Neil Schemenauer3b1cbf92005-06-18 17:37:06 +00001349 Py_INCREF(garbage);
Tim Peters11558872003-04-06 23:30:52 +00001350 if (PyModule_AddObject(m, "garbage", garbage) < 0)
1351 return;
Neal Norwitz57a03612006-04-26 05:34:03 +00001352
1353 /* Importing can't be done in collect() because collect()
1354 * can be called via PyGC_Collect() in Py_Finalize().
1355 * This wouldn't be a problem, except that <initialized> is
1356 * reset to 0 before calling collect which trips up
1357 * the import and triggers an assertion.
1358 */
1359 if (tmod == NULL) {
Christian Heimes000a0742008-01-03 22:16:32 +00001360 tmod = PyImport_ImportModuleNoBlock("time");
Neal Norwitz57a03612006-04-26 05:34:03 +00001361 if (tmod == NULL)
1362 PyErr_Clear();
1363 }
1364
Tim Peters11558872003-04-06 23:30:52 +00001365#define ADD_INT(NAME) if (PyModule_AddIntConstant(m, #NAME, NAME) < 0) return
1366 ADD_INT(DEBUG_STATS);
1367 ADD_INT(DEBUG_COLLECTABLE);
1368 ADD_INT(DEBUG_UNCOLLECTABLE);
1369 ADD_INT(DEBUG_INSTANCES);
1370 ADD_INT(DEBUG_OBJECTS);
1371 ADD_INT(DEBUG_SAVEALL);
1372 ADD_INT(DEBUG_LEAK);
1373#undef ADD_INT
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001374}
1375
Guido van Rossume13ddc92003-04-17 17:29:22 +00001376/* API to invoke gc.collect() from C */
Neal Norwitz7b216c52006-03-04 20:01:53 +00001377Py_ssize_t
Guido van Rossume13ddc92003-04-17 17:29:22 +00001378PyGC_Collect(void)
1379{
Neal Norwitz7b216c52006-03-04 20:01:53 +00001380 Py_ssize_t n;
Guido van Rossume13ddc92003-04-17 17:29:22 +00001381
1382 if (collecting)
1383 n = 0; /* already collecting, don't do anything */
1384 else {
1385 collecting = 1;
1386 n = collect(NUM_GENERATIONS - 1);
1387 collecting = 0;
1388 }
1389
1390 return n;
1391}
1392
Neil Schemenauer43411b52001-08-30 00:05:51 +00001393/* for debugging */
Guido van Rossume13ddc92003-04-17 17:29:22 +00001394void
1395_PyGC_Dump(PyGC_Head *g)
Neil Schemenauer43411b52001-08-30 00:05:51 +00001396{
1397 _PyObject_Dump(FROM_GC(g));
1398}
1399
Neil Schemenauer43411b52001-08-30 00:05:51 +00001400/* extension modules might be compiled with GC support so these
1401 functions must always be available */
1402
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001403#undef PyObject_GC_Track
1404#undef PyObject_GC_UnTrack
1405#undef PyObject_GC_Del
1406#undef _PyObject_GC_Malloc
1407
Neil Schemenauer43411b52001-08-30 00:05:51 +00001408void
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001409PyObject_GC_Track(void *op)
Neil Schemenauer43411b52001-08-30 00:05:51 +00001410{
1411 _PyObject_GC_TRACK(op);
1412}
1413
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001414/* for binary compatibility with 2.2 */
Neil Schemenauer43411b52001-08-30 00:05:51 +00001415void
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001416_PyObject_GC_Track(PyObject *op)
1417{
1418 PyObject_GC_Track(op);
1419}
1420
1421void
1422PyObject_GC_UnTrack(void *op)
Neil Schemenauer43411b52001-08-30 00:05:51 +00001423{
Tim Peters803526b2002-07-07 05:13:56 +00001424 /* Obscure: the Py_TRASHCAN mechanism requires that we be able to
1425 * call PyObject_GC_UnTrack twice on an object.
1426 */
Neil Schemenauera2b11ec2002-05-21 15:53:24 +00001427 if (IS_TRACKED(op))
Guido van Rossumff413af2002-03-28 20:34:59 +00001428 _PyObject_GC_UNTRACK(op);
Neil Schemenauer43411b52001-08-30 00:05:51 +00001429}
1430
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001431/* for binary compatibility with 2.2 */
1432void
1433_PyObject_GC_UnTrack(PyObject *op)
1434{
1435 PyObject_GC_UnTrack(op);
1436}
1437
Neil Schemenauer43411b52001-08-30 00:05:51 +00001438PyObject *
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001439_PyObject_GC_Malloc(size_t basicsize)
Neil Schemenauer43411b52001-08-30 00:05:51 +00001440{
1441 PyObject *op;
Neal Norwitze7d8be82008-07-31 17:17:14 +00001442 PyGC_Head *g;
1443 if (basicsize > PY_SSIZE_T_MAX - sizeof(PyGC_Head))
1444 return PyErr_NoMemory();
1445 g = (PyGC_Head *)PyObject_MALLOC(
Anthony Baxter64182fe2006-04-11 12:14:09 +00001446 sizeof(PyGC_Head) + basicsize);
Neil Schemenauer43411b52001-08-30 00:05:51 +00001447 if (g == NULL)
Jeremy Hylton8a135182002-06-06 23:23:55 +00001448 return PyErr_NoMemory();
Tim Petersea405632002-07-02 00:52:30 +00001449 g->gc.gc_refs = GC_UNTRACKED;
Neil Schemenauer2880ae52002-05-04 05:35:20 +00001450 generations[0].count++; /* number of allocated GC objects */
1451 if (generations[0].count > generations[0].threshold &&
Neil Schemenauer43411b52001-08-30 00:05:51 +00001452 enabled &&
Neil Schemenauer2880ae52002-05-04 05:35:20 +00001453 generations[0].threshold &&
Neil Schemenauer43411b52001-08-30 00:05:51 +00001454 !collecting &&
1455 !PyErr_Occurred()) {
1456 collecting = 1;
Neil Schemenauer2880ae52002-05-04 05:35:20 +00001457 collect_generations();
Neil Schemenauer43411b52001-08-30 00:05:51 +00001458 collecting = 0;
1459 }
1460 op = FROM_GC(g);
Neil Schemenauer43411b52001-08-30 00:05:51 +00001461 return op;
1462}
1463
1464PyObject *
1465_PyObject_GC_New(PyTypeObject *tp)
1466{
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001467 PyObject *op = _PyObject_GC_Malloc(_PyObject_SIZE(tp));
Tim Petersfa8efab2002-04-28 01:57:25 +00001468 if (op != NULL)
1469 op = PyObject_INIT(op, tp);
1470 return op;
Neil Schemenauer43411b52001-08-30 00:05:51 +00001471}
1472
1473PyVarObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001474_PyObject_GC_NewVar(PyTypeObject *tp, Py_ssize_t nitems)
Neil Schemenauer43411b52001-08-30 00:05:51 +00001475{
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001476 const size_t size = _PyObject_VAR_SIZE(tp, nitems);
1477 PyVarObject *op = (PyVarObject *) _PyObject_GC_Malloc(size);
Tim Petersfa8efab2002-04-28 01:57:25 +00001478 if (op != NULL)
1479 op = PyObject_INIT_VAR(op, tp, nitems);
1480 return op;
Neil Schemenauer43411b52001-08-30 00:05:51 +00001481}
1482
1483PyVarObject *
Martin v. Löwis41290682006-02-16 14:56:14 +00001484_PyObject_GC_Resize(PyVarObject *op, Py_ssize_t nitems)
Neil Schemenauer43411b52001-08-30 00:05:51 +00001485{
Christian Heimese93237d2007-12-19 02:37:44 +00001486 const size_t basicsize = _PyObject_VAR_SIZE(Py_TYPE(op), nitems);
Neil Schemenauer43411b52001-08-30 00:05:51 +00001487 PyGC_Head *g = AS_GC(op);
Neal Norwitze7d8be82008-07-31 17:17:14 +00001488 if (basicsize > PY_SSIZE_T_MAX - sizeof(PyGC_Head))
1489 return (PyVarObject *)PyErr_NoMemory();
Anthony Baxter64182fe2006-04-11 12:14:09 +00001490 g = (PyGC_Head *)PyObject_REALLOC(g, sizeof(PyGC_Head) + basicsize);
Neil Schemenauer43411b52001-08-30 00:05:51 +00001491 if (g == NULL)
1492 return (PyVarObject *)PyErr_NoMemory();
1493 op = (PyVarObject *) FROM_GC(g);
Christian Heimese93237d2007-12-19 02:37:44 +00001494 Py_SIZE(op) = nitems;
Neil Schemenauer43411b52001-08-30 00:05:51 +00001495 return op;
1496}
1497
1498void
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001499PyObject_GC_Del(void *op)
Neil Schemenauer43411b52001-08-30 00:05:51 +00001500{
Neil Schemenauer43411b52001-08-30 00:05:51 +00001501 PyGC_Head *g = AS_GC(op);
Neil Schemenauera2b11ec2002-05-21 15:53:24 +00001502 if (IS_TRACKED(op))
Neil Schemenauer43411b52001-08-30 00:05:51 +00001503 gc_list_remove(g);
Neil Schemenauer2880ae52002-05-04 05:35:20 +00001504 if (generations[0].count > 0) {
1505 generations[0].count--;
Neil Schemenauer43411b52001-08-30 00:05:51 +00001506 }
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001507 PyObject_FREE(g);
Neil Schemenauer43411b52001-08-30 00:05:51 +00001508}
1509
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001510/* for binary compatibility with 2.2 */
1511#undef _PyObject_GC_Del
1512void
1513_PyObject_GC_Del(PyObject *op)
1514{
1515 PyObject_GC_Del(op);
1516}