blob: 10a90b14f54e7e14f06f8327ae3b90041b58a4ac [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
Tim Peters93ad66d2003-04-05 17:15:44 +000062/* Python string used to look for __del__ attribute. */
63static PyObject *delstr = NULL;
Jeremy Hyltonce136e92003-04-04 19:59:06 +000064
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) {
Tim Peters93ad66d2003-04-05 17:15:44 +0000372 /* The object will be deallocated.
Jeremy Hyltonce136e92003-04-04 19:59:06 +0000373 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
Tim Peters93ad66d2003-04-05 17:15:44 +0000528 if (delstr == NULL) {
529 delstr = PyString_InternFromString("__del__");
530 if (delstr == NULL)
531 Py_FatalError("gc couldn't allocate \"__del__\"");
532 }
533
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000534 if (debug & DEBUG_STATS) {
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000535 PySys_WriteStderr("gc: collecting generation %d...\n",
536 generation);
537 PySys_WriteStderr("gc: objects in each generation:");
538 for (i = 0; i < NUM_GENERATIONS; i++) {
539 PySys_WriteStderr(" %ld", gc_list_size(GEN_HEAD(i)));
540 }
541 PySys_WriteStderr("\n");
542 }
543
544 /* update collection and allocation counters */
545 if (generation+1 < NUM_GENERATIONS)
546 generations[generation+1].count += 1;
547 for (i = 0; i <= generation; i++)
Neil Schemenauerc9051642002-06-28 19:16:04 +0000548 generations[i].count = 0;
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000549
550 /* merge younger generations with one we are currently collecting */
551 for (i = 0; i < generation; i++) {
552 gc_list_merge(GEN_HEAD(i), GEN_HEAD(generation));
553 }
554
555 /* handy references */
556 young = GEN_HEAD(generation);
Tim Peters19b74c72002-07-01 03:52:19 +0000557 if (generation < NUM_GENERATIONS-1)
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000558 old = GEN_HEAD(generation+1);
Tim Peters19b74c72002-07-01 03:52:19 +0000559 else
560 old = young;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000561
562 /* Using ob_refcnt and gc_refs, calculate which objects in the
563 * container set are reachable from outside the set (ie. have a
564 * refcount greater than 0 when all the references within the
Tim Peters19b74c72002-07-01 03:52:19 +0000565 * set are taken into account
566 */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000567 update_refs(young);
568 subtract_refs(young);
569
Tim Peters19b74c72002-07-01 03:52:19 +0000570 /* Leave everything reachable from outside young in young, and move
571 * everything else (in young) to unreachable.
572 * NOTE: This used to move the reachable objects into a reachable
573 * set instead. But most things usually turn out to be reachable,
574 * so it's more efficient to move the unreachable things.
575 */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000576 gc_list_init(&unreachable);
Tim Peters19b74c72002-07-01 03:52:19 +0000577 move_unreachable(young, &unreachable);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000578
Tim Peters19b74c72002-07-01 03:52:19 +0000579 /* Move reachable objects to next generation. */
580 if (young != old)
581 gc_list_merge(young, old);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000582
Tim Peters19b74c72002-07-01 03:52:19 +0000583 /* All objects in unreachable are trash, but objects reachable from
584 * finalizers can't safely be deleted. Python programmers should take
585 * care not to create such things. For Python, finalizers means
586 * instance objects with __del__ methods.
Tim Peters93ad66d2003-04-05 17:15:44 +0000587 *
Jeremy Hyltonce136e92003-04-04 19:59:06 +0000588 * Move each object into the collectable set or the finalizers set.
589 * It's possible that a classic class with a getattr() hook will
590 * be revived or deallocated in this step.
Tim Peters19b74c72002-07-01 03:52:19 +0000591 */
Jeremy Hyltonce136e92003-04-04 19:59:06 +0000592 gc_list_init(&collectable);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000593 gc_list_init(&finalizers);
Jeremy Hyltonce136e92003-04-04 19:59:06 +0000594 move_finalizers(&unreachable, &collectable, &finalizers);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000595 move_finalizer_reachable(&finalizers);
596
597 /* Collect statistics on collectable objects found and print
598 * debugging information. */
Jeremy Hyltonce136e92003-04-04 19:59:06 +0000599 for (gc = collectable.gc.gc_next; gc != &collectable;
Tim Peters9e4ca102001-10-11 18:31:31 +0000600 gc = gc->gc.gc_next) {
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000601 m++;
Jeremy Hylton06257772000-08-31 15:10:24 +0000602 if (debug & DEBUG_COLLECTABLE) {
Neil Schemenauer43411b52001-08-30 00:05:51 +0000603 debug_cycle("collectable", FROM_GC(gc));
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000604 }
605 }
Tim Peters19b74c72002-07-01 03:52:19 +0000606 /* Call tp_clear on objects in the collectable set. This will cause
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000607 * the reference cycles to be broken. It may also cause some objects in
608 * finalizers to be freed */
Jeremy Hyltonce136e92003-04-04 19:59:06 +0000609 delete_garbage(&collectable, old);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000610
611 /* Collect statistics on uncollectable objects found and print
612 * debugging information. */
Tim Peters9e4ca102001-10-11 18:31:31 +0000613 for (gc = finalizers.gc.gc_next; gc != &finalizers;
614 gc = gc->gc.gc_next) {
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000615 n++;
Jeremy Hylton06257772000-08-31 15:10:24 +0000616 if (debug & DEBUG_UNCOLLECTABLE) {
Neil Schemenauer43411b52001-08-30 00:05:51 +0000617 debug_cycle("uncollectable", FROM_GC(gc));
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000618 }
619 }
Jeremy Hylton06257772000-08-31 15:10:24 +0000620 if (debug & DEBUG_STATS) {
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000621 if (m == 0 && n == 0) {
Jeremy Hylton06257772000-08-31 15:10:24 +0000622 PySys_WriteStderr("gc: done.\n");
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000623 }
624 else {
Jeremy Hylton06257772000-08-31 15:10:24 +0000625 PySys_WriteStderr(
626 "gc: done, %ld unreachable, %ld uncollectable.\n",
627 n+m, n);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000628 }
629 }
630
631 /* Append instances in the uncollectable set to a Python
632 * reachable list of garbage. The programmer has to deal with
633 * this if they insist on creating this type of structure. */
634 handle_finalizers(&finalizers, old);
635
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000636 if (PyErr_Occurred()) {
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000637 if (gc_str == NULL) {
638 gc_str = PyString_FromString("garbage collection");
639 }
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000640 PyErr_WriteUnraisable(gc_str);
641 Py_FatalError("unexpected exception during garbage collection");
642 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000643 return n+m;
644}
645
646static long
647collect_generations(void)
648{
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000649 int i;
Vladimir Marangozovb16714b2000-07-10 05:37:39 +0000650 long n = 0;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000651
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000652 /* Find the oldest generation (higest numbered) where the count
653 * exceeds the threshold. Objects in the that generation and
654 * generations younger than it will be collected. */
655 for (i = NUM_GENERATIONS-1; i >= 0; i--) {
656 if (generations[i].count > generations[i].threshold) {
657 n = collect(i);
658 break;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000659 }
660 }
661 return n;
662}
663
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000664PyDoc_STRVAR(gc_enable__doc__,
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000665"enable() -> None\n"
666"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000667"Enable automatic garbage collection.\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000668
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000669static PyObject *
670gc_enable(PyObject *self, PyObject *args)
671{
672
673 if (!PyArg_ParseTuple(args, ":enable")) /* check no args */
674 return NULL;
675
676 enabled = 1;
677
678 Py_INCREF(Py_None);
679 return Py_None;
680}
681
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000682PyDoc_STRVAR(gc_disable__doc__,
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000683"disable() -> None\n"
684"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000685"Disable automatic garbage collection.\n");
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000686
687static PyObject *
688gc_disable(PyObject *self, PyObject *args)
689{
690
691 if (!PyArg_ParseTuple(args, ":disable")) /* check no args */
692 return NULL;
693
694 enabled = 0;
695
696 Py_INCREF(Py_None);
697 return Py_None;
698}
699
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000700PyDoc_STRVAR(gc_isenabled__doc__,
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000701"isenabled() -> status\n"
702"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000703"Returns true if automatic garbage collection is enabled.\n");
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000704
705static PyObject *
706gc_isenabled(PyObject *self, PyObject *args)
707{
708
709 if (!PyArg_ParseTuple(args, ":isenabled")) /* check no args */
710 return NULL;
711
712 return Py_BuildValue("i", enabled);
713}
714
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000715PyDoc_STRVAR(gc_collect__doc__,
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000716"collect() -> n\n"
717"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000718"Run a full collection. The number of unreachable objects is returned.\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000719
720static PyObject *
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000721gc_collect(PyObject *self, PyObject *args)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000722{
723 long n;
724
Fred Drakecc1be242000-07-12 04:42:23 +0000725 if (!PyArg_ParseTuple(args, ":collect")) /* check no args */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000726 return NULL;
727
Neil Schemenauere8c40cb2001-10-31 23:09:35 +0000728 if (collecting) {
729 n = 0; /* already collecting, don't do anything */
730 }
731 else {
732 collecting = 1;
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000733 n = collect(NUM_GENERATIONS - 1);
Neil Schemenauere8c40cb2001-10-31 23:09:35 +0000734 collecting = 0;
735 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000736
Neil Schemenauer7760cff2000-09-22 22:35:36 +0000737 return Py_BuildValue("l", n);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000738}
739
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000740PyDoc_STRVAR(gc_set_debug__doc__,
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000741"set_debug(flags) -> None\n"
742"\n"
743"Set the garbage collection debugging flags. Debugging information is\n"
744"written to sys.stderr.\n"
745"\n"
746"flags is an integer and can have the following bits turned on:\n"
747"\n"
748" DEBUG_STATS - Print statistics during collection.\n"
749" DEBUG_COLLECTABLE - Print collectable objects found.\n"
750" DEBUG_UNCOLLECTABLE - Print unreachable but uncollectable objects found.\n"
751" DEBUG_INSTANCES - Print instance objects.\n"
752" DEBUG_OBJECTS - Print objects other than instances.\n"
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000753" DEBUG_SAVEALL - Save objects to gc.garbage rather than freeing them.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000754" DEBUG_LEAK - Debug leaking programs (everything but STATS).\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000755
756static PyObject *
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000757gc_set_debug(PyObject *self, PyObject *args)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000758{
Neil Schemenauer7760cff2000-09-22 22:35:36 +0000759 if (!PyArg_ParseTuple(args, "i:set_debug", &debug))
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000760 return NULL;
761
762 Py_INCREF(Py_None);
763 return Py_None;
764}
765
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000766PyDoc_STRVAR(gc_get_debug__doc__,
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000767"get_debug() -> flags\n"
768"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000769"Get the garbage collection debugging flags.\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000770
771static PyObject *
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000772gc_get_debug(PyObject *self, PyObject *args)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000773{
Fred Drakecc1be242000-07-12 04:42:23 +0000774 if (!PyArg_ParseTuple(args, ":get_debug")) /* no args */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000775 return NULL;
776
777 return Py_BuildValue("i", debug);
778}
779
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000780PyDoc_STRVAR(gc_set_thresh__doc__,
Neal Norwitz2a47c0f2002-01-29 00:53:41 +0000781"set_threshold(threshold0, [threshold1, threshold2]) -> None\n"
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000782"\n"
783"Sets the collection thresholds. Setting threshold0 to zero disables\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000784"collection.\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000785
786static PyObject *
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000787gc_set_thresh(PyObject *self, PyObject *args)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000788{
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000789 int i;
790 if (!PyArg_ParseTuple(args, "i|ii:set_threshold",
791 &generations[0].threshold,
792 &generations[1].threshold,
793 &generations[2].threshold))
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000794 return NULL;
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000795 for (i = 2; i < NUM_GENERATIONS; i++) {
796 /* generations higher than 2 get the same threshold */
797 generations[i].threshold = generations[2].threshold;
798 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000799
800 Py_INCREF(Py_None);
801 return Py_None;
802}
803
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000804PyDoc_STRVAR(gc_get_thresh__doc__,
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000805"get_threshold() -> (threshold0, threshold1, threshold2)\n"
806"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000807"Return the current collection thresholds\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000808
809static PyObject *
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000810gc_get_thresh(PyObject *self, PyObject *args)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000811{
Fred Drakecc1be242000-07-12 04:42:23 +0000812 if (!PyArg_ParseTuple(args, ":get_threshold")) /* no args */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000813 return NULL;
814
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000815 return Py_BuildValue("(iii)",
816 generations[0].threshold,
817 generations[1].threshold,
818 generations[2].threshold);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000819}
820
Neil Schemenauer48c70342001-08-09 15:38:31 +0000821static int
Martin v. Löwis560da622001-11-24 09:24:51 +0000822referrersvisit(PyObject* obj, PyObject *objs)
Neil Schemenauer48c70342001-08-09 15:38:31 +0000823{
Martin v. Löwisc8fe77b2001-11-29 18:08:31 +0000824 int i;
825 for (i = 0; i < PyTuple_GET_SIZE(objs); i++)
826 if (PyTuple_GET_ITEM(objs, i) == obj)
827 return 1;
Neil Schemenauer48c70342001-08-09 15:38:31 +0000828 return 0;
829}
830
Neil Schemenauer17e7be62001-08-10 14:46:47 +0000831static int
Martin v. Löwis560da622001-11-24 09:24:51 +0000832gc_referrers_for(PyObject *objs, PyGC_Head *list, PyObject *resultlist)
Neil Schemenauer48c70342001-08-09 15:38:31 +0000833{
834 PyGC_Head *gc;
835 PyObject *obj;
836 traverseproc traverse;
Tim Peters9e4ca102001-10-11 18:31:31 +0000837 for (gc = list->gc.gc_next; gc != list; gc = gc->gc.gc_next) {
Neil Schemenauer43411b52001-08-30 00:05:51 +0000838 obj = FROM_GC(gc);
Neil Schemenauer48c70342001-08-09 15:38:31 +0000839 traverse = obj->ob_type->tp_traverse;
840 if (obj == objs || obj == resultlist)
841 continue;
Martin v. Löwis560da622001-11-24 09:24:51 +0000842 if (traverse(obj, (visitproc)referrersvisit, objs)) {
Neil Schemenauer17e7be62001-08-10 14:46:47 +0000843 if (PyList_Append(resultlist, obj) < 0)
844 return 0; /* error */
Neil Schemenauer48c70342001-08-09 15:38:31 +0000845 }
846 }
Neil Schemenauer17e7be62001-08-10 14:46:47 +0000847 return 1; /* no error */
Neil Schemenauer48c70342001-08-09 15:38:31 +0000848}
849
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000850PyDoc_STRVAR(gc_get_referrers__doc__,
Martin v. Löwis560da622001-11-24 09:24:51 +0000851"get_referrers(*objs) -> list\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000852Return the list of objects that directly refer to any of objs.");
Neil Schemenauer48c70342001-08-09 15:38:31 +0000853
Neil Schemenauer17e7be62001-08-10 14:46:47 +0000854static PyObject *
Martin v. Löwis560da622001-11-24 09:24:51 +0000855gc_get_referrers(PyObject *self, PyObject *args)
Neil Schemenauer48c70342001-08-09 15:38:31 +0000856{
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000857 int i;
Neil Schemenauer48c70342001-08-09 15:38:31 +0000858 PyObject *result = PyList_New(0);
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000859 for (i = 0; i < NUM_GENERATIONS; i++) {
860 if (!(gc_referrers_for(args, GEN_HEAD(i), result))) {
861 Py_DECREF(result);
862 return NULL;
863 }
Neil Schemenauer17e7be62001-08-10 14:46:47 +0000864 }
Neil Schemenauer48c70342001-08-09 15:38:31 +0000865 return result;
866}
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000867
Jeremy Hylton5bd378b2003-04-03 16:28:38 +0000868static int
869referrentsvisit(PyObject *obj, PyObject *list)
870{
871 if (PyList_Append(list, obj) < 0)
872 return 1;
873 return 0;
874}
875
876PyDoc_STRVAR(gc_get_referrents__doc__,
877"get_referrents(*objs) -> list\n\
Jeremy Hylton059b0942003-04-03 16:29:13 +0000878Return the list of objects that are directly referred to by objs.");
Jeremy Hylton5bd378b2003-04-03 16:28:38 +0000879
880static PyObject *
881gc_get_referrents(PyObject *self, PyObject *args)
882{
883 int i;
884 PyObject *result = PyList_New(0);
885 for (i = 0; i < PyTuple_GET_SIZE(args); i++) {
Tim Peters93ad66d2003-04-05 17:15:44 +0000886 PyObject *obj = PyTuple_GET_ITEM(args, i);
Jeremy Hylton5bd378b2003-04-03 16:28:38 +0000887 traverseproc traverse = obj->ob_type->tp_traverse;
888 if (!traverse)
889 continue;
890 if (traverse(obj, (visitproc)referrentsvisit, result))
891 return NULL;
892 }
893 return result;
894}
895
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000896PyDoc_STRVAR(gc_get_objects__doc__,
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +0000897"get_objects() -> [...]\n"
898"\n"
899"Return a list of objects tracked by the collector (excluding the list\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000900"returned).\n");
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +0000901
902/* appending objects in a GC list to a Python list */
Martin v. Löwis155aad12001-12-02 12:21:34 +0000903static int
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +0000904append_objects(PyObject *py_list, PyGC_Head *gc_list)
905{
906 PyGC_Head *gc;
Tim Peters9e4ca102001-10-11 18:31:31 +0000907 for (gc = gc_list->gc.gc_next; gc != gc_list; gc = gc->gc.gc_next) {
Neil Schemenauer43411b52001-08-30 00:05:51 +0000908 PyObject *op = FROM_GC(gc);
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +0000909 if (op != py_list) {
Martin v. Löwis155aad12001-12-02 12:21:34 +0000910 if (PyList_Append(py_list, op)) {
911 return -1; /* exception */
912 }
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +0000913 }
914 }
Martin v. Löwis155aad12001-12-02 12:21:34 +0000915 return 0;
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +0000916}
917
918static PyObject *
919gc_get_objects(PyObject *self, PyObject *args)
920{
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000921 int i;
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +0000922 PyObject* result;
923
924 if (!PyArg_ParseTuple(args, ":get_objects")) /* check no args */
925 return NULL;
926 result = PyList_New(0);
Martin v. Löwisf8a6f242001-12-02 18:31:02 +0000927 if (result == NULL) {
928 return NULL;
929 }
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000930 for (i = 0; i < NUM_GENERATIONS; i++) {
931 if (append_objects(result, GEN_HEAD(i))) {
932 Py_DECREF(result);
933 return NULL;
934 }
Martin v. Löwis155aad12001-12-02 12:21:34 +0000935 }
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +0000936 return result;
937}
938
939
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000940PyDoc_STRVAR(gc__doc__,
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000941"This module provides access to the garbage collector for reference cycles.\n"
942"\n"
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000943"enable() -- Enable automatic garbage collection.\n"
944"disable() -- Disable automatic garbage collection.\n"
945"isenabled() -- Returns true if automatic collection is enabled.\n"
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000946"collect() -- Do a full collection right now.\n"
947"set_debug() -- Set debugging flags.\n"
948"get_debug() -- Get debugging flags.\n"
949"set_threshold() -- Set the collection thresholds.\n"
950"get_threshold() -- Return the current the collection thresholds.\n"
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +0000951"get_objects() -- Return a list of all objects tracked by the collector.\n"
Jeremy Hylton5bd378b2003-04-03 16:28:38 +0000952"get_referrers() -- Return the list of objects that refer to an object.\n"
953"get_referrents() -- Return the list of objects that an object refers to.\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000954
955static PyMethodDef GcMethods[] = {
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000956 {"enable", gc_enable, METH_VARARGS, gc_enable__doc__},
957 {"disable", gc_disable, METH_VARARGS, gc_disable__doc__},
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000958 {"isenabled", gc_isenabled, METH_VARARGS, gc_isenabled__doc__},
959 {"set_debug", gc_set_debug, METH_VARARGS, gc_set_debug__doc__},
960 {"get_debug", gc_get_debug, METH_VARARGS, gc_get_debug__doc__},
961 {"set_threshold", gc_set_thresh, METH_VARARGS, gc_set_thresh__doc__},
962 {"get_threshold", gc_get_thresh, METH_VARARGS, gc_get_thresh__doc__},
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000963 {"collect", gc_collect, METH_VARARGS, gc_collect__doc__},
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +0000964 {"get_objects", gc_get_objects,METH_VARARGS, gc_get_objects__doc__},
Martin v. Löwis560da622001-11-24 09:24:51 +0000965 {"get_referrers", gc_get_referrers, METH_VARARGS,
966 gc_get_referrers__doc__},
Jeremy Hylton5bd378b2003-04-03 16:28:38 +0000967 {"get_referrents", gc_get_referrents, METH_VARARGS,
968 gc_get_referrents__doc__},
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000969 {NULL, NULL} /* Sentinel */
970};
971
972void
973initgc(void)
974{
975 PyObject *m;
976 PyObject *d;
977
978 m = Py_InitModule4("gc",
979 GcMethods,
980 gc__doc__,
981 NULL,
982 PYTHON_API_VERSION);
983 d = PyModule_GetDict(m);
984 if (garbage == NULL) {
985 garbage = PyList_New(0);
986 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000987 PyDict_SetItemString(d, "garbage", garbage);
988 PyDict_SetItemString(d, "DEBUG_STATS",
989 PyInt_FromLong(DEBUG_STATS));
990 PyDict_SetItemString(d, "DEBUG_COLLECTABLE",
991 PyInt_FromLong(DEBUG_COLLECTABLE));
992 PyDict_SetItemString(d, "DEBUG_UNCOLLECTABLE",
993 PyInt_FromLong(DEBUG_UNCOLLECTABLE));
994 PyDict_SetItemString(d, "DEBUG_INSTANCES",
995 PyInt_FromLong(DEBUG_INSTANCES));
996 PyDict_SetItemString(d, "DEBUG_OBJECTS",
997 PyInt_FromLong(DEBUG_OBJECTS));
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000998 PyDict_SetItemString(d, "DEBUG_SAVEALL",
999 PyInt_FromLong(DEBUG_SAVEALL));
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +00001000 PyDict_SetItemString(d, "DEBUG_LEAK",
1001 PyInt_FromLong(DEBUG_LEAK));
1002}
1003
Neil Schemenauer43411b52001-08-30 00:05:51 +00001004/* for debugging */
1005void _PyGC_Dump(PyGC_Head *g)
1006{
1007 _PyObject_Dump(FROM_GC(g));
1008}
1009
Neil Schemenauer43411b52001-08-30 00:05:51 +00001010/* extension modules might be compiled with GC support so these
1011 functions must always be available */
1012
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001013#undef PyObject_GC_Track
1014#undef PyObject_GC_UnTrack
1015#undef PyObject_GC_Del
1016#undef _PyObject_GC_Malloc
1017
Neil Schemenauer43411b52001-08-30 00:05:51 +00001018void
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001019PyObject_GC_Track(void *op)
Neil Schemenauer43411b52001-08-30 00:05:51 +00001020{
1021 _PyObject_GC_TRACK(op);
1022}
1023
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001024/* for binary compatibility with 2.2 */
Neil Schemenauer43411b52001-08-30 00:05:51 +00001025void
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001026_PyObject_GC_Track(PyObject *op)
1027{
1028 PyObject_GC_Track(op);
1029}
1030
1031void
1032PyObject_GC_UnTrack(void *op)
Neil Schemenauer43411b52001-08-30 00:05:51 +00001033{
Tim Peters803526b2002-07-07 05:13:56 +00001034 /* Obscure: the Py_TRASHCAN mechanism requires that we be able to
1035 * call PyObject_GC_UnTrack twice on an object.
1036 */
Neil Schemenauera2b11ec2002-05-21 15:53:24 +00001037 if (IS_TRACKED(op))
Guido van Rossumff413af2002-03-28 20:34:59 +00001038 _PyObject_GC_UNTRACK(op);
Neil Schemenauer43411b52001-08-30 00:05:51 +00001039}
1040
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001041/* for binary compatibility with 2.2 */
1042void
1043_PyObject_GC_UnTrack(PyObject *op)
1044{
1045 PyObject_GC_UnTrack(op);
1046}
1047
Neil Schemenauer43411b52001-08-30 00:05:51 +00001048PyObject *
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001049_PyObject_GC_Malloc(size_t basicsize)
Neil Schemenauer43411b52001-08-30 00:05:51 +00001050{
1051 PyObject *op;
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001052 PyGC_Head *g = PyObject_MALLOC(sizeof(PyGC_Head) + basicsize);
Neil Schemenauer43411b52001-08-30 00:05:51 +00001053 if (g == NULL)
Jeremy Hylton8a135182002-06-06 23:23:55 +00001054 return PyErr_NoMemory();
Tim Petersea405632002-07-02 00:52:30 +00001055 g->gc.gc_refs = GC_UNTRACKED;
Neil Schemenauer2880ae52002-05-04 05:35:20 +00001056 generations[0].count++; /* number of allocated GC objects */
1057 if (generations[0].count > generations[0].threshold &&
Neil Schemenauer43411b52001-08-30 00:05:51 +00001058 enabled &&
Neil Schemenauer2880ae52002-05-04 05:35:20 +00001059 generations[0].threshold &&
Neil Schemenauer43411b52001-08-30 00:05:51 +00001060 !collecting &&
1061 !PyErr_Occurred()) {
1062 collecting = 1;
Neil Schemenauer2880ae52002-05-04 05:35:20 +00001063 collect_generations();
Neil Schemenauer43411b52001-08-30 00:05:51 +00001064 collecting = 0;
1065 }
1066 op = FROM_GC(g);
Neil Schemenauer43411b52001-08-30 00:05:51 +00001067 return op;
1068}
1069
1070PyObject *
1071_PyObject_GC_New(PyTypeObject *tp)
1072{
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001073 PyObject *op = _PyObject_GC_Malloc(_PyObject_SIZE(tp));
Tim Petersfa8efab2002-04-28 01:57:25 +00001074 if (op != NULL)
1075 op = PyObject_INIT(op, tp);
1076 return op;
Neil Schemenauer43411b52001-08-30 00:05:51 +00001077}
1078
1079PyVarObject *
Tim Peters6d483d32001-10-06 21:27:34 +00001080_PyObject_GC_NewVar(PyTypeObject *tp, int nitems)
Neil Schemenauer43411b52001-08-30 00:05:51 +00001081{
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001082 const size_t size = _PyObject_VAR_SIZE(tp, nitems);
1083 PyVarObject *op = (PyVarObject *) _PyObject_GC_Malloc(size);
Tim Petersfa8efab2002-04-28 01:57:25 +00001084 if (op != NULL)
1085 op = PyObject_INIT_VAR(op, tp, nitems);
1086 return op;
Neil Schemenauer43411b52001-08-30 00:05:51 +00001087}
1088
1089PyVarObject *
Tim Peters6d483d32001-10-06 21:27:34 +00001090_PyObject_GC_Resize(PyVarObject *op, int nitems)
Neil Schemenauer43411b52001-08-30 00:05:51 +00001091{
Tim Petersf2a67da2001-10-07 03:54:51 +00001092 const size_t basicsize = _PyObject_VAR_SIZE(op->ob_type, nitems);
Neil Schemenauer43411b52001-08-30 00:05:51 +00001093 PyGC_Head *g = AS_GC(op);
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001094 g = PyObject_REALLOC(g, sizeof(PyGC_Head) + basicsize);
Neil Schemenauer43411b52001-08-30 00:05:51 +00001095 if (g == NULL)
1096 return (PyVarObject *)PyErr_NoMemory();
1097 op = (PyVarObject *) FROM_GC(g);
Tim Peters6d483d32001-10-06 21:27:34 +00001098 op->ob_size = nitems;
Neil Schemenauer43411b52001-08-30 00:05:51 +00001099 return op;
1100}
1101
1102void
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001103PyObject_GC_Del(void *op)
Neil Schemenauer43411b52001-08-30 00:05:51 +00001104{
Neil Schemenauer43411b52001-08-30 00:05:51 +00001105 PyGC_Head *g = AS_GC(op);
Neil Schemenauera2b11ec2002-05-21 15:53:24 +00001106 if (IS_TRACKED(op))
Neil Schemenauer43411b52001-08-30 00:05:51 +00001107 gc_list_remove(g);
Neil Schemenauer2880ae52002-05-04 05:35:20 +00001108 if (generations[0].count > 0) {
1109 generations[0].count--;
Neil Schemenauer43411b52001-08-30 00:05:51 +00001110 }
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001111 PyObject_FREE(g);
Neil Schemenauer43411b52001-08-30 00:05:51 +00001112}
1113
Neil Schemenauerfec4eb12002-04-12 02:41:03 +00001114/* for binary compatibility with 2.2 */
1115#undef _PyObject_GC_Del
1116void
1117_PyObject_GC_Del(PyObject *op)
1118{
1119 PyObject_GC_Del(op);
1120}