blob: 659ee038100b88374c4c2269605e476add8972ca [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"
22
Neil Schemenauer43411b52001-08-30 00:05:51 +000023/* Get an object's GC head */
24#define AS_GC(o) ((PyGC_Head *)(o)-1)
25
26/* Get the object given the GC head */
27#define FROM_GC(g) ((PyObject *)(((PyGC_Head *)g)+1))
28
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000029/*** Global GC state ***/
30
Neil Schemenauer2880ae52002-05-04 05:35:20 +000031struct gc_generation {
32 PyGC_Head head;
33 int threshold; /* collection threshold */
34 int count; /* count of allocations or collections of younger
35 generations */
36};
37
38#define NUM_GENERATIONS 3
39#define GEN_HEAD(n) (&generations[n].head)
40
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000041/* linked lists of container objects */
Neil Schemenauer2880ae52002-05-04 05:35:20 +000042static struct gc_generation generations[NUM_GENERATIONS] = {
43 /* PyGC_Head, threshold, count */
44 {{{GEN_HEAD(0), GEN_HEAD(0), 0}}, 700, 0},
45 {{{GEN_HEAD(1), GEN_HEAD(1), 0}}, 10, 0},
46 {{{GEN_HEAD(2), GEN_HEAD(2), 0}}, 10, 0},
47};
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000048
Neil Schemenauer2880ae52002-05-04 05:35:20 +000049PyGC_Head *_PyGC_generation0 = GEN_HEAD(0);
50
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +000051static int enabled = 1; /* automatic collection enabled? */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000052
Neil Schemenauer43411b52001-08-30 00:05:51 +000053/* true if we are currently running the collector */
54static int collecting;
55
Tim Peters6fc13d92002-07-02 18:12:35 +000056/* list of uncollectable objects */
57static PyObject *garbage;
58
59/* Python string to use if unhandled exception occurs */
60static PyObject *gc_str;
61
Jeremy Hyltonce136e92003-04-04 19:59:06 +000062/* Python string used to looked for __del__ attribute. */
63static PyObject *delstr;
64
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000065/* set for debugging information */
66#define DEBUG_STATS (1<<0) /* print collection statistics */
67#define DEBUG_COLLECTABLE (1<<1) /* print collectable objects */
68#define DEBUG_UNCOLLECTABLE (1<<2) /* print uncollectable objects */
69#define DEBUG_INSTANCES (1<<3) /* print instances */
70#define DEBUG_OBJECTS (1<<4) /* print other objects */
Neil Schemenauer544de1e2000-09-22 15:22:38 +000071#define DEBUG_SAVEALL (1<<5) /* save all garbage in gc.garbage */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000072#define DEBUG_LEAK DEBUG_COLLECTABLE | \
73 DEBUG_UNCOLLECTABLE | \
74 DEBUG_INSTANCES | \
Neil Schemenauer544de1e2000-09-22 15:22:38 +000075 DEBUG_OBJECTS | \
76 DEBUG_SAVEALL
Jeremy Hyltonb709df32000-09-01 02:47:25 +000077static int debug;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000078
Tim Peters6fc13d92002-07-02 18:12:35 +000079/*--------------------------------------------------------------------------
80gc_refs values.
Neil Schemenauer43411b52001-08-30 00:05:51 +000081
Tim Peters6fc13d92002-07-02 18:12:35 +000082Between collections, every gc'ed object has one of two gc_refs values:
83
84GC_UNTRACKED
85 The initial state; objects returned by PyObject_GC_Malloc are in this
86 state. The object doesn't live in any generation list, and its
87 tp_traverse slot must not be called.
88
89GC_REACHABLE
90 The object lives in some generation list, and its tp_traverse is safe to
91 call. An object transitions to GC_REACHABLE when PyObject_GC_Track
92 is called.
93
94During a collection, gc_refs can temporarily take on other states:
95
96>= 0
97 At the start of a collection, update_refs() copies the true refcount
98 to gc_refs, for each object in the generation being collected.
99 subtract_refs() then adjusts gc_refs so that it equals the number of
100 times an object is referenced directly from outside the generation
101 being collected.
Martin v. Löwis774348c2002-11-09 19:54:06 +0000102 gc_refs remains >= 0 throughout these steps.
Tim Peters6fc13d92002-07-02 18:12:35 +0000103
104GC_TENTATIVELY_UNREACHABLE
105 move_unreachable() then moves objects not reachable (whether directly or
106 indirectly) from outside the generation into an "unreachable" set.
107 Objects that are found to be reachable have gc_refs set to GC_REACHABLE
108 again. Objects that are found to be unreachable have gc_refs set to
109 GC_TENTATIVELY_UNREACHABLE. It's "tentatively" because the pass doing
110 this can't be sure until it ends, and GC_TENTATIVELY_UNREACHABLE may
111 transition back to GC_REACHABLE.
112
113 Only objects with GC_TENTATIVELY_UNREACHABLE still set are candidates
114 for collection. If it's decided not to collect such an object (e.g.,
115 it has a __del__ method), its gc_refs is restored to GC_REACHABLE again.
116----------------------------------------------------------------------------
117*/
Tim Petersea405632002-07-02 00:52:30 +0000118#define GC_UNTRACKED _PyGC_REFS_UNTRACKED
119#define GC_REACHABLE _PyGC_REFS_REACHABLE
120#define GC_TENTATIVELY_UNREACHABLE _PyGC_REFS_TENTATIVELY_UNREACHABLE
Tim Peters19b74c72002-07-01 03:52:19 +0000121
Tim Peters6fc13d92002-07-02 18:12:35 +0000122#define IS_TRACKED(o) ((AS_GC(o))->gc.gc_refs != GC_UNTRACKED)
Tim Peters19b74c72002-07-01 03:52:19 +0000123#define IS_REACHABLE(o) ((AS_GC(o))->gc.gc_refs == GC_REACHABLE)
124#define IS_TENTATIVELY_UNREACHABLE(o) ( \
125 (AS_GC(o))->gc.gc_refs == GC_TENTATIVELY_UNREACHABLE)
Neil Schemenauera2b11ec2002-05-21 15:53:24 +0000126
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000127/*** list functions ***/
128
129static void
130gc_list_init(PyGC_Head *list)
131{
Tim Peters9e4ca102001-10-11 18:31:31 +0000132 list->gc.gc_prev = list;
133 list->gc.gc_next = list;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000134}
135
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000136static int
137gc_list_is_empty(PyGC_Head *list)
138{
139 return (list->gc.gc_next == list);
140}
141
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000142static void
143gc_list_append(PyGC_Head *node, PyGC_Head *list)
144{
Tim Peters9e4ca102001-10-11 18:31:31 +0000145 node->gc.gc_next = list;
146 node->gc.gc_prev = list->gc.gc_prev;
147 node->gc.gc_prev->gc.gc_next = node;
148 list->gc.gc_prev = node;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000149}
150
151static void
152gc_list_remove(PyGC_Head *node)
153{
Tim Peters9e4ca102001-10-11 18:31:31 +0000154 node->gc.gc_prev->gc.gc_next = node->gc.gc_next;
155 node->gc.gc_next->gc.gc_prev = node->gc.gc_prev;
156 node->gc.gc_next = NULL; /* object is not currently tracked */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000157}
158
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000159/* append a list onto another list, from becomes an empty list */
160static void
161gc_list_merge(PyGC_Head *from, PyGC_Head *to)
162{
163 PyGC_Head *tail;
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000164 if (!gc_list_is_empty(from)) {
Tim Peters9e4ca102001-10-11 18:31:31 +0000165 tail = to->gc.gc_prev;
166 tail->gc.gc_next = from->gc.gc_next;
167 tail->gc.gc_next->gc.gc_prev = tail;
168 to->gc.gc_prev = from->gc.gc_prev;
169 to->gc.gc_prev->gc.gc_next = to;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000170 }
171 gc_list_init(from);
172}
173
174static long
175gc_list_size(PyGC_Head *list)
176{
177 PyGC_Head *gc;
178 long n = 0;
Tim Peters9e4ca102001-10-11 18:31:31 +0000179 for (gc = list->gc.gc_next; gc != list; gc = gc->gc.gc_next) {
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000180 n++;
181 }
182 return n;
183}
184
185/*** end of list stuff ***/
186
187
Tim Peters19b74c72002-07-01 03:52:19 +0000188/* Set all gc_refs = ob_refcnt. After this, gc_refs is > 0 for all objects
189 * in containers, and is GC_REACHABLE for all tracked gc objects not in
190 * containers.
Tim Peters88396172002-06-30 17:56:40 +0000191 */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000192static void
193update_refs(PyGC_Head *containers)
194{
Tim Peters9e4ca102001-10-11 18:31:31 +0000195 PyGC_Head *gc = containers->gc.gc_next;
Tim Petersea405632002-07-02 00:52:30 +0000196 for (; gc != containers; gc = gc->gc.gc_next) {
197 assert(gc->gc.gc_refs == GC_REACHABLE);
Tim Peters9e4ca102001-10-11 18:31:31 +0000198 gc->gc.gc_refs = FROM_GC(gc)->ob_refcnt;
Tim Petersea405632002-07-02 00:52:30 +0000199 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000200}
201
Tim Peters19b74c72002-07-01 03:52:19 +0000202/* A traversal callback for subtract_refs. */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000203static int
204visit_decref(PyObject *op, void *data)
205{
Tim Peters93cd83e2002-06-30 21:31:03 +0000206 assert(op != NULL);
Tim Peters19b74c72002-07-01 03:52:19 +0000207 if (PyObject_IS_GC(op)) {
208 PyGC_Head *gc = AS_GC(op);
209 /* We're only interested in gc_refs for objects in the
210 * generation being collected, which can be recognized
211 * because only they have positive gc_refs.
212 */
Tim Petersaab713b2002-07-02 22:15:28 +0000213 assert(gc->gc.gc_refs != 0); /* else refcount was too small */
Tim Peters19b74c72002-07-01 03:52:19 +0000214 if (gc->gc.gc_refs > 0)
215 gc->gc.gc_refs--;
216 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000217 return 0;
218}
219
Tim Peters19b74c72002-07-01 03:52:19 +0000220/* Subtract internal references from gc_refs. After this, gc_refs is >= 0
221 * for all objects in containers, and is GC_REACHABLE for all tracked gc
222 * objects not in containers. The ones with gc_refs > 0 are directly
223 * reachable from outside containers, and so can't be collected.
224 */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000225static void
226subtract_refs(PyGC_Head *containers)
227{
228 traverseproc traverse;
Tim Peters9e4ca102001-10-11 18:31:31 +0000229 PyGC_Head *gc = containers->gc.gc_next;
230 for (; gc != containers; gc=gc->gc.gc_next) {
Neil Schemenauer43411b52001-08-30 00:05:51 +0000231 traverse = FROM_GC(gc)->ob_type->tp_traverse;
232 (void) traverse(FROM_GC(gc),
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000233 (visitproc)visit_decref,
234 NULL);
235 }
236}
237
Tim Peters19b74c72002-07-01 03:52:19 +0000238/* A traversal callback for move_unreachable. */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000239static int
Tim Peters19b74c72002-07-01 03:52:19 +0000240visit_reachable(PyObject *op, PyGC_Head *reachable)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000241{
Tim Petersea405632002-07-02 00:52:30 +0000242 if (PyObject_IS_GC(op)) {
Tim Peters19b74c72002-07-01 03:52:19 +0000243 PyGC_Head *gc = AS_GC(op);
244 const int gc_refs = gc->gc.gc_refs;
245
246 if (gc_refs == 0) {
247 /* This is in move_unreachable's 'young' list, but
248 * the traversal hasn't yet gotten to it. All
249 * we need to do is tell move_unreachable that it's
250 * reachable.
251 */
252 gc->gc.gc_refs = 1;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000253 }
Tim Peters19b74c72002-07-01 03:52:19 +0000254 else if (gc_refs == GC_TENTATIVELY_UNREACHABLE) {
255 /* This had gc_refs = 0 when move_unreachable got
256 * to it, but turns out it's reachable after all.
257 * Move it back to move_unreachable's 'young' list,
258 * and move_unreachable will eventually get to it
259 * again.
260 */
261 gc_list_remove(gc);
262 gc_list_append(gc, reachable);
263 gc->gc.gc_refs = 1;
264 }
265 /* Else there's nothing to do.
266 * If gc_refs > 0, it must be in move_unreachable's 'young'
267 * list, and move_unreachable will eventually get to it.
268 * If gc_refs == GC_REACHABLE, it's either in some other
269 * generation so we don't care about it, or move_unreachable
Tim Peters6fc13d92002-07-02 18:12:35 +0000270 * already dealt with it.
Tim Petersea405632002-07-02 00:52:30 +0000271 * If gc_refs == GC_UNTRACKED, it must be ignored.
Tim Peters19b74c72002-07-01 03:52:19 +0000272 */
Tim Petersea405632002-07-02 00:52:30 +0000273 else {
274 assert(gc_refs > 0
275 || gc_refs == GC_REACHABLE
276 || gc_refs == GC_UNTRACKED);
277 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000278 }
279 return 0;
280}
281
Tim Peters19b74c72002-07-01 03:52:19 +0000282/* Move the unreachable objects from young to unreachable. After this,
283 * all objects in young have gc_refs = GC_REACHABLE, and all objects in
284 * unreachable have gc_refs = GC_TENTATIVELY_UNREACHABLE. All tracked
285 * gc objects not in young or unreachable still have gc_refs = GC_REACHABLE.
286 * All objects in young after this are directly or indirectly reachable
287 * from outside the original young; and all objects in unreachable are
288 * not.
Tim Peters88396172002-06-30 17:56:40 +0000289 */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000290static void
Tim Peters19b74c72002-07-01 03:52:19 +0000291move_unreachable(PyGC_Head *young, PyGC_Head *unreachable)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000292{
Tim Peters19b74c72002-07-01 03:52:19 +0000293 PyGC_Head *gc = young->gc.gc_next;
294
295 /* Invariants: all objects "to the left" of us in young have gc_refs
296 * = GC_REACHABLE, and are indeed reachable (directly or indirectly)
297 * from outside the young list as it was at entry. All other objects
298 * from the original young "to the left" of us are in unreachable now,
299 * and have gc_refs = GC_TENTATIVELY_UNREACHABLE. All objects to the
300 * left of us in 'young' now have been scanned, and no objects here
301 * or to the right have been scanned yet.
302 */
303
304 while (gc != young) {
305 PyGC_Head *next;
306
Tim Peters6fc13d92002-07-02 18:12:35 +0000307 if (gc->gc.gc_refs) {
308 /* gc is definitely reachable from outside the
309 * original 'young'. Mark it as such, and traverse
310 * its pointers to find any other objects that may
311 * be directly reachable from it. Note that the
312 * call to tp_traverse may append objects to young,
313 * so we have to wait until it returns to determine
314 * the next object to visit.
315 */
316 PyObject *op = FROM_GC(gc);
317 traverseproc traverse = op->ob_type->tp_traverse;
318 assert(gc->gc.gc_refs > 0);
319 gc->gc.gc_refs = GC_REACHABLE;
320 (void) traverse(op,
321 (visitproc)visit_reachable,
322 (void *)young);
323 next = gc->gc.gc_next;
324 }
325 else {
Tim Peters19b74c72002-07-01 03:52:19 +0000326 /* This *may* be unreachable. To make progress,
327 * assume it is. gc isn't directly reachable from
328 * any object we've already traversed, but may be
329 * reachable from an object we haven't gotten to yet.
330 * visit_reachable will eventually move gc back into
331 * young if that's so, and we'll see it again.
332 */
333 next = gc->gc.gc_next;
334 gc_list_remove(gc);
335 gc_list_append(gc, unreachable);
336 gc->gc.gc_refs = GC_TENTATIVELY_UNREACHABLE;
337 }
Tim Peters19b74c72002-07-01 03:52:19 +0000338 gc = next;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000339 }
340}
341
Tim Peters88396172002-06-30 17:56:40 +0000342/* return true if object has a finalization method */
Neil Schemenauera765c122001-11-01 17:35:23 +0000343static int
344has_finalizer(PyObject *op)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000345{
Guido van Rossum40307142002-08-09 17:39:14 +0000346 return PyInstance_Check(op) ? PyObject_HasAttr(op, delstr) :
347 PyType_HasFeature(op->ob_type, Py_TPFLAGS_HEAPTYPE) ?
348 op->ob_type->tp_del != NULL : 0;
Neil Schemenauera765c122001-11-01 17:35:23 +0000349}
350
Jeremy Hyltonce136e92003-04-04 19:59:06 +0000351/* Move all objects out of unreachable and into collectable or finalizers.
352 */
Neil Schemenauera765c122001-11-01 17:35:23 +0000353static void
Jeremy Hyltonce136e92003-04-04 19:59:06 +0000354move_finalizers(PyGC_Head *unreachable, PyGC_Head *collectable,
355 PyGC_Head *finalizers)
Neil Schemenauera765c122001-11-01 17:35:23 +0000356{
Jeremy Hyltonce136e92003-04-04 19:59:06 +0000357 while (!gc_list_is_empty(unreachable)) {
358 PyGC_Head *gc = unreachable->gc.gc_next;
Neil Schemenauer43411b52001-08-30 00:05:51 +0000359 PyObject *op = FROM_GC(gc);
Jeremy Hyltonce136e92003-04-04 19:59:06 +0000360 int finalizer;
361
362 if (PyInstance_Check(op)) {
363 /* The HasAttr() check may run enough Python
364 code to deallocate the object or make it
365 reachable again. INCREF the object before
366 calling HasAttr() to guard against the client
367 code deallocating the object.
368 */
369 Py_INCREF(op);
370 finalizer = PyObject_HasAttr(op, delstr);
371 if (op->ob_refcnt == 1) {
372 /* The object will be deallocated.
373 Nothing left to do.
374 */
375 Py_DECREF(op);
376 continue;
377 }
378 Py_DECREF(op);
379 }
380 else
381 finalizer = has_finalizer(op);
382 if (finalizer) {
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000383 gc_list_remove(gc);
384 gc_list_append(gc, finalizers);
Tim Peters19b74c72002-07-01 03:52:19 +0000385 gc->gc.gc_refs = GC_REACHABLE;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000386 }
Jeremy Hyltonce136e92003-04-04 19:59:06 +0000387 else {
388 gc_list_remove(gc);
389 gc_list_append(gc, collectable);
390 /* XXX change gc_refs? */
391 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000392 }
393}
394
Tim Peters19b74c72002-07-01 03:52:19 +0000395/* A traversal callback for move_finalizer_reachable. */
396static int
397visit_move(PyObject *op, PyGC_Head *tolist)
398{
399 if (PyObject_IS_GC(op)) {
Tim Petersea405632002-07-02 00:52:30 +0000400 if (IS_TENTATIVELY_UNREACHABLE(op)) {
Tim Peters19b74c72002-07-01 03:52:19 +0000401 PyGC_Head *gc = AS_GC(op);
402 gc_list_remove(gc);
403 gc_list_append(gc, tolist);
404 gc->gc.gc_refs = GC_REACHABLE;
405 }
406 }
407 return 0;
408}
409
410/* Move objects that are reachable from finalizers, from the unreachable set
411 * into the finalizers set.
412 */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000413static void
414move_finalizer_reachable(PyGC_Head *finalizers)
415{
416 traverseproc traverse;
Tim Peters9e4ca102001-10-11 18:31:31 +0000417 PyGC_Head *gc = finalizers->gc.gc_next;
418 for (; gc != finalizers; gc=gc->gc.gc_next) {
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000419 /* careful, finalizers list is growing here */
Neil Schemenauer43411b52001-08-30 00:05:51 +0000420 traverse = FROM_GC(gc)->ob_type->tp_traverse;
Tim Peters88396172002-06-30 17:56:40 +0000421 (void) traverse(FROM_GC(gc),
Neil Schemenauer43411b52001-08-30 00:05:51 +0000422 (visitproc)visit_move,
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000423 (void *)finalizers);
424 }
425}
426
427static void
Jeremy Hylton06257772000-08-31 15:10:24 +0000428debug_instance(char *msg, PyInstanceObject *inst)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000429{
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000430 char *cname;
Neil Schemenauera765c122001-11-01 17:35:23 +0000431 /* simple version of instance_repr */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000432 PyObject *classname = inst->in_class->cl_name;
433 if (classname != NULL && PyString_Check(classname))
434 cname = PyString_AsString(classname);
435 else
436 cname = "?";
Jeremy Hylton06257772000-08-31 15:10:24 +0000437 PySys_WriteStderr("gc: %.100s <%.100s instance at %p>\n",
438 msg, cname, inst);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000439}
440
441static void
Jeremy Hylton06257772000-08-31 15:10:24 +0000442debug_cycle(char *msg, PyObject *op)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000443{
444 if ((debug & DEBUG_INSTANCES) && PyInstance_Check(op)) {
Jeremy Hylton06257772000-08-31 15:10:24 +0000445 debug_instance(msg, (PyInstanceObject *)op);
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000446 }
447 else if (debug & DEBUG_OBJECTS) {
Jeremy Hylton06257772000-08-31 15:10:24 +0000448 PySys_WriteStderr("gc: %.100s <%.100s %p>\n",
449 msg, op->ob_type->tp_name, op);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000450 }
451}
452
453/* Handle uncollectable garbage (cycles with finalizers). */
454static void
455handle_finalizers(PyGC_Head *finalizers, PyGC_Head *old)
456{
457 PyGC_Head *gc;
458 if (garbage == NULL) {
459 garbage = PyList_New(0);
460 }
Tim Peters9e4ca102001-10-11 18:31:31 +0000461 for (gc = finalizers->gc.gc_next; gc != finalizers;
462 gc = finalizers->gc.gc_next) {
Neil Schemenauer43411b52001-08-30 00:05:51 +0000463 PyObject *op = FROM_GC(gc);
Jeremy Hyltonce136e92003-04-04 19:59:06 +0000464 /* XXX has_finalizer() is not safe here. */
Neil Schemenauera765c122001-11-01 17:35:23 +0000465 if ((debug & DEBUG_SAVEALL) || has_finalizer(op)) {
466 /* If SAVEALL is not set then just append objects with
467 * finalizers to the list of garbage. All objects in
468 * the finalizers list are reachable from those
Tim Peters19b74c72002-07-01 03:52:19 +0000469 * objects.
470 */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000471 PyList_Append(garbage, op);
472 }
Tim Peters88396172002-06-30 17:56:40 +0000473 /* object is now reachable again */
Tim Peters19b74c72002-07-01 03:52:19 +0000474 assert(IS_REACHABLE(op));
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000475 gc_list_remove(gc);
476 gc_list_append(gc, old);
477 }
478}
479
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000480/* Break reference cycles by clearing the containers involved. This is
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000481 * tricky business as the lists can be changing and we don't know which
Tim Peters19b74c72002-07-01 03:52:19 +0000482 * objects may be freed. It is possible I screwed something up here.
483 */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000484static void
Jeremy Hyltonce136e92003-04-04 19:59:06 +0000485delete_garbage(PyGC_Head *collectable, PyGC_Head *old)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000486{
487 inquiry clear;
488
Jeremy Hyltonce136e92003-04-04 19:59:06 +0000489 while (!gc_list_is_empty(collectable)) {
490 PyGC_Head *gc = collectable->gc.gc_next;
Neil Schemenauer43411b52001-08-30 00:05:51 +0000491 PyObject *op = FROM_GC(gc);
Tim Peters88396172002-06-30 17:56:40 +0000492
Tim Peters19b74c72002-07-01 03:52:19 +0000493 assert(IS_TENTATIVELY_UNREACHABLE(op));
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000494 if (debug & DEBUG_SAVEALL) {
495 PyList_Append(garbage, op);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000496 }
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000497 else {
498 if ((clear = op->ob_type->tp_clear) != NULL) {
499 Py_INCREF(op);
Jeremy Hylton8a135182002-06-06 23:23:55 +0000500 clear(op);
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000501 Py_DECREF(op);
502 }
503 }
Jeremy Hyltonce136e92003-04-04 19:59:06 +0000504 if (collectable->gc.gc_next == gc) {
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000505 /* object is still alive, move it, it may die later */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000506 gc_list_remove(gc);
507 gc_list_append(gc, old);
Tim Peters19b74c72002-07-01 03:52:19 +0000508 gc->gc.gc_refs = GC_REACHABLE;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000509 }
510 }
511}
512
513/* This is the main function. Read this to understand how the
514 * collection process works. */
515static long
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000516collect(int generation)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000517{
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000518 int i;
Tim Peters19b74c72002-07-01 03:52:19 +0000519 long m = 0; /* # objects collected */
520 long n = 0; /* # unreachable objects that couldn't be collected */
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000521 PyGC_Head *young; /* the generation we are examining */
522 PyGC_Head *old; /* next older generation */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000523 PyGC_Head unreachable;
Jeremy Hyltonce136e92003-04-04 19:59:06 +0000524 PyGC_Head collectable;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000525 PyGC_Head finalizers;
526 PyGC_Head *gc;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000527
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000528 if (debug & DEBUG_STATS) {
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000529 PySys_WriteStderr("gc: collecting generation %d...\n",
530 generation);
531 PySys_WriteStderr("gc: objects in each generation:");
532 for (i = 0; i < NUM_GENERATIONS; i++) {
533 PySys_WriteStderr(" %ld", gc_list_size(GEN_HEAD(i)));
534 }
535 PySys_WriteStderr("\n");
536 }
537
538 /* update collection and allocation counters */
539 if (generation+1 < NUM_GENERATIONS)
540 generations[generation+1].count += 1;
541 for (i = 0; i <= generation; i++)
Neil Schemenauerc9051642002-06-28 19:16:04 +0000542 generations[i].count = 0;
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000543
544 /* merge younger generations with one we are currently collecting */
545 for (i = 0; i < generation; i++) {
546 gc_list_merge(GEN_HEAD(i), GEN_HEAD(generation));
547 }
548
549 /* handy references */
550 young = GEN_HEAD(generation);
Tim Peters19b74c72002-07-01 03:52:19 +0000551 if (generation < NUM_GENERATIONS-1)
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000552 old = GEN_HEAD(generation+1);
Tim Peters19b74c72002-07-01 03:52:19 +0000553 else
554 old = young;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000555
556 /* Using ob_refcnt and gc_refs, calculate which objects in the
557 * container set are reachable from outside the set (ie. have a
558 * refcount greater than 0 when all the references within the
Tim Peters19b74c72002-07-01 03:52:19 +0000559 * set are taken into account
560 */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000561 update_refs(young);
562 subtract_refs(young);
563
Tim Peters19b74c72002-07-01 03:52:19 +0000564 /* Leave everything reachable from outside young in young, and move
565 * everything else (in young) to unreachable.
566 * NOTE: This used to move the reachable objects into a reachable
567 * set instead. But most things usually turn out to be reachable,
568 * so it's more efficient to move the unreachable things.
569 */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000570 gc_list_init(&unreachable);
Tim Peters19b74c72002-07-01 03:52:19 +0000571 move_unreachable(young, &unreachable);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000572
Tim Peters19b74c72002-07-01 03:52:19 +0000573 /* Move reachable objects to next generation. */
574 if (young != old)
575 gc_list_merge(young, old);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000576
Tim Peters19b74c72002-07-01 03:52:19 +0000577 /* All objects in unreachable are trash, but objects reachable from
578 * finalizers can't safely be deleted. Python programmers should take
579 * care not to create such things. For Python, finalizers means
580 * instance objects with __del__ methods.
Jeremy Hyltonce136e92003-04-04 19:59:06 +0000581 *
582 * Move each object into the collectable set or the finalizers set.
583 * It's possible that a classic class with a getattr() hook will
584 * be revived or deallocated in this step.
Tim Peters19b74c72002-07-01 03:52:19 +0000585 */
Jeremy Hyltonce136e92003-04-04 19:59:06 +0000586 gc_list_init(&collectable);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000587 gc_list_init(&finalizers);
Jeremy Hyltonce136e92003-04-04 19:59:06 +0000588 move_finalizers(&unreachable, &collectable, &finalizers);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000589 move_finalizer_reachable(&finalizers);
590
591 /* Collect statistics on collectable objects found and print
592 * debugging information. */
Jeremy Hyltonce136e92003-04-04 19:59:06 +0000593 for (gc = collectable.gc.gc_next; gc != &collectable;
Tim Peters9e4ca102001-10-11 18:31:31 +0000594 gc = gc->gc.gc_next) {
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000595 m++;
Jeremy Hylton06257772000-08-31 15:10:24 +0000596 if (debug & DEBUG_COLLECTABLE) {
Neil Schemenauer43411b52001-08-30 00:05:51 +0000597 debug_cycle("collectable", FROM_GC(gc));
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000598 }
599 }
Tim Peters19b74c72002-07-01 03:52:19 +0000600 /* Call tp_clear on objects in the collectable set. This will cause
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000601 * the reference cycles to be broken. It may also cause some objects in
602 * finalizers to be freed */
Jeremy Hyltonce136e92003-04-04 19:59:06 +0000603 delete_garbage(&collectable, old);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000604
605 /* Collect statistics on uncollectable objects found and print
606 * debugging information. */
Tim Peters9e4ca102001-10-11 18:31:31 +0000607 for (gc = finalizers.gc.gc_next; gc != &finalizers;
608 gc = gc->gc.gc_next) {
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000609 n++;
Jeremy Hylton06257772000-08-31 15:10:24 +0000610 if (debug & DEBUG_UNCOLLECTABLE) {
Neil Schemenauer43411b52001-08-30 00:05:51 +0000611 debug_cycle("uncollectable", FROM_GC(gc));
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000612 }
613 }
Jeremy Hylton06257772000-08-31 15:10:24 +0000614 if (debug & DEBUG_STATS) {
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000615 if (m == 0 && n == 0) {
Jeremy Hylton06257772000-08-31 15:10:24 +0000616 PySys_WriteStderr("gc: done.\n");
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000617 }
618 else {
Jeremy Hylton06257772000-08-31 15:10:24 +0000619 PySys_WriteStderr(
620 "gc: done, %ld unreachable, %ld uncollectable.\n",
621 n+m, n);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000622 }
623 }
624
625 /* Append instances in the uncollectable set to a Python
626 * reachable list of garbage. The programmer has to deal with
627 * this if they insist on creating this type of structure. */
628 handle_finalizers(&finalizers, old);
629
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000630 if (PyErr_Occurred()) {
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000631 if (gc_str == NULL) {
632 gc_str = PyString_FromString("garbage collection");
633 }
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000634 PyErr_WriteUnraisable(gc_str);
635 Py_FatalError("unexpected exception during garbage collection");
636 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000637 return n+m;
638}
639
640static long
641collect_generations(void)
642{
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000643 int i;
Vladimir Marangozovb16714b2000-07-10 05:37:39 +0000644 long n = 0;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000645
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000646 /* Find the oldest generation (higest numbered) where the count
647 * exceeds the threshold. Objects in the that generation and
648 * generations younger than it will be collected. */
649 for (i = NUM_GENERATIONS-1; i >= 0; i--) {
650 if (generations[i].count > generations[i].threshold) {
651 n = collect(i);
652 break;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000653 }
654 }
655 return n;
656}
657
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000658PyDoc_STRVAR(gc_enable__doc__,
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000659"enable() -> None\n"
660"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000661"Enable automatic garbage collection.\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000662
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000663static PyObject *
664gc_enable(PyObject *self, PyObject *args)
665{
666
667 if (!PyArg_ParseTuple(args, ":enable")) /* check no args */
668 return NULL;
669
670 enabled = 1;
671
672 Py_INCREF(Py_None);
673 return Py_None;
674}
675
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000676PyDoc_STRVAR(gc_disable__doc__,
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000677"disable() -> None\n"
678"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000679"Disable automatic garbage collection.\n");
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000680
681static PyObject *
682gc_disable(PyObject *self, PyObject *args)
683{
684
685 if (!PyArg_ParseTuple(args, ":disable")) /* check no args */
686 return NULL;
687
688 enabled = 0;
689
690 Py_INCREF(Py_None);
691 return Py_None;
692}
693
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000694PyDoc_STRVAR(gc_isenabled__doc__,
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000695"isenabled() -> status\n"
696"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000697"Returns true if automatic garbage collection is enabled.\n");
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000698
699static PyObject *
700gc_isenabled(PyObject *self, PyObject *args)
701{
702
703 if (!PyArg_ParseTuple(args, ":isenabled")) /* check no args */
704 return NULL;
705
706 return Py_BuildValue("i", enabled);
707}
708
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000709PyDoc_STRVAR(gc_collect__doc__,
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000710"collect() -> n\n"
711"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000712"Run a full collection. The number of unreachable objects is returned.\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000713
714static PyObject *
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000715gc_collect(PyObject *self, PyObject *args)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000716{
717 long n;
718
Fred Drakecc1be242000-07-12 04:42:23 +0000719 if (!PyArg_ParseTuple(args, ":collect")) /* check no args */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000720 return NULL;
721
Neil Schemenauere8c40cb2001-10-31 23:09:35 +0000722 if (collecting) {
723 n = 0; /* already collecting, don't do anything */
724 }
725 else {
726 collecting = 1;
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000727 n = collect(NUM_GENERATIONS - 1);
Neil Schemenauere8c40cb2001-10-31 23:09:35 +0000728 collecting = 0;
729 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000730
Neil Schemenauer7760cff2000-09-22 22:35:36 +0000731 return Py_BuildValue("l", n);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000732}
733
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000734PyDoc_STRVAR(gc_set_debug__doc__,
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000735"set_debug(flags) -> None\n"
736"\n"
737"Set the garbage collection debugging flags. Debugging information is\n"
738"written to sys.stderr.\n"
739"\n"
740"flags is an integer and can have the following bits turned on:\n"
741"\n"
742" DEBUG_STATS - Print statistics during collection.\n"
743" DEBUG_COLLECTABLE - Print collectable objects found.\n"
744" DEBUG_UNCOLLECTABLE - Print unreachable but uncollectable objects found.\n"
745" DEBUG_INSTANCES - Print instance objects.\n"
746" DEBUG_OBJECTS - Print objects other than instances.\n"
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000747" DEBUG_SAVEALL - Save objects to gc.garbage rather than freeing them.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000748" DEBUG_LEAK - Debug leaking programs (everything but STATS).\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000749
750static PyObject *
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000751gc_set_debug(PyObject *self, PyObject *args)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000752{
Neil Schemenauer7760cff2000-09-22 22:35:36 +0000753 if (!PyArg_ParseTuple(args, "i:set_debug", &debug))
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000754 return NULL;
755
756 Py_INCREF(Py_None);
757 return Py_None;
758}
759
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000760PyDoc_STRVAR(gc_get_debug__doc__,
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000761"get_debug() -> flags\n"
762"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000763"Get the garbage collection debugging flags.\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000764
765static PyObject *
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000766gc_get_debug(PyObject *self, PyObject *args)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000767{
Fred Drakecc1be242000-07-12 04:42:23 +0000768 if (!PyArg_ParseTuple(args, ":get_debug")) /* no args */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000769 return NULL;
770
771 return Py_BuildValue("i", debug);
772}
773
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000774PyDoc_STRVAR(gc_set_thresh__doc__,
Neal Norwitz2a47c0f2002-01-29 00:53:41 +0000775"set_threshold(threshold0, [threshold1, threshold2]) -> None\n"
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000776"\n"
777"Sets the collection thresholds. Setting threshold0 to zero disables\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000778"collection.\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000779
780static PyObject *
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000781gc_set_thresh(PyObject *self, PyObject *args)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000782{
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000783 int i;
784 if (!PyArg_ParseTuple(args, "i|ii:set_threshold",
785 &generations[0].threshold,
786 &generations[1].threshold,
787 &generations[2].threshold))
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000788 return NULL;
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000789 for (i = 2; i < NUM_GENERATIONS; i++) {
790 /* generations higher than 2 get the same threshold */
791 generations[i].threshold = generations[2].threshold;
792 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000793
794 Py_INCREF(Py_None);
795 return Py_None;
796}
797
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000798PyDoc_STRVAR(gc_get_thresh__doc__,
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000799"get_threshold() -> (threshold0, threshold1, threshold2)\n"
800"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000801"Return the current collection thresholds\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000802
803static PyObject *
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000804gc_get_thresh(PyObject *self, PyObject *args)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000805{
Fred Drakecc1be242000-07-12 04:42:23 +0000806 if (!PyArg_ParseTuple(args, ":get_threshold")) /* no args */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000807 return NULL;
808
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000809 return Py_BuildValue("(iii)",
810 generations[0].threshold,
811 generations[1].threshold,
812 generations[2].threshold);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000813}
814
Neil Schemenauer48c70342001-08-09 15:38:31 +0000815static int
Martin v. Löwis560da622001-11-24 09:24:51 +0000816referrersvisit(PyObject* obj, PyObject *objs)
Neil Schemenauer48c70342001-08-09 15:38:31 +0000817{
Martin v. Löwisc8fe77b2001-11-29 18:08:31 +0000818 int i;
819 for (i = 0; i < PyTuple_GET_SIZE(objs); i++)
820 if (PyTuple_GET_ITEM(objs, i) == obj)
821 return 1;
Neil Schemenauer48c70342001-08-09 15:38:31 +0000822 return 0;
823}
824
Neil Schemenauer17e7be62001-08-10 14:46:47 +0000825static int
Martin v. Löwis560da622001-11-24 09:24:51 +0000826gc_referrers_for(PyObject *objs, PyGC_Head *list, PyObject *resultlist)
Neil Schemenauer48c70342001-08-09 15:38:31 +0000827{
828 PyGC_Head *gc;
829 PyObject *obj;
830 traverseproc traverse;
Tim Peters9e4ca102001-10-11 18:31:31 +0000831 for (gc = list->gc.gc_next; gc != list; gc = gc->gc.gc_next) {
Neil Schemenauer43411b52001-08-30 00:05:51 +0000832 obj = FROM_GC(gc);
Neil Schemenauer48c70342001-08-09 15:38:31 +0000833 traverse = obj->ob_type->tp_traverse;
834 if (obj == objs || obj == resultlist)
835 continue;
Martin v. Löwis560da622001-11-24 09:24:51 +0000836 if (traverse(obj, (visitproc)referrersvisit, objs)) {
Neil Schemenauer17e7be62001-08-10 14:46:47 +0000837 if (PyList_Append(resultlist, obj) < 0)
838 return 0; /* error */
Neil Schemenauer48c70342001-08-09 15:38:31 +0000839 }
840 }
Neil Schemenauer17e7be62001-08-10 14:46:47 +0000841 return 1; /* no error */
Neil Schemenauer48c70342001-08-09 15:38:31 +0000842}
843
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000844PyDoc_STRVAR(gc_get_referrers__doc__,
Martin v. Löwis560da622001-11-24 09:24:51 +0000845"get_referrers(*objs) -> list\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000846Return the list of objects that directly refer to any of objs.");
Neil Schemenauer48c70342001-08-09 15:38:31 +0000847
Neil Schemenauer17e7be62001-08-10 14:46:47 +0000848static PyObject *
Martin v. Löwis560da622001-11-24 09:24:51 +0000849gc_get_referrers(PyObject *self, PyObject *args)
Neil Schemenauer48c70342001-08-09 15:38:31 +0000850{
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000851 int i;
Neil Schemenauer48c70342001-08-09 15:38:31 +0000852 PyObject *result = PyList_New(0);
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000853 for (i = 0; i < NUM_GENERATIONS; i++) {
854 if (!(gc_referrers_for(args, GEN_HEAD(i), result))) {
855 Py_DECREF(result);
856 return NULL;
857 }
Neil Schemenauer17e7be62001-08-10 14:46:47 +0000858 }
Neil Schemenauer48c70342001-08-09 15:38:31 +0000859 return result;
860}
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000861
Jeremy Hylton5bd378b2003-04-03 16:28:38 +0000862static int
863referrentsvisit(PyObject *obj, PyObject *list)
864{
865 if (PyList_Append(list, obj) < 0)
866 return 1;
867 return 0;
868}
869
870PyDoc_STRVAR(gc_get_referrents__doc__,
871"get_referrents(*objs) -> list\n\
Jeremy Hylton059b0942003-04-03 16:29:13 +0000872Return the list of objects that are directly referred to by objs.");
Jeremy Hylton5bd378b2003-04-03 16:28:38 +0000873
874static PyObject *
875gc_get_referrents(PyObject *self, PyObject *args)
876{
877 int i;
878 PyObject *result = PyList_New(0);
879 for (i = 0; i < PyTuple_GET_SIZE(args); i++) {
880 PyObject *obj = PyTuple_GET_ITEM(args, i);
881 traverseproc traverse = obj->ob_type->tp_traverse;
882 if (!traverse)
883 continue;
884 if (traverse(obj, (visitproc)referrentsvisit, result))
885 return NULL;
886 }
887 return result;
888}
889
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000890PyDoc_STRVAR(gc_get_objects__doc__,
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +0000891"get_objects() -> [...]\n"
892"\n"
893"Return a list of objects tracked by the collector (excluding the list\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000894"returned).\n");
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +0000895
896/* appending objects in a GC list to a Python list */
Martin v. Löwis155aad12001-12-02 12:21:34 +0000897static int
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +0000898append_objects(PyObject *py_list, PyGC_Head *gc_list)
899{
900 PyGC_Head *gc;
Tim Peters9e4ca102001-10-11 18:31:31 +0000901 for (gc = gc_list->gc.gc_next; gc != gc_list; gc = gc->gc.gc_next) {
Neil Schemenauer43411b52001-08-30 00:05:51 +0000902 PyObject *op = FROM_GC(gc);
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +0000903 if (op != py_list) {
Martin v. Löwis155aad12001-12-02 12:21:34 +0000904 if (PyList_Append(py_list, op)) {
905 return -1; /* exception */
906 }
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +0000907 }
908 }
Martin v. Löwis155aad12001-12-02 12:21:34 +0000909 return 0;
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +0000910}
911
912static PyObject *
913gc_get_objects(PyObject *self, PyObject *args)
914{
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000915 int i;
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +0000916 PyObject* result;
917
918 if (!PyArg_ParseTuple(args, ":get_objects")) /* check no args */
919 return NULL;
920 result = PyList_New(0);
Martin v. Löwisf8a6f242001-12-02 18:31:02 +0000921 if (result == NULL) {
922 return NULL;
923 }
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000924 for (i = 0; i < NUM_GENERATIONS; i++) {
925 if (append_objects(result, GEN_HEAD(i))) {
926 Py_DECREF(result);
927 return NULL;
928 }
Martin v. Löwis155aad12001-12-02 12:21:34 +0000929 }
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +0000930 return result;
931}
932
933
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000934PyDoc_STRVAR(gc__doc__,
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000935"This module provides access to the garbage collector for reference cycles.\n"
936"\n"
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000937"enable() -- Enable automatic garbage collection.\n"
938"disable() -- Disable automatic garbage collection.\n"
939"isenabled() -- Returns true if automatic collection is enabled.\n"
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000940"collect() -- Do a full collection right now.\n"
941"set_debug() -- Set debugging flags.\n"
942"get_debug() -- Get debugging flags.\n"
943"set_threshold() -- Set the collection thresholds.\n"
944"get_threshold() -- Return the current the collection thresholds.\n"
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +0000945"get_objects() -- Return a list of all objects tracked by the collector.\n"
Jeremy Hylton5bd378b2003-04-03 16:28:38 +0000946"get_referrers() -- Return the list of objects that refer to an object.\n"
947"get_referrents() -- Return the list of objects that an object refers to.\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000948
949static PyMethodDef GcMethods[] = {
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000950 {"enable", gc_enable, METH_VARARGS, gc_enable__doc__},
951 {"disable", gc_disable, METH_VARARGS, gc_disable__doc__},
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000952 {"isenabled", gc_isenabled, METH_VARARGS, gc_isenabled__doc__},
953 {"set_debug", gc_set_debug, METH_VARARGS, gc_set_debug__doc__},
954 {"get_debug", gc_get_debug, METH_VARARGS, gc_get_debug__doc__},
955 {"set_threshold", gc_set_thresh, METH_VARARGS, gc_set_thresh__doc__},
956 {"get_threshold", gc_get_thresh, METH_VARARGS, gc_get_thresh__doc__},
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000957 {"collect", gc_collect, METH_VARARGS, gc_collect__doc__},
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +0000958 {"get_objects", gc_get_objects,METH_VARARGS, gc_get_objects__doc__},
Martin v. Löwis560da622001-11-24 09:24:51 +0000959 {"get_referrers", gc_get_referrers, METH_VARARGS,
960 gc_get_referrers__doc__},
Jeremy Hylton5bd378b2003-04-03 16:28:38 +0000961 {"get_referrents", gc_get_referrents, METH_VARARGS,
962 gc_get_referrents__doc__},
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000963 {NULL, NULL} /* Sentinel */
964};
965
966void
967initgc(void)
968{
969 PyObject *m;
970 PyObject *d;
971
Jeremy Hyltonce136e92003-04-04 19:59:06 +0000972 delstr = PyString_InternFromString("__del__");
973 if (!delstr)
974 return;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000975 m = Py_InitModule4("gc",
976 GcMethods,
977 gc__doc__,
978 NULL,
979 PYTHON_API_VERSION);
980 d = PyModule_GetDict(m);
981 if (garbage == NULL) {
982 garbage = PyList_New(0);
983 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000984 PyDict_SetItemString(d, "garbage", garbage);
985 PyDict_SetItemString(d, "DEBUG_STATS",
986 PyInt_FromLong(DEBUG_STATS));
987 PyDict_SetItemString(d, "DEBUG_COLLECTABLE",
988 PyInt_FromLong(DEBUG_COLLECTABLE));
989 PyDict_SetItemString(d, "DEBUG_UNCOLLECTABLE",
990 PyInt_FromLong(DEBUG_UNCOLLECTABLE));
991 PyDict_SetItemString(d, "DEBUG_INSTANCES",
992 PyInt_FromLong(DEBUG_INSTANCES));
993 PyDict_SetItemString(d, "DEBUG_OBJECTS",
994 PyInt_FromLong(DEBUG_OBJECTS));
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000995 PyDict_SetItemString(d, "DEBUG_SAVEALL",
996 PyInt_FromLong(DEBUG_SAVEALL));
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000997 PyDict_SetItemString(d, "DEBUG_LEAK",
998 PyInt_FromLong(DEBUG_LEAK));
999}
1000
Neil Schemenauer43411b52001-08-30 00:05:51 +00001001/* for debugging */
1002void _PyGC_Dump(PyGC_Head *g)
1003{
1004 _PyObject_Dump(FROM_GC(g));
1005}
1006
Neil Schemenauer43411b52001-08-30 00:05:51 +00001007/* extension modules might be compiled with GC support so these
1008 functions must always be available */
1009
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001010#undef PyObject_GC_Track
1011#undef PyObject_GC_UnTrack
1012#undef PyObject_GC_Del
1013#undef _PyObject_GC_Malloc
1014
Neil Schemenauer43411b52001-08-30 00:05:51 +00001015void
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001016PyObject_GC_Track(void *op)
Neil Schemenauer43411b52001-08-30 00:05:51 +00001017{
1018 _PyObject_GC_TRACK(op);
1019}
1020
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001021/* for binary compatibility with 2.2 */
Neil Schemenauer43411b52001-08-30 00:05:51 +00001022void
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001023_PyObject_GC_Track(PyObject *op)
1024{
1025 PyObject_GC_Track(op);
1026}
1027
1028void
1029PyObject_GC_UnTrack(void *op)
Neil Schemenauer43411b52001-08-30 00:05:51 +00001030{
Tim Peters803526b2002-07-07 05:13:56 +00001031 /* Obscure: the Py_TRASHCAN mechanism requires that we be able to
1032 * call PyObject_GC_UnTrack twice on an object.
1033 */
Neil Schemenauera2b11ec2002-05-21 15:53:24 +00001034 if (IS_TRACKED(op))
Guido van Rossumff413af2002-03-28 20:34:59 +00001035 _PyObject_GC_UNTRACK(op);
Neil Schemenauer43411b52001-08-30 00:05:51 +00001036}
1037
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001038/* for binary compatibility with 2.2 */
1039void
1040_PyObject_GC_UnTrack(PyObject *op)
1041{
1042 PyObject_GC_UnTrack(op);
1043}
1044
Neil Schemenauer43411b52001-08-30 00:05:51 +00001045PyObject *
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001046_PyObject_GC_Malloc(size_t basicsize)
Neil Schemenauer43411b52001-08-30 00:05:51 +00001047{
1048 PyObject *op;
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001049 PyGC_Head *g = PyObject_MALLOC(sizeof(PyGC_Head) + basicsize);
Neil Schemenauer43411b52001-08-30 00:05:51 +00001050 if (g == NULL)
Jeremy Hylton8a135182002-06-06 23:23:55 +00001051 return PyErr_NoMemory();
Tim Petersea405632002-07-02 00:52:30 +00001052 g->gc.gc_refs = GC_UNTRACKED;
Neil Schemenauer2880ae52002-05-04 05:35:20 +00001053 generations[0].count++; /* number of allocated GC objects */
1054 if (generations[0].count > generations[0].threshold &&
Neil Schemenauer43411b52001-08-30 00:05:51 +00001055 enabled &&
Neil Schemenauer2880ae52002-05-04 05:35:20 +00001056 generations[0].threshold &&
Neil Schemenauer43411b52001-08-30 00:05:51 +00001057 !collecting &&
1058 !PyErr_Occurred()) {
1059 collecting = 1;
Neil Schemenauer2880ae52002-05-04 05:35:20 +00001060 collect_generations();
Neil Schemenauer43411b52001-08-30 00:05:51 +00001061 collecting = 0;
1062 }
1063 op = FROM_GC(g);
Neil Schemenauer43411b52001-08-30 00:05:51 +00001064 return op;
1065}
1066
1067PyObject *
1068_PyObject_GC_New(PyTypeObject *tp)
1069{
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001070 PyObject *op = _PyObject_GC_Malloc(_PyObject_SIZE(tp));
Tim Petersfa8efab2002-04-28 01:57:25 +00001071 if (op != NULL)
1072 op = PyObject_INIT(op, tp);
1073 return op;
Neil Schemenauer43411b52001-08-30 00:05:51 +00001074}
1075
1076PyVarObject *
Tim Peters6d483d32001-10-06 21:27:34 +00001077_PyObject_GC_NewVar(PyTypeObject *tp, int nitems)
Neil Schemenauer43411b52001-08-30 00:05:51 +00001078{
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001079 const size_t size = _PyObject_VAR_SIZE(tp, nitems);
1080 PyVarObject *op = (PyVarObject *) _PyObject_GC_Malloc(size);
Tim Petersfa8efab2002-04-28 01:57:25 +00001081 if (op != NULL)
1082 op = PyObject_INIT_VAR(op, tp, nitems);
1083 return op;
Neil Schemenauer43411b52001-08-30 00:05:51 +00001084}
1085
1086PyVarObject *
Tim Peters6d483d32001-10-06 21:27:34 +00001087_PyObject_GC_Resize(PyVarObject *op, int nitems)
Neil Schemenauer43411b52001-08-30 00:05:51 +00001088{
Tim Petersf2a67da2001-10-07 03:54:51 +00001089 const size_t basicsize = _PyObject_VAR_SIZE(op->ob_type, nitems);
Neil Schemenauer43411b52001-08-30 00:05:51 +00001090 PyGC_Head *g = AS_GC(op);
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001091 g = PyObject_REALLOC(g, sizeof(PyGC_Head) + basicsize);
Neil Schemenauer43411b52001-08-30 00:05:51 +00001092 if (g == NULL)
1093 return (PyVarObject *)PyErr_NoMemory();
1094 op = (PyVarObject *) FROM_GC(g);
Tim Peters6d483d32001-10-06 21:27:34 +00001095 op->ob_size = nitems;
Neil Schemenauer43411b52001-08-30 00:05:51 +00001096 return op;
1097}
1098
1099void
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001100PyObject_GC_Del(void *op)
Neil Schemenauer43411b52001-08-30 00:05:51 +00001101{
Neil Schemenauer43411b52001-08-30 00:05:51 +00001102 PyGC_Head *g = AS_GC(op);
Neil Schemenauera2b11ec2002-05-21 15:53:24 +00001103 if (IS_TRACKED(op))
Neil Schemenauer43411b52001-08-30 00:05:51 +00001104 gc_list_remove(g);
Neil Schemenauer2880ae52002-05-04 05:35:20 +00001105 if (generations[0].count > 0) {
1106 generations[0].count--;
Neil Schemenauer43411b52001-08-30 00:05:51 +00001107 }
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001108 PyObject_FREE(g);
Neil Schemenauer43411b52001-08-30 00:05:51 +00001109}
1110
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001111/* for binary compatibility with 2.2 */
1112#undef _PyObject_GC_Del
1113void
1114_PyObject_GC_Del(PyObject *op)
1115{
1116 PyObject_GC_Del(op);
1117}