blob: b3a688c7f552d5db71b8845072c94103e57e12f5 [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
23#ifdef WITH_CYCLE_GC
24
Neil Schemenauer43411b52001-08-30 00:05:51 +000025/* Get an object's GC head */
26#define AS_GC(o) ((PyGC_Head *)(o)-1)
27
28/* Get the object given the GC head */
29#define FROM_GC(g) ((PyObject *)(((PyGC_Head *)g)+1))
30
Neil Schemenauera2b11ec2002-05-21 15:53:24 +000031/* True if an object is tracked by the GC */
32#define IS_TRACKED(o) ((AS_GC(o))->gc.gc_next != NULL)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000033
34/*** Global GC state ***/
35
Neil Schemenauer2880ae52002-05-04 05:35:20 +000036struct gc_generation {
37 PyGC_Head head;
38 int threshold; /* collection threshold */
39 int count; /* count of allocations or collections of younger
40 generations */
41};
42
43#define NUM_GENERATIONS 3
44#define GEN_HEAD(n) (&generations[n].head)
45
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000046/* linked lists of container objects */
Neil Schemenauer2880ae52002-05-04 05:35:20 +000047static struct gc_generation generations[NUM_GENERATIONS] = {
48 /* PyGC_Head, threshold, count */
49 {{{GEN_HEAD(0), GEN_HEAD(0), 0}}, 700, 0},
50 {{{GEN_HEAD(1), GEN_HEAD(1), 0}}, 10, 0},
51 {{{GEN_HEAD(2), GEN_HEAD(2), 0}}, 10, 0},
52};
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000053
Neil Schemenauer2880ae52002-05-04 05:35:20 +000054PyGC_Head *_PyGC_generation0 = GEN_HEAD(0);
55
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +000056static int enabled = 1; /* automatic collection enabled? */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000057
Neil Schemenauer43411b52001-08-30 00:05:51 +000058/* true if we are currently running the collector */
59static int collecting;
60
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000061/* set for debugging information */
62#define DEBUG_STATS (1<<0) /* print collection statistics */
63#define DEBUG_COLLECTABLE (1<<1) /* print collectable objects */
64#define DEBUG_UNCOLLECTABLE (1<<2) /* print uncollectable objects */
65#define DEBUG_INSTANCES (1<<3) /* print instances */
66#define DEBUG_OBJECTS (1<<4) /* print other objects */
Neil Schemenauer544de1e2000-09-22 15:22:38 +000067#define DEBUG_SAVEALL (1<<5) /* save all garbage in gc.garbage */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000068#define DEBUG_LEAK DEBUG_COLLECTABLE | \
69 DEBUG_UNCOLLECTABLE | \
70 DEBUG_INSTANCES | \
Neil Schemenauer544de1e2000-09-22 15:22:38 +000071 DEBUG_OBJECTS | \
72 DEBUG_SAVEALL
Jeremy Hyltonb709df32000-09-01 02:47:25 +000073static int debug;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000074
Tim Peters88396172002-06-30 17:56:40 +000075/* When a collection begins, gc_refs is set to ob_refcnt for, and only for,
76 * the objects in the generation being collected, called the "young"
77 * generation at that point. As collection proceeds, when it's determined
78 * that one of these can't be collected (e.g., because it's reachable from
79 * outside, or has a __del__ method), the object is moved out of young, and
80 * gc_refs is set to a negative value. The latter is so we can distinguish
81 * collection candidates from non-candidates just by looking at the object.
82 */
83/* Special gc_refs value, although any negative value means "moved". */
Neil Schemenauer43411b52001-08-30 00:05:51 +000084#define GC_MOVED -123
85
Tim Peters88396172002-06-30 17:56:40 +000086/* True iff an object is still a candidate for collection. */
87#define STILL_A_CANDIDATE(o) ((AS_GC(o))->gc.gc_refs >= 0)
Neil Schemenauera2b11ec2002-05-21 15:53:24 +000088
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000089/* list of uncollectable objects */
90static PyObject *garbage;
91
Jeremy Hyltonb709df32000-09-01 02:47:25 +000092/* Python string to use if unhandled exception occurs */
93static PyObject *gc_str;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000094
95/*** list functions ***/
96
97static void
98gc_list_init(PyGC_Head *list)
99{
Tim Peters9e4ca102001-10-11 18:31:31 +0000100 list->gc.gc_prev = list;
101 list->gc.gc_next = list;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000102}
103
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000104static int
105gc_list_is_empty(PyGC_Head *list)
106{
107 return (list->gc.gc_next == list);
108}
109
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000110static void
111gc_list_append(PyGC_Head *node, PyGC_Head *list)
112{
Tim Peters9e4ca102001-10-11 18:31:31 +0000113 node->gc.gc_next = list;
114 node->gc.gc_prev = list->gc.gc_prev;
115 node->gc.gc_prev->gc.gc_next = node;
116 list->gc.gc_prev = node;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000117}
118
119static void
120gc_list_remove(PyGC_Head *node)
121{
Tim Peters9e4ca102001-10-11 18:31:31 +0000122 node->gc.gc_prev->gc.gc_next = node->gc.gc_next;
123 node->gc.gc_next->gc.gc_prev = node->gc.gc_prev;
124 node->gc.gc_next = NULL; /* object is not currently tracked */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000125}
126
Tim Peters88396172002-06-30 17:56:40 +0000127static void
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000128gc_list_move(PyGC_Head *from, PyGC_Head *to)
129{
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000130 if (gc_list_is_empty(from)) {
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000131 gc_list_init(to);
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000132 }
133 else {
Tim Peters9e4ca102001-10-11 18:31:31 +0000134 to->gc.gc_next = from->gc.gc_next;
135 to->gc.gc_next->gc.gc_prev = to;
136 to->gc.gc_prev = from->gc.gc_prev;
137 to->gc.gc_prev->gc.gc_next = to;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000138 }
139 gc_list_init(from);
140}
141
142/* append a list onto another list, from becomes an empty list */
143static void
144gc_list_merge(PyGC_Head *from, PyGC_Head *to)
145{
146 PyGC_Head *tail;
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000147 if (!gc_list_is_empty(from)) {
Tim Peters9e4ca102001-10-11 18:31:31 +0000148 tail = to->gc.gc_prev;
149 tail->gc.gc_next = from->gc.gc_next;
150 tail->gc.gc_next->gc.gc_prev = tail;
151 to->gc.gc_prev = from->gc.gc_prev;
152 to->gc.gc_prev->gc.gc_next = to;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000153 }
154 gc_list_init(from);
155}
156
157static long
158gc_list_size(PyGC_Head *list)
159{
160 PyGC_Head *gc;
161 long n = 0;
Tim Peters9e4ca102001-10-11 18:31:31 +0000162 for (gc = list->gc.gc_next; gc != list; gc = gc->gc.gc_next) {
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000163 n++;
164 }
165 return n;
166}
167
168/*** end of list stuff ***/
169
170
Neil Schemenauer43411b52001-08-30 00:05:51 +0000171
Tim Peters88396172002-06-30 17:56:40 +0000172/* Set all gc_refs = ob_refcnt. After this, STILL_A_CANDIDATE(o) is true
173 * for all objects in containers, and false for all tracked gc objects not
174 * in containers (although see the comment in visit_decref).
175 */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000176static void
177update_refs(PyGC_Head *containers)
178{
Tim Peters9e4ca102001-10-11 18:31:31 +0000179 PyGC_Head *gc = containers->gc.gc_next;
180 for (; gc != containers; gc=gc->gc.gc_next) {
181 gc->gc.gc_refs = FROM_GC(gc)->ob_refcnt;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000182 }
183}
184
185static int
186visit_decref(PyObject *op, void *data)
187{
Tim Peters88396172002-06-30 17:56:40 +0000188 /* There's no point to decrementing gc_refs unless
189 * STILL_A_CANDIDATE(op) is true. It would take extra cycles to
190 * check that, though. If STILL_A_CANDIDATE(op) is false,
191 * decrementing gc_refs almost always makes it "even more negative",
192 * so doesn't change that STILL_A_CANDIDATE is false, and no harm is
193 * done. However, it's possible that, after many collections, this
194 * could underflow gc_refs in a long-lived old object. In that case,
195 * visit_move() may move the old object back to the generation
196 * getting collected. That would be a waste of time, but wouldn't
197 * cause an error.
198 */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000199 if (op && PyObject_IS_GC(op)) {
Tim Peters88396172002-06-30 17:56:40 +0000200 if (IS_TRACKED(op)) {
Tim Peters9e4ca102001-10-11 18:31:31 +0000201 AS_GC(op)->gc.gc_refs--;
Tim Peters88396172002-06-30 17:56:40 +0000202 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000203 }
204 return 0;
205}
206
207/* Subtract internal references from gc_refs */
208static void
209subtract_refs(PyGC_Head *containers)
210{
211 traverseproc traverse;
Tim Peters9e4ca102001-10-11 18:31:31 +0000212 PyGC_Head *gc = containers->gc.gc_next;
213 for (; gc != containers; gc=gc->gc.gc_next) {
Neil Schemenauer43411b52001-08-30 00:05:51 +0000214 traverse = FROM_GC(gc)->ob_type->tp_traverse;
215 (void) traverse(FROM_GC(gc),
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000216 (visitproc)visit_decref,
217 NULL);
218 }
219}
220
Tim Peters88396172002-06-30 17:56:40 +0000221/* Move objects with gc_refs > 0 to roots list. They can't be collected. */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000222static void
223move_roots(PyGC_Head *containers, PyGC_Head *roots)
224{
225 PyGC_Head *next;
Tim Peters9e4ca102001-10-11 18:31:31 +0000226 PyGC_Head *gc = containers->gc.gc_next;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000227 while (gc != containers) {
Tim Peters9e4ca102001-10-11 18:31:31 +0000228 next = gc->gc.gc_next;
229 if (gc->gc.gc_refs > 0) {
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000230 gc_list_remove(gc);
231 gc_list_append(gc, roots);
Tim Peters9e4ca102001-10-11 18:31:31 +0000232 gc->gc.gc_refs = GC_MOVED;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000233 }
234 gc = next;
235 }
236}
237
238static int
Neil Schemenauer43411b52001-08-30 00:05:51 +0000239visit_move(PyObject *op, PyGC_Head *tolist)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000240{
241 if (PyObject_IS_GC(op)) {
Tim Peters88396172002-06-30 17:56:40 +0000242 if (IS_TRACKED(op) && STILL_A_CANDIDATE(op)) {
Neil Schemenauera2b11ec2002-05-21 15:53:24 +0000243 PyGC_Head *gc = AS_GC(op);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000244 gc_list_remove(gc);
Neil Schemenauer43411b52001-08-30 00:05:51 +0000245 gc_list_append(gc, tolist);
Tim Peters9e4ca102001-10-11 18:31:31 +0000246 gc->gc.gc_refs = GC_MOVED;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000247 }
248 }
249 return 0;
250}
251
Tim Peters88396172002-06-30 17:56:40 +0000252/* Move candidates referenced from reachable to reachable set (they're no
253 * longer candidates).
254 */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000255static void
256move_root_reachable(PyGC_Head *reachable)
257{
258 traverseproc traverse;
Tim Peters9e4ca102001-10-11 18:31:31 +0000259 PyGC_Head *gc = reachable->gc.gc_next;
260 for (; gc != reachable; gc=gc->gc.gc_next) {
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000261 /* careful, reachable list is growing here */
Neil Schemenauer43411b52001-08-30 00:05:51 +0000262 PyObject *op = FROM_GC(gc);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000263 traverse = op->ob_type->tp_traverse;
264 (void) traverse(op,
Neil Schemenauer43411b52001-08-30 00:05:51 +0000265 (visitproc)visit_move,
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000266 (void *)reachable);
267 }
268}
269
Tim Peters88396172002-06-30 17:56:40 +0000270/* return true if object has a finalization method */
Neil Schemenauera765c122001-11-01 17:35:23 +0000271static int
272has_finalizer(PyObject *op)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000273{
Jeremy Hylton06257772000-08-31 15:10:24 +0000274 static PyObject *delstr = NULL;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000275 if (delstr == NULL) {
276 delstr = PyString_InternFromString("__del__");
Jeremy Hylton06257772000-08-31 15:10:24 +0000277 if (delstr == NULL)
278 Py_FatalError("PyGC: can't initialize __del__ string");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000279 }
Tim Petersdb865612001-11-01 19:35:45 +0000280 return (PyInstance_Check(op) ||
281 PyType_HasFeature(op->ob_type, Py_TPFLAGS_HEAPTYPE))
282 && PyObject_HasAttr(op, delstr);
Neil Schemenauera765c122001-11-01 17:35:23 +0000283}
284
285/* Move all objects with finalizers (instances with __del__) */
286static void
287move_finalizers(PyGC_Head *unreachable, PyGC_Head *finalizers)
288{
289 PyGC_Head *next;
290 PyGC_Head *gc = unreachable->gc.gc_next;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000291 for (; gc != unreachable; gc=next) {
Neil Schemenauer43411b52001-08-30 00:05:51 +0000292 PyObject *op = FROM_GC(gc);
Tim Peters9e4ca102001-10-11 18:31:31 +0000293 next = gc->gc.gc_next;
Neil Schemenauera765c122001-11-01 17:35:23 +0000294 if (has_finalizer(op)) {
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000295 gc_list_remove(gc);
296 gc_list_append(gc, finalizers);
Tim Peters88396172002-06-30 17:56:40 +0000297 gc->gc.gc_refs = GC_MOVED;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000298 }
299 }
300}
301
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000302/* Move objects referenced from roots to roots */
303static void
304move_finalizer_reachable(PyGC_Head *finalizers)
305{
306 traverseproc traverse;
Tim Peters9e4ca102001-10-11 18:31:31 +0000307 PyGC_Head *gc = finalizers->gc.gc_next;
308 for (; gc != finalizers; gc=gc->gc.gc_next) {
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000309 /* careful, finalizers list is growing here */
Neil Schemenauer43411b52001-08-30 00:05:51 +0000310 traverse = FROM_GC(gc)->ob_type->tp_traverse;
Tim Peters88396172002-06-30 17:56:40 +0000311 (void) traverse(FROM_GC(gc),
Neil Schemenauer43411b52001-08-30 00:05:51 +0000312 (visitproc)visit_move,
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000313 (void *)finalizers);
314 }
315}
316
317static void
Jeremy Hylton06257772000-08-31 15:10:24 +0000318debug_instance(char *msg, PyInstanceObject *inst)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000319{
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000320 char *cname;
Neil Schemenauera765c122001-11-01 17:35:23 +0000321 /* simple version of instance_repr */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000322 PyObject *classname = inst->in_class->cl_name;
323 if (classname != NULL && PyString_Check(classname))
324 cname = PyString_AsString(classname);
325 else
326 cname = "?";
Jeremy Hylton06257772000-08-31 15:10:24 +0000327 PySys_WriteStderr("gc: %.100s <%.100s instance at %p>\n",
328 msg, cname, inst);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000329}
330
331static void
Jeremy Hylton06257772000-08-31 15:10:24 +0000332debug_cycle(char *msg, PyObject *op)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000333{
334 if ((debug & DEBUG_INSTANCES) && PyInstance_Check(op)) {
Jeremy Hylton06257772000-08-31 15:10:24 +0000335 debug_instance(msg, (PyInstanceObject *)op);
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000336 }
337 else if (debug & DEBUG_OBJECTS) {
Jeremy Hylton06257772000-08-31 15:10:24 +0000338 PySys_WriteStderr("gc: %.100s <%.100s %p>\n",
339 msg, op->ob_type->tp_name, op);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000340 }
341}
342
343/* Handle uncollectable garbage (cycles with finalizers). */
344static void
345handle_finalizers(PyGC_Head *finalizers, PyGC_Head *old)
346{
347 PyGC_Head *gc;
348 if (garbage == NULL) {
349 garbage = PyList_New(0);
350 }
Tim Peters9e4ca102001-10-11 18:31:31 +0000351 for (gc = finalizers->gc.gc_next; gc != finalizers;
352 gc = finalizers->gc.gc_next) {
Neil Schemenauer43411b52001-08-30 00:05:51 +0000353 PyObject *op = FROM_GC(gc);
Neil Schemenauera765c122001-11-01 17:35:23 +0000354 if ((debug & DEBUG_SAVEALL) || has_finalizer(op)) {
355 /* If SAVEALL is not set then just append objects with
356 * finalizers to the list of garbage. All objects in
357 * the finalizers list are reachable from those
358 * objects. */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000359 PyList_Append(garbage, op);
360 }
Tim Peters88396172002-06-30 17:56:40 +0000361 /* object is now reachable again */
362 assert(!STILL_A_CANDIDATE(op));
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000363 gc_list_remove(gc);
364 gc_list_append(gc, old);
365 }
366}
367
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000368/* Break reference cycles by clearing the containers involved. This is
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000369 * tricky business as the lists can be changing and we don't know which
370 * objects may be freed. It is possible I screwed something up here. */
371static void
372delete_garbage(PyGC_Head *unreachable, PyGC_Head *old)
373{
374 inquiry clear;
375
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000376 while (!gc_list_is_empty(unreachable)) {
Tim Peters9e4ca102001-10-11 18:31:31 +0000377 PyGC_Head *gc = unreachable->gc.gc_next;
Neil Schemenauer43411b52001-08-30 00:05:51 +0000378 PyObject *op = FROM_GC(gc);
Tim Peters88396172002-06-30 17:56:40 +0000379
380 assert(STILL_A_CANDIDATE(op));
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000381 if (debug & DEBUG_SAVEALL) {
382 PyList_Append(garbage, op);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000383 }
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000384 else {
385 if ((clear = op->ob_type->tp_clear) != NULL) {
386 Py_INCREF(op);
Jeremy Hylton8a135182002-06-06 23:23:55 +0000387 clear(op);
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000388 Py_DECREF(op);
389 }
390 }
Tim Peters9e4ca102001-10-11 18:31:31 +0000391 if (unreachable->gc.gc_next == gc) {
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000392 /* object is still alive, move it, it may die later */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000393 gc_list_remove(gc);
394 gc_list_append(gc, old);
Tim Peters88396172002-06-30 17:56:40 +0000395 gc->gc.gc_refs = GC_MOVED;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000396 }
397 }
398}
399
400/* This is the main function. Read this to understand how the
401 * collection process works. */
402static long
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000403collect(int generation)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000404{
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000405 int i;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000406 long n = 0;
407 long m = 0;
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000408 PyGC_Head *young; /* the generation we are examining */
409 PyGC_Head *old; /* next older generation */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000410 PyGC_Head reachable;
411 PyGC_Head unreachable;
412 PyGC_Head finalizers;
413 PyGC_Head *gc;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000414
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000415 if (debug & DEBUG_STATS) {
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000416 PySys_WriteStderr("gc: collecting generation %d...\n",
417 generation);
418 PySys_WriteStderr("gc: objects in each generation:");
419 for (i = 0; i < NUM_GENERATIONS; i++) {
420 PySys_WriteStderr(" %ld", gc_list_size(GEN_HEAD(i)));
421 }
422 PySys_WriteStderr("\n");
423 }
424
425 /* update collection and allocation counters */
426 if (generation+1 < NUM_GENERATIONS)
427 generations[generation+1].count += 1;
428 for (i = 0; i <= generation; i++)
Neil Schemenauerc9051642002-06-28 19:16:04 +0000429 generations[i].count = 0;
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000430
431 /* merge younger generations with one we are currently collecting */
432 for (i = 0; i < generation; i++) {
433 gc_list_merge(GEN_HEAD(i), GEN_HEAD(generation));
434 }
435
436 /* handy references */
437 young = GEN_HEAD(generation);
438 if (generation < NUM_GENERATIONS-1) {
439 old = GEN_HEAD(generation+1);
440 } else {
441 old = GEN_HEAD(NUM_GENERATIONS-1);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000442 }
443
444 /* Using ob_refcnt and gc_refs, calculate which objects in the
445 * container set are reachable from outside the set (ie. have a
446 * refcount greater than 0 when all the references within the
447 * set are taken into account */
448 update_refs(young);
449 subtract_refs(young);
450
451 /* Move everything reachable from outside the set into the
452 * reachable set (ie. gc_refs > 0). Next, move everything
453 * reachable from objects in the reachable set. */
454 gc_list_init(&reachable);
455 move_roots(young, &reachable);
456 move_root_reachable(&reachable);
457
458 /* move unreachable objects to a temporary list, new objects can be
459 * allocated after this point */
460 gc_list_init(&unreachable);
461 gc_list_move(young, &unreachable);
462
463 /* move reachable objects to next generation */
464 gc_list_merge(&reachable, old);
465
466 /* Move objects reachable from finalizers, we can't safely delete
467 * them. Python programmers should take care not to create such
468 * things. For Python finalizers means instance objects with
469 * __del__ methods. */
470 gc_list_init(&finalizers);
471 move_finalizers(&unreachable, &finalizers);
472 move_finalizer_reachable(&finalizers);
473
474 /* Collect statistics on collectable objects found and print
475 * debugging information. */
Tim Peters9e4ca102001-10-11 18:31:31 +0000476 for (gc = unreachable.gc.gc_next; gc != &unreachable;
477 gc = gc->gc.gc_next) {
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000478 m++;
Jeremy Hylton06257772000-08-31 15:10:24 +0000479 if (debug & DEBUG_COLLECTABLE) {
Neil Schemenauer43411b52001-08-30 00:05:51 +0000480 debug_cycle("collectable", FROM_GC(gc));
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000481 }
482 }
483 /* call tp_clear on objects in the collectable set. This will cause
484 * the reference cycles to be broken. It may also cause some objects in
485 * finalizers to be freed */
486 delete_garbage(&unreachable, old);
487
488 /* Collect statistics on uncollectable objects found and print
489 * debugging information. */
Tim Peters9e4ca102001-10-11 18:31:31 +0000490 for (gc = finalizers.gc.gc_next; gc != &finalizers;
491 gc = gc->gc.gc_next) {
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000492 n++;
Jeremy Hylton06257772000-08-31 15:10:24 +0000493 if (debug & DEBUG_UNCOLLECTABLE) {
Neil Schemenauer43411b52001-08-30 00:05:51 +0000494 debug_cycle("uncollectable", FROM_GC(gc));
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000495 }
496 }
Jeremy Hylton06257772000-08-31 15:10:24 +0000497 if (debug & DEBUG_STATS) {
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000498 if (m == 0 && n == 0) {
Jeremy Hylton06257772000-08-31 15:10:24 +0000499 PySys_WriteStderr("gc: done.\n");
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000500 }
501 else {
Jeremy Hylton06257772000-08-31 15:10:24 +0000502 PySys_WriteStderr(
503 "gc: done, %ld unreachable, %ld uncollectable.\n",
504 n+m, n);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000505 }
506 }
507
508 /* Append instances in the uncollectable set to a Python
509 * reachable list of garbage. The programmer has to deal with
510 * this if they insist on creating this type of structure. */
511 handle_finalizers(&finalizers, old);
512
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000513 if (PyErr_Occurred()) {
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000514 if (gc_str == NULL) {
515 gc_str = PyString_FromString("garbage collection");
516 }
Jeremy Hyltonb709df32000-09-01 02:47:25 +0000517 PyErr_WriteUnraisable(gc_str);
518 Py_FatalError("unexpected exception during garbage collection");
519 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000520 return n+m;
521}
522
523static long
524collect_generations(void)
525{
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000526 int i;
Vladimir Marangozovb16714b2000-07-10 05:37:39 +0000527 long n = 0;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000528
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000529 /* Find the oldest generation (higest numbered) where the count
530 * exceeds the threshold. Objects in the that generation and
531 * generations younger than it will be collected. */
532 for (i = NUM_GENERATIONS-1; i >= 0; i--) {
533 if (generations[i].count > generations[i].threshold) {
534 n = collect(i);
535 break;
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000536 }
537 }
538 return n;
539}
540
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000541PyDoc_STRVAR(gc_enable__doc__,
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000542"enable() -> None\n"
543"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000544"Enable automatic garbage collection.\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000545
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000546static PyObject *
547gc_enable(PyObject *self, PyObject *args)
548{
549
550 if (!PyArg_ParseTuple(args, ":enable")) /* check no args */
551 return NULL;
552
553 enabled = 1;
554
555 Py_INCREF(Py_None);
556 return Py_None;
557}
558
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000559PyDoc_STRVAR(gc_disable__doc__,
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000560"disable() -> None\n"
561"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000562"Disable automatic garbage collection.\n");
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000563
564static PyObject *
565gc_disable(PyObject *self, PyObject *args)
566{
567
568 if (!PyArg_ParseTuple(args, ":disable")) /* check no args */
569 return NULL;
570
571 enabled = 0;
572
573 Py_INCREF(Py_None);
574 return Py_None;
575}
576
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000577PyDoc_STRVAR(gc_isenabled__doc__,
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000578"isenabled() -> status\n"
579"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000580"Returns true if automatic garbage collection is enabled.\n");
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000581
582static PyObject *
583gc_isenabled(PyObject *self, PyObject *args)
584{
585
586 if (!PyArg_ParseTuple(args, ":isenabled")) /* check no args */
587 return NULL;
588
589 return Py_BuildValue("i", enabled);
590}
591
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000592PyDoc_STRVAR(gc_collect__doc__,
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000593"collect() -> n\n"
594"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000595"Run a full collection. The number of unreachable objects is returned.\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000596
597static PyObject *
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000598gc_collect(PyObject *self, PyObject *args)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000599{
600 long n;
601
Fred Drakecc1be242000-07-12 04:42:23 +0000602 if (!PyArg_ParseTuple(args, ":collect")) /* check no args */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000603 return NULL;
604
Neil Schemenauere8c40cb2001-10-31 23:09:35 +0000605 if (collecting) {
606 n = 0; /* already collecting, don't do anything */
607 }
608 else {
609 collecting = 1;
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000610 n = collect(NUM_GENERATIONS - 1);
Neil Schemenauere8c40cb2001-10-31 23:09:35 +0000611 collecting = 0;
612 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000613
Neil Schemenauer7760cff2000-09-22 22:35:36 +0000614 return Py_BuildValue("l", n);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000615}
616
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000617PyDoc_STRVAR(gc_set_debug__doc__,
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000618"set_debug(flags) -> None\n"
619"\n"
620"Set the garbage collection debugging flags. Debugging information is\n"
621"written to sys.stderr.\n"
622"\n"
623"flags is an integer and can have the following bits turned on:\n"
624"\n"
625" DEBUG_STATS - Print statistics during collection.\n"
626" DEBUG_COLLECTABLE - Print collectable objects found.\n"
627" DEBUG_UNCOLLECTABLE - Print unreachable but uncollectable objects found.\n"
628" DEBUG_INSTANCES - Print instance objects.\n"
629" DEBUG_OBJECTS - Print objects other than instances.\n"
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000630" DEBUG_SAVEALL - Save objects to gc.garbage rather than freeing them.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000631" DEBUG_LEAK - Debug leaking programs (everything but STATS).\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000632
633static PyObject *
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000634gc_set_debug(PyObject *self, PyObject *args)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000635{
Neil Schemenauer7760cff2000-09-22 22:35:36 +0000636 if (!PyArg_ParseTuple(args, "i:set_debug", &debug))
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000637 return NULL;
638
639 Py_INCREF(Py_None);
640 return Py_None;
641}
642
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000643PyDoc_STRVAR(gc_get_debug__doc__,
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000644"get_debug() -> flags\n"
645"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000646"Get the garbage collection debugging flags.\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000647
648static PyObject *
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000649gc_get_debug(PyObject *self, PyObject *args)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000650{
Fred Drakecc1be242000-07-12 04:42:23 +0000651 if (!PyArg_ParseTuple(args, ":get_debug")) /* no args */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000652 return NULL;
653
654 return Py_BuildValue("i", debug);
655}
656
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000657PyDoc_STRVAR(gc_set_thresh__doc__,
Neal Norwitz2a47c0f2002-01-29 00:53:41 +0000658"set_threshold(threshold0, [threshold1, threshold2]) -> None\n"
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000659"\n"
660"Sets the collection thresholds. Setting threshold0 to zero disables\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000661"collection.\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000662
663static PyObject *
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000664gc_set_thresh(PyObject *self, PyObject *args)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000665{
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000666 int i;
667 if (!PyArg_ParseTuple(args, "i|ii:set_threshold",
668 &generations[0].threshold,
669 &generations[1].threshold,
670 &generations[2].threshold))
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000671 return NULL;
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000672 for (i = 2; i < NUM_GENERATIONS; i++) {
673 /* generations higher than 2 get the same threshold */
674 generations[i].threshold = generations[2].threshold;
675 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000676
677 Py_INCREF(Py_None);
678 return Py_None;
679}
680
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000681PyDoc_STRVAR(gc_get_thresh__doc__,
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000682"get_threshold() -> (threshold0, threshold1, threshold2)\n"
683"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000684"Return the current collection thresholds\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000685
686static PyObject *
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000687gc_get_thresh(PyObject *self, PyObject *args)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000688{
Fred Drakecc1be242000-07-12 04:42:23 +0000689 if (!PyArg_ParseTuple(args, ":get_threshold")) /* no args */
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000690 return NULL;
691
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000692 return Py_BuildValue("(iii)",
693 generations[0].threshold,
694 generations[1].threshold,
695 generations[2].threshold);
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000696}
697
Neil Schemenauer48c70342001-08-09 15:38:31 +0000698static int
Martin v. Löwis560da622001-11-24 09:24:51 +0000699referrersvisit(PyObject* obj, PyObject *objs)
Neil Schemenauer48c70342001-08-09 15:38:31 +0000700{
Martin v. Löwisc8fe77b2001-11-29 18:08:31 +0000701 int i;
702 for (i = 0; i < PyTuple_GET_SIZE(objs); i++)
703 if (PyTuple_GET_ITEM(objs, i) == obj)
704 return 1;
Neil Schemenauer48c70342001-08-09 15:38:31 +0000705 return 0;
706}
707
Neil Schemenauer17e7be62001-08-10 14:46:47 +0000708static int
Martin v. Löwis560da622001-11-24 09:24:51 +0000709gc_referrers_for(PyObject *objs, PyGC_Head *list, PyObject *resultlist)
Neil Schemenauer48c70342001-08-09 15:38:31 +0000710{
711 PyGC_Head *gc;
712 PyObject *obj;
713 traverseproc traverse;
Tim Peters9e4ca102001-10-11 18:31:31 +0000714 for (gc = list->gc.gc_next; gc != list; gc = gc->gc.gc_next) {
Neil Schemenauer43411b52001-08-30 00:05:51 +0000715 obj = FROM_GC(gc);
Neil Schemenauer48c70342001-08-09 15:38:31 +0000716 traverse = obj->ob_type->tp_traverse;
717 if (obj == objs || obj == resultlist)
718 continue;
Martin v. Löwis560da622001-11-24 09:24:51 +0000719 if (traverse(obj, (visitproc)referrersvisit, objs)) {
Neil Schemenauer17e7be62001-08-10 14:46:47 +0000720 if (PyList_Append(resultlist, obj) < 0)
721 return 0; /* error */
Neil Schemenauer48c70342001-08-09 15:38:31 +0000722 }
723 }
Neil Schemenauer17e7be62001-08-10 14:46:47 +0000724 return 1; /* no error */
Neil Schemenauer48c70342001-08-09 15:38:31 +0000725}
726
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000727PyDoc_STRVAR(gc_get_referrers__doc__,
Martin v. Löwis560da622001-11-24 09:24:51 +0000728"get_referrers(*objs) -> list\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000729Return the list of objects that directly refer to any of objs.");
Neil Schemenauer48c70342001-08-09 15:38:31 +0000730
Neil Schemenauer17e7be62001-08-10 14:46:47 +0000731static PyObject *
Martin v. Löwis560da622001-11-24 09:24:51 +0000732gc_get_referrers(PyObject *self, PyObject *args)
Neil Schemenauer48c70342001-08-09 15:38:31 +0000733{
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000734 int i;
Neil Schemenauer48c70342001-08-09 15:38:31 +0000735 PyObject *result = PyList_New(0);
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000736 for (i = 0; i < NUM_GENERATIONS; i++) {
737 if (!(gc_referrers_for(args, GEN_HEAD(i), result))) {
738 Py_DECREF(result);
739 return NULL;
740 }
Neil Schemenauer17e7be62001-08-10 14:46:47 +0000741 }
Neil Schemenauer48c70342001-08-09 15:38:31 +0000742 return result;
743}
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000744
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000745PyDoc_STRVAR(gc_get_objects__doc__,
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +0000746"get_objects() -> [...]\n"
747"\n"
748"Return a list of objects tracked by the collector (excluding the list\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000749"returned).\n");
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +0000750
751/* appending objects in a GC list to a Python list */
Martin v. Löwis155aad12001-12-02 12:21:34 +0000752static int
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +0000753append_objects(PyObject *py_list, PyGC_Head *gc_list)
754{
755 PyGC_Head *gc;
Tim Peters9e4ca102001-10-11 18:31:31 +0000756 for (gc = gc_list->gc.gc_next; gc != gc_list; gc = gc->gc.gc_next) {
Neil Schemenauer43411b52001-08-30 00:05:51 +0000757 PyObject *op = FROM_GC(gc);
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +0000758 if (op != py_list) {
Martin v. Löwis155aad12001-12-02 12:21:34 +0000759 if (PyList_Append(py_list, op)) {
760 return -1; /* exception */
761 }
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +0000762 }
763 }
Martin v. Löwis155aad12001-12-02 12:21:34 +0000764 return 0;
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +0000765}
766
767static PyObject *
768gc_get_objects(PyObject *self, PyObject *args)
769{
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000770 int i;
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +0000771 PyObject* result;
772
773 if (!PyArg_ParseTuple(args, ":get_objects")) /* check no args */
774 return NULL;
775 result = PyList_New(0);
Martin v. Löwisf8a6f242001-12-02 18:31:02 +0000776 if (result == NULL) {
777 return NULL;
778 }
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000779 for (i = 0; i < NUM_GENERATIONS; i++) {
780 if (append_objects(result, GEN_HEAD(i))) {
781 Py_DECREF(result);
782 return NULL;
783 }
Martin v. Löwis155aad12001-12-02 12:21:34 +0000784 }
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +0000785 return result;
786}
787
788
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000789PyDoc_STRVAR(gc__doc__,
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000790"This module provides access to the garbage collector for reference cycles.\n"
791"\n"
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000792"enable() -- Enable automatic garbage collection.\n"
793"disable() -- Disable automatic garbage collection.\n"
794"isenabled() -- Returns true if automatic collection is enabled.\n"
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000795"collect() -- Do a full collection right now.\n"
796"set_debug() -- Set debugging flags.\n"
797"get_debug() -- Get debugging flags.\n"
798"set_threshold() -- Set the collection thresholds.\n"
799"get_threshold() -- Return the current the collection thresholds.\n"
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +0000800"get_objects() -- Return a list of all objects tracked by the collector.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000801"get_referrers() -- Return the list of objects that refer to an object.\n");
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000802
803static PyMethodDef GcMethods[] = {
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000804 {"enable", gc_enable, METH_VARARGS, gc_enable__doc__},
805 {"disable", gc_disable, METH_VARARGS, gc_disable__doc__},
Vladimir Marangozovf9d20c32000-08-06 22:45:31 +0000806 {"isenabled", gc_isenabled, METH_VARARGS, gc_isenabled__doc__},
807 {"set_debug", gc_set_debug, METH_VARARGS, gc_set_debug__doc__},
808 {"get_debug", gc_get_debug, METH_VARARGS, gc_get_debug__doc__},
809 {"set_threshold", gc_set_thresh, METH_VARARGS, gc_set_thresh__doc__},
810 {"get_threshold", gc_get_thresh, METH_VARARGS, gc_get_thresh__doc__},
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000811 {"collect", gc_collect, METH_VARARGS, gc_collect__doc__},
Neil Schemenauerc7c8d8e2001-08-09 15:58:59 +0000812 {"get_objects", gc_get_objects,METH_VARARGS, gc_get_objects__doc__},
Martin v. Löwis560da622001-11-24 09:24:51 +0000813 {"get_referrers", gc_get_referrers, METH_VARARGS,
814 gc_get_referrers__doc__},
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000815 {NULL, NULL} /* Sentinel */
816};
817
818void
819initgc(void)
820{
821 PyObject *m;
822 PyObject *d;
823
824 m = Py_InitModule4("gc",
825 GcMethods,
826 gc__doc__,
827 NULL,
828 PYTHON_API_VERSION);
829 d = PyModule_GetDict(m);
830 if (garbage == NULL) {
831 garbage = PyList_New(0);
832 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000833 PyDict_SetItemString(d, "garbage", garbage);
834 PyDict_SetItemString(d, "DEBUG_STATS",
835 PyInt_FromLong(DEBUG_STATS));
836 PyDict_SetItemString(d, "DEBUG_COLLECTABLE",
837 PyInt_FromLong(DEBUG_COLLECTABLE));
838 PyDict_SetItemString(d, "DEBUG_UNCOLLECTABLE",
839 PyInt_FromLong(DEBUG_UNCOLLECTABLE));
840 PyDict_SetItemString(d, "DEBUG_INSTANCES",
841 PyInt_FromLong(DEBUG_INSTANCES));
842 PyDict_SetItemString(d, "DEBUG_OBJECTS",
843 PyInt_FromLong(DEBUG_OBJECTS));
Neil Schemenauer544de1e2000-09-22 15:22:38 +0000844 PyDict_SetItemString(d, "DEBUG_SAVEALL",
845 PyInt_FromLong(DEBUG_SAVEALL));
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000846 PyDict_SetItemString(d, "DEBUG_LEAK",
847 PyInt_FromLong(DEBUG_LEAK));
848}
849
Neil Schemenauer43411b52001-08-30 00:05:51 +0000850/* for debugging */
851void _PyGC_Dump(PyGC_Head *g)
852{
853 _PyObject_Dump(FROM_GC(g));
854}
855
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000856#endif /* WITH_CYCLE_GC */
Neil Schemenauer43411b52001-08-30 00:05:51 +0000857
858/* extension modules might be compiled with GC support so these
859 functions must always be available */
860
Neil Schemenauerfec4eb12002-04-12 02:41:03 +0000861#undef PyObject_GC_Track
862#undef PyObject_GC_UnTrack
863#undef PyObject_GC_Del
864#undef _PyObject_GC_Malloc
865
Neil Schemenauer43411b52001-08-30 00:05:51 +0000866void
Neil Schemenauerfec4eb12002-04-12 02:41:03 +0000867PyObject_GC_Track(void *op)
Neil Schemenauer43411b52001-08-30 00:05:51 +0000868{
869 _PyObject_GC_TRACK(op);
870}
871
Neil Schemenauerfec4eb12002-04-12 02:41:03 +0000872/* for binary compatibility with 2.2 */
Neil Schemenauer43411b52001-08-30 00:05:51 +0000873void
Neil Schemenauerfec4eb12002-04-12 02:41:03 +0000874_PyObject_GC_Track(PyObject *op)
875{
876 PyObject_GC_Track(op);
877}
878
879void
880PyObject_GC_UnTrack(void *op)
Neil Schemenauer43411b52001-08-30 00:05:51 +0000881{
Neil Schemenauerb8833102002-03-29 03:04:25 +0000882#ifdef WITH_CYCLE_GC
Neil Schemenauera2b11ec2002-05-21 15:53:24 +0000883 if (IS_TRACKED(op))
Guido van Rossumff413af2002-03-28 20:34:59 +0000884 _PyObject_GC_UNTRACK(op);
Neil Schemenauerb8833102002-03-29 03:04:25 +0000885#endif
Neil Schemenauer43411b52001-08-30 00:05:51 +0000886}
887
Neil Schemenauerfec4eb12002-04-12 02:41:03 +0000888/* for binary compatibility with 2.2 */
889void
890_PyObject_GC_UnTrack(PyObject *op)
891{
892 PyObject_GC_UnTrack(op);
893}
894
Neil Schemenauer43411b52001-08-30 00:05:51 +0000895PyObject *
Neil Schemenauerfec4eb12002-04-12 02:41:03 +0000896_PyObject_GC_Malloc(size_t basicsize)
Neil Schemenauer43411b52001-08-30 00:05:51 +0000897{
898 PyObject *op;
899#ifdef WITH_CYCLE_GC
Neil Schemenauerfec4eb12002-04-12 02:41:03 +0000900 PyGC_Head *g = PyObject_MALLOC(sizeof(PyGC_Head) + basicsize);
Neil Schemenauer43411b52001-08-30 00:05:51 +0000901 if (g == NULL)
Jeremy Hylton8a135182002-06-06 23:23:55 +0000902 return PyErr_NoMemory();
Tim Peters9e4ca102001-10-11 18:31:31 +0000903 g->gc.gc_next = NULL;
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000904 generations[0].count++; /* number of allocated GC objects */
905 if (generations[0].count > generations[0].threshold &&
Neil Schemenauer43411b52001-08-30 00:05:51 +0000906 enabled &&
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000907 generations[0].threshold &&
Neil Schemenauer43411b52001-08-30 00:05:51 +0000908 !collecting &&
909 !PyErr_Occurred()) {
910 collecting = 1;
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000911 collect_generations();
Neil Schemenauer43411b52001-08-30 00:05:51 +0000912 collecting = 0;
913 }
914 op = FROM_GC(g);
915#else
Neil Schemenauerfec4eb12002-04-12 02:41:03 +0000916 op = PyObject_MALLOC(basicsize);
Neil Schemenauer43411b52001-08-30 00:05:51 +0000917 if (op == NULL)
Jeremy Hylton8a135182002-06-06 23:23:55 +0000918 return PyErr_NoMemory();
Neil Schemenauer43411b52001-08-30 00:05:51 +0000919
920#endif
921 return op;
922}
923
924PyObject *
925_PyObject_GC_New(PyTypeObject *tp)
926{
Neil Schemenauerfec4eb12002-04-12 02:41:03 +0000927 PyObject *op = _PyObject_GC_Malloc(_PyObject_SIZE(tp));
Tim Petersfa8efab2002-04-28 01:57:25 +0000928 if (op != NULL)
929 op = PyObject_INIT(op, tp);
930 return op;
Neil Schemenauer43411b52001-08-30 00:05:51 +0000931}
932
933PyVarObject *
Tim Peters6d483d32001-10-06 21:27:34 +0000934_PyObject_GC_NewVar(PyTypeObject *tp, int nitems)
Neil Schemenauer43411b52001-08-30 00:05:51 +0000935{
Neil Schemenauerfec4eb12002-04-12 02:41:03 +0000936 const size_t size = _PyObject_VAR_SIZE(tp, nitems);
937 PyVarObject *op = (PyVarObject *) _PyObject_GC_Malloc(size);
Tim Petersfa8efab2002-04-28 01:57:25 +0000938 if (op != NULL)
939 op = PyObject_INIT_VAR(op, tp, nitems);
940 return op;
Neil Schemenauer43411b52001-08-30 00:05:51 +0000941}
942
943PyVarObject *
Tim Peters6d483d32001-10-06 21:27:34 +0000944_PyObject_GC_Resize(PyVarObject *op, int nitems)
Neil Schemenauer43411b52001-08-30 00:05:51 +0000945{
Tim Petersf2a67da2001-10-07 03:54:51 +0000946 const size_t basicsize = _PyObject_VAR_SIZE(op->ob_type, nitems);
Neil Schemenauer43411b52001-08-30 00:05:51 +0000947#ifdef WITH_CYCLE_GC
948 PyGC_Head *g = AS_GC(op);
Neil Schemenauerfec4eb12002-04-12 02:41:03 +0000949 g = PyObject_REALLOC(g, sizeof(PyGC_Head) + basicsize);
Neil Schemenauer43411b52001-08-30 00:05:51 +0000950 if (g == NULL)
951 return (PyVarObject *)PyErr_NoMemory();
952 op = (PyVarObject *) FROM_GC(g);
953#else
Neil Schemenauerfec4eb12002-04-12 02:41:03 +0000954 op = PyObject_REALLOC(op, basicsize);
Neil Schemenauer43411b52001-08-30 00:05:51 +0000955 if (op == NULL)
956 return (PyVarObject *)PyErr_NoMemory();
957#endif
Tim Peters6d483d32001-10-06 21:27:34 +0000958 op->ob_size = nitems;
Neil Schemenauer43411b52001-08-30 00:05:51 +0000959 return op;
960}
961
962void
Neil Schemenauerfec4eb12002-04-12 02:41:03 +0000963PyObject_GC_Del(void *op)
Neil Schemenauer43411b52001-08-30 00:05:51 +0000964{
965#ifdef WITH_CYCLE_GC
966 PyGC_Head *g = AS_GC(op);
Neil Schemenauera2b11ec2002-05-21 15:53:24 +0000967 if (IS_TRACKED(op))
Neil Schemenauer43411b52001-08-30 00:05:51 +0000968 gc_list_remove(g);
Neil Schemenauer2880ae52002-05-04 05:35:20 +0000969 if (generations[0].count > 0) {
970 generations[0].count--;
Neil Schemenauer43411b52001-08-30 00:05:51 +0000971 }
Neil Schemenauerfec4eb12002-04-12 02:41:03 +0000972 PyObject_FREE(g);
Neil Schemenauer43411b52001-08-30 00:05:51 +0000973#else
Neil Schemenauerfec4eb12002-04-12 02:41:03 +0000974 PyObject_FREE(op);
Neil Schemenauer43411b52001-08-30 00:05:51 +0000975#endif
976}
977
Neil Schemenauerfec4eb12002-04-12 02:41:03 +0000978/* for binary compatibility with 2.2 */
979#undef _PyObject_GC_Del
980void
981_PyObject_GC_Del(PyObject *op)
982{
983 PyObject_GC_Del(op);
984}