~ubuntu-branches/ubuntu/natty/python3.1/natty-security

« back to all changes in this revision

Viewing changes to Modules/gcmodule.c

  • Committer: Bazaar Package Importer
  • Author(s): Matthias Klose
  • Date: 2010-07-06 16:52:42 UTC
  • mfrom: (1.2.1 upstream) (2.1.11 sid)
  • Revision ID: james.westby@ubuntu.com-20100706165242-2xv4i019r3et6c0j
Tags: 3.1.2+20100706-1ubuntu1
* Merge with Debian; remaining changes:
  - Regenerate the control file.
  - Add debian/patches/overwrite-semaphore-check for Lucid buildds.

Show diffs side-by-side

added added

removed removed

Lines of Context:
24
24
*/
25
25
 
26
26
#include "Python.h"
27
 
#include "frameobject.h"        /* for PyFrame_ClearFreeList */
 
27
#include "frameobject.h"        /* for PyFrame_ClearFreeList */
28
28
 
29
29
/* Get an object's GC head */
30
30
#define AS_GC(o) ((PyGC_Head *)(o)-1)
35
35
/*** Global GC state ***/
36
36
 
37
37
struct gc_generation {
38
 
        PyGC_Head head;
39
 
        int threshold; /* collection threshold */
40
 
        int count; /* count of allocations or collections of younger
41
 
                      generations */
 
38
    PyGC_Head head;
 
39
    int threshold; /* collection threshold */
 
40
    int count; /* count of allocations or collections of younger
 
41
                  generations */
42
42
};
43
43
 
44
44
#define NUM_GENERATIONS 3
46
46
 
47
47
/* linked lists of container objects */
48
48
static struct gc_generation generations[NUM_GENERATIONS] = {
49
 
        /* PyGC_Head,                           threshold,      count */
50
 
        {{{GEN_HEAD(0), GEN_HEAD(0), 0}},       700,            0},
51
 
        {{{GEN_HEAD(1), GEN_HEAD(1), 0}},       10,             0},
52
 
        {{{GEN_HEAD(2), GEN_HEAD(2), 0}},       10,             0},
 
49
    /* PyGC_Head,                               threshold,      count */
 
50
    {{{GEN_HEAD(0), GEN_HEAD(0), 0}},           700,            0},
 
51
    {{{GEN_HEAD(1), GEN_HEAD(1), 0}},           10,             0},
 
52
    {{{GEN_HEAD(2), GEN_HEAD(2), 0}},           10,             0},
53
53
};
54
54
 
55
55
PyGC_Head *_PyGC_generation0 = GEN_HEAD(0);
91
91
 
92
92
   In addition to the various configurable thresholds, we only trigger a
93
93
   full collection if the ratio
94
 
        long_lived_pending / long_lived_total
 
94
    long_lived_pending / long_lived_total
95
95
   is above a given value (hardwired to 25%).
96
96
 
97
97
   The reason is that, while "non-full" collections (i.e., collections of
113
113
 
114
114
   This heuristic was suggested by Martin von Löwis on python-dev in
115
115
   June 2008. His original analysis and proposal can be found at:
116
 
        http://mail.python.org/pipermail/python-dev/2008-June/080579.html
 
116
    http://mail.python.org/pipermail/python-dev/2008-June/080579.html
117
117
*/
118
118
 
119
119
 
120
120
/* set for debugging information */
121
 
#define DEBUG_STATS             (1<<0) /* print collection statistics */
122
 
#define DEBUG_COLLECTABLE       (1<<1) /* print collectable objects */
123
 
#define DEBUG_UNCOLLECTABLE     (1<<2) /* print uncollectable objects */
124
 
#define DEBUG_SAVEALL           (1<<5) /* save all garbage in gc.garbage */
125
 
#define DEBUG_LEAK              DEBUG_COLLECTABLE | \
126
 
                                DEBUG_UNCOLLECTABLE | \
127
 
                                DEBUG_SAVEALL
 
121
#define DEBUG_STATS             (1<<0) /* print collection statistics */
 
122
#define DEBUG_COLLECTABLE       (1<<1) /* print collectable objects */
 
123
#define DEBUG_UNCOLLECTABLE     (1<<2) /* print uncollectable objects */
 
124
#define DEBUG_SAVEALL           (1<<5) /* save all garbage in gc.garbage */
 
125
#define DEBUG_LEAK              DEBUG_COLLECTABLE | \
 
126
                DEBUG_UNCOLLECTABLE | \
 
127
                DEBUG_SAVEALL
128
128
static int debug;
129
129
static PyObject *tmod = NULL;
130
130
 
167
167
    it has a __del__ method), its gc_refs is restored to GC_REACHABLE again.
168
168
----------------------------------------------------------------------------
169
169
*/
170
 
#define GC_UNTRACKED                    _PyGC_REFS_UNTRACKED
171
 
#define GC_REACHABLE                    _PyGC_REFS_REACHABLE
172
 
#define GC_TENTATIVELY_UNREACHABLE      _PyGC_REFS_TENTATIVELY_UNREACHABLE
 
170
#define GC_UNTRACKED                    _PyGC_REFS_UNTRACKED
 
171
#define GC_REACHABLE                    _PyGC_REFS_REACHABLE
 
172
#define GC_TENTATIVELY_UNREACHABLE      _PyGC_REFS_TENTATIVELY_UNREACHABLE
173
173
 
174
174
#define IS_TRACKED(o) ((AS_GC(o))->gc.gc_refs != GC_UNTRACKED)
175
175
#define IS_REACHABLE(o) ((AS_GC(o))->gc.gc_refs == GC_REACHABLE)
176
176
#define IS_TENTATIVELY_UNREACHABLE(o) ( \
177
 
        (AS_GC(o))->gc.gc_refs == GC_TENTATIVELY_UNREACHABLE)
 
177
    (AS_GC(o))->gc.gc_refs == GC_TENTATIVELY_UNREACHABLE)
178
178
 
179
179
/*** list functions ***/
180
180
 
181
181
static void
182
182
gc_list_init(PyGC_Head *list)
183
183
{
184
 
        list->gc.gc_prev = list;
185
 
        list->gc.gc_next = list;
 
184
    list->gc.gc_prev = list;
 
185
    list->gc.gc_next = list;
186
186
}
187
187
 
188
188
static int
189
189
gc_list_is_empty(PyGC_Head *list)
190
190
{
191
 
        return (list->gc.gc_next == list);
 
191
    return (list->gc.gc_next == list);
192
192
}
193
193
 
194
194
#if 0
197
197
static void
198
198
gc_list_append(PyGC_Head *node, PyGC_Head *list)
199
199
{
200
 
        node->gc.gc_next = list;
201
 
        node->gc.gc_prev = list->gc.gc_prev;
202
 
        node->gc.gc_prev->gc.gc_next = node;
203
 
        list->gc.gc_prev = node;
 
200
    node->gc.gc_next = list;
 
201
    node->gc.gc_prev = list->gc.gc_prev;
 
202
    node->gc.gc_prev->gc.gc_next = node;
 
203
    list->gc.gc_prev = node;
204
204
}
205
205
#endif
206
206
 
208
208
static void
209
209
gc_list_remove(PyGC_Head *node)
210
210
{
211
 
        node->gc.gc_prev->gc.gc_next = node->gc.gc_next;
212
 
        node->gc.gc_next->gc.gc_prev = node->gc.gc_prev;
213
 
        node->gc.gc_next = NULL; /* object is not currently tracked */
 
211
    node->gc.gc_prev->gc.gc_next = node->gc.gc_next;
 
212
    node->gc.gc_next->gc.gc_prev = node->gc.gc_prev;
 
213
    node->gc.gc_next = NULL; /* object is not currently tracked */
214
214
}
215
215
 
216
216
/* Move `node` from the gc list it's currently in (which is not explicitly
220
220
static void
221
221
gc_list_move(PyGC_Head *node, PyGC_Head *list)
222
222
{
223
 
        PyGC_Head *new_prev;
224
 
        PyGC_Head *current_prev = node->gc.gc_prev;
225
 
        PyGC_Head *current_next = node->gc.gc_next;
226
 
        /* Unlink from current list. */
227
 
        current_prev->gc.gc_next = current_next;
228
 
        current_next->gc.gc_prev = current_prev;
229
 
        /* Relink at end of new list. */
230
 
        new_prev = node->gc.gc_prev = list->gc.gc_prev;
231
 
        new_prev->gc.gc_next = list->gc.gc_prev = node;
232
 
        node->gc.gc_next = list;
 
223
    PyGC_Head *new_prev;
 
224
    PyGC_Head *current_prev = node->gc.gc_prev;
 
225
    PyGC_Head *current_next = node->gc.gc_next;
 
226
    /* Unlink from current list. */
 
227
    current_prev->gc.gc_next = current_next;
 
228
    current_next->gc.gc_prev = current_prev;
 
229
    /* Relink at end of new list. */
 
230
    new_prev = node->gc.gc_prev = list->gc.gc_prev;
 
231
    new_prev->gc.gc_next = list->gc.gc_prev = node;
 
232
    node->gc.gc_next = list;
233
233
}
234
234
 
235
235
/* append list `from` onto list `to`; `from` becomes an empty list */
236
236
static void
237
237
gc_list_merge(PyGC_Head *from, PyGC_Head *to)
238
238
{
239
 
        PyGC_Head *tail;
240
 
        assert(from != to);
241
 
        if (!gc_list_is_empty(from)) {
242
 
                tail = to->gc.gc_prev;
243
 
                tail->gc.gc_next = from->gc.gc_next;
244
 
                tail->gc.gc_next->gc.gc_prev = tail;
245
 
                to->gc.gc_prev = from->gc.gc_prev;
246
 
                to->gc.gc_prev->gc.gc_next = to;
247
 
        }
248
 
        gc_list_init(from);
 
239
    PyGC_Head *tail;
 
240
    assert(from != to);
 
241
    if (!gc_list_is_empty(from)) {
 
242
        tail = to->gc.gc_prev;
 
243
        tail->gc.gc_next = from->gc.gc_next;
 
244
        tail->gc.gc_next->gc.gc_prev = tail;
 
245
        to->gc.gc_prev = from->gc.gc_prev;
 
246
        to->gc.gc_prev->gc.gc_next = to;
 
247
    }
 
248
    gc_list_init(from);
249
249
}
250
250
 
251
251
static Py_ssize_t
252
252
gc_list_size(PyGC_Head *list)
253
253
{
254
 
        PyGC_Head *gc;
255
 
        Py_ssize_t n = 0;
256
 
        for (gc = list->gc.gc_next; gc != list; gc = gc->gc.gc_next) {
257
 
                n++;
258
 
        }
259
 
        return n;
 
254
    PyGC_Head *gc;
 
255
    Py_ssize_t n = 0;
 
256
    for (gc = list->gc.gc_next; gc != list; gc = gc->gc.gc_next) {
 
257
        n++;
 
258
    }
 
259
    return n;
260
260
}
261
261
 
262
262
/* Append objects in a GC list to a Python list.
265
265
static int
266
266
append_objects(PyObject *py_list, PyGC_Head *gc_list)
267
267
{
268
 
        PyGC_Head *gc;
269
 
        for (gc = gc_list->gc.gc_next; gc != gc_list; gc = gc->gc.gc_next) {
270
 
                PyObject *op = FROM_GC(gc);
271
 
                if (op != py_list) {
272
 
                        if (PyList_Append(py_list, op)) {
273
 
                                return -1; /* exception */
274
 
                        }
275
 
                }
276
 
        }
277
 
        return 0;
 
268
    PyGC_Head *gc;
 
269
    for (gc = gc_list->gc.gc_next; gc != gc_list; gc = gc->gc.gc_next) {
 
270
        PyObject *op = FROM_GC(gc);
 
271
        if (op != py_list) {
 
272
            if (PyList_Append(py_list, op)) {
 
273
                return -1; /* exception */
 
274
            }
 
275
        }
 
276
    }
 
277
    return 0;
278
278
}
279
279
 
280
280
/*** end of list stuff ***/
287
287
static void
288
288
update_refs(PyGC_Head *containers)
289
289
{
290
 
        PyGC_Head *gc = containers->gc.gc_next;
291
 
        for (; gc != containers; gc = gc->gc.gc_next) {
292
 
                assert(gc->gc.gc_refs == GC_REACHABLE);
293
 
                gc->gc.gc_refs = Py_REFCNT(FROM_GC(gc));
294
 
                /* Python's cyclic gc should never see an incoming refcount
295
 
                 * of 0:  if something decref'ed to 0, it should have been
296
 
                 * deallocated immediately at that time.
297
 
                 * Possible cause (if the assert triggers):  a tp_dealloc
298
 
                 * routine left a gc-aware object tracked during its teardown
299
 
                 * phase, and did something-- or allowed something to happen --
300
 
                 * that called back into Python.  gc can trigger then, and may
301
 
                 * see the still-tracked dying object.  Before this assert
302
 
                 * was added, such mistakes went on to allow gc to try to
303
 
                 * delete the object again.  In a debug build, that caused
304
 
                 * a mysterious segfault, when _Py_ForgetReference tried
305
 
                 * to remove the object from the doubly-linked list of all
306
 
                 * objects a second time.  In a release build, an actual
307
 
                 * double deallocation occurred, which leads to corruption
308
 
                 * of the allocator's internal bookkeeping pointers.  That's
309
 
                 * so serious that maybe this should be a release-build
310
 
                 * check instead of an assert?
311
 
                 */
312
 
                assert(gc->gc.gc_refs != 0);
313
 
        }
 
290
    PyGC_Head *gc = containers->gc.gc_next;
 
291
    for (; gc != containers; gc = gc->gc.gc_next) {
 
292
        assert(gc->gc.gc_refs == GC_REACHABLE);
 
293
        gc->gc.gc_refs = Py_REFCNT(FROM_GC(gc));
 
294
        /* Python's cyclic gc should never see an incoming refcount
 
295
         * of 0:  if something decref'ed to 0, it should have been
 
296
         * deallocated immediately at that time.
 
297
         * Possible cause (if the assert triggers):  a tp_dealloc
 
298
         * routine left a gc-aware object tracked during its teardown
 
299
         * phase, and did something-- or allowed something to happen --
 
300
         * that called back into Python.  gc can trigger then, and may
 
301
         * see the still-tracked dying object.  Before this assert
 
302
         * was added, such mistakes went on to allow gc to try to
 
303
         * delete the object again.  In a debug build, that caused
 
304
         * a mysterious segfault, when _Py_ForgetReference tried
 
305
         * to remove the object from the doubly-linked list of all
 
306
         * objects a second time.  In a release build, an actual
 
307
         * double deallocation occurred, which leads to corruption
 
308
         * of the allocator's internal bookkeeping pointers.  That's
 
309
         * so serious that maybe this should be a release-build
 
310
         * check instead of an assert?
 
311
         */
 
312
        assert(gc->gc.gc_refs != 0);
 
313
    }
314
314
}
315
315
 
316
316
/* A traversal callback for subtract_refs. */
317
317
static int
318
318
visit_decref(PyObject *op, void *data)
319
319
{
320
 
        assert(op != NULL);
321
 
        if (PyObject_IS_GC(op)) {
322
 
                PyGC_Head *gc = AS_GC(op);
323
 
                /* We're only interested in gc_refs for objects in the
324
 
                 * generation being collected, which can be recognized
325
 
                 * because only they have positive gc_refs.
326
 
                 */
327
 
                assert(gc->gc.gc_refs != 0); /* else refcount was too small */
328
 
                if (gc->gc.gc_refs > 0)
329
 
                        gc->gc.gc_refs--;
330
 
        }
331
 
        return 0;
 
320
    assert(op != NULL);
 
321
    if (PyObject_IS_GC(op)) {
 
322
        PyGC_Head *gc = AS_GC(op);
 
323
        /* We're only interested in gc_refs for objects in the
 
324
         * generation being collected, which can be recognized
 
325
         * because only they have positive gc_refs.
 
326
         */
 
327
        assert(gc->gc.gc_refs != 0); /* else refcount was too small */
 
328
        if (gc->gc.gc_refs > 0)
 
329
            gc->gc.gc_refs--;
 
330
    }
 
331
    return 0;
332
332
}
333
333
 
334
334
/* Subtract internal references from gc_refs.  After this, gc_refs is >= 0
339
339
static void
340
340
subtract_refs(PyGC_Head *containers)
341
341
{
342
 
        traverseproc traverse;
343
 
        PyGC_Head *gc = containers->gc.gc_next;
344
 
        for (; gc != containers; gc=gc->gc.gc_next) {
345
 
                traverse = Py_TYPE(FROM_GC(gc))->tp_traverse;
346
 
                (void) traverse(FROM_GC(gc),
347
 
                               (visitproc)visit_decref,
348
 
                               NULL);
349
 
        }
 
342
    traverseproc traverse;
 
343
    PyGC_Head *gc = containers->gc.gc_next;
 
344
    for (; gc != containers; gc=gc->gc.gc_next) {
 
345
        traverse = Py_TYPE(FROM_GC(gc))->tp_traverse;
 
346
        (void) traverse(FROM_GC(gc),
 
347
                       (visitproc)visit_decref,
 
348
                       NULL);
 
349
    }
350
350
}
351
351
 
352
352
/* A traversal callback for move_unreachable. */
353
353
static int
354
354
visit_reachable(PyObject *op, PyGC_Head *reachable)
355
355
{
356
 
        if (PyObject_IS_GC(op)) {
357
 
                PyGC_Head *gc = AS_GC(op);
358
 
                const Py_ssize_t gc_refs = gc->gc.gc_refs;
 
356
    if (PyObject_IS_GC(op)) {
 
357
        PyGC_Head *gc = AS_GC(op);
 
358
        const Py_ssize_t gc_refs = gc->gc.gc_refs;
359
359
 
360
 
                if (gc_refs == 0) {
361
 
                        /* This is in move_unreachable's 'young' list, but
362
 
                         * the traversal hasn't yet gotten to it.  All
363
 
                         * we need to do is tell move_unreachable that it's
364
 
                         * reachable.
365
 
                         */
366
 
                        gc->gc.gc_refs = 1;
367
 
                }
368
 
                else if (gc_refs == GC_TENTATIVELY_UNREACHABLE) {
369
 
                        /* This had gc_refs = 0 when move_unreachable got
370
 
                         * to it, but turns out it's reachable after all.
371
 
                         * Move it back to move_unreachable's 'young' list,
372
 
                         * and move_unreachable will eventually get to it
373
 
                         * again.
374
 
                         */
375
 
                        gc_list_move(gc, reachable);
376
 
                        gc->gc.gc_refs = 1;
377
 
                }
378
 
                /* Else there's nothing to do.
379
 
                 * If gc_refs > 0, it must be in move_unreachable's 'young'
380
 
                 * list, and move_unreachable will eventually get to it.
381
 
                 * If gc_refs == GC_REACHABLE, it's either in some other
382
 
                 * generation so we don't care about it, or move_unreachable
383
 
                 * already dealt with it.
384
 
                 * If gc_refs == GC_UNTRACKED, it must be ignored.
385
 
                 */
386
 
                 else {
387
 
                        assert(gc_refs > 0
388
 
                               || gc_refs == GC_REACHABLE
389
 
                               || gc_refs == GC_UNTRACKED);
390
 
                 }
391
 
        }
392
 
        return 0;
 
360
        if (gc_refs == 0) {
 
361
            /* This is in move_unreachable's 'young' list, but
 
362
             * the traversal hasn't yet gotten to it.  All
 
363
             * we need to do is tell move_unreachable that it's
 
364
             * reachable.
 
365
             */
 
366
            gc->gc.gc_refs = 1;
 
367
        }
 
368
        else if (gc_refs == GC_TENTATIVELY_UNREACHABLE) {
 
369
            /* This had gc_refs = 0 when move_unreachable got
 
370
             * to it, but turns out it's reachable after all.
 
371
             * Move it back to move_unreachable's 'young' list,
 
372
             * and move_unreachable will eventually get to it
 
373
             * again.
 
374
             */
 
375
            gc_list_move(gc, reachable);
 
376
            gc->gc.gc_refs = 1;
 
377
        }
 
378
        /* Else there's nothing to do.
 
379
         * If gc_refs > 0, it must be in move_unreachable's 'young'
 
380
         * list, and move_unreachable will eventually get to it.
 
381
         * If gc_refs == GC_REACHABLE, it's either in some other
 
382
         * generation so we don't care about it, or move_unreachable
 
383
         * already dealt with it.
 
384
         * If gc_refs == GC_UNTRACKED, it must be ignored.
 
385
         */
 
386
         else {
 
387
            assert(gc_refs > 0
 
388
                   || gc_refs == GC_REACHABLE
 
389
                   || gc_refs == GC_UNTRACKED);
 
390
         }
 
391
    }
 
392
    return 0;
393
393
}
394
394
 
395
395
/* Move the unreachable objects from young to unreachable.  After this,
403
403
static void
404
404
move_unreachable(PyGC_Head *young, PyGC_Head *unreachable)
405
405
{
406
 
        PyGC_Head *gc = young->gc.gc_next;
407
 
 
408
 
        /* Invariants:  all objects "to the left" of us in young have gc_refs
409
 
         * = GC_REACHABLE, and are indeed reachable (directly or indirectly)
410
 
         * from outside the young list as it was at entry.  All other objects
411
 
         * from the original young "to the left" of us are in unreachable now,
412
 
         * and have gc_refs = GC_TENTATIVELY_UNREACHABLE.  All objects to the
413
 
         * left of us in 'young' now have been scanned, and no objects here
414
 
         * or to the right have been scanned yet.
415
 
         */
416
 
 
417
 
        while (gc != young) {
418
 
                PyGC_Head *next;
419
 
 
420
 
                if (gc->gc.gc_refs) {
421
 
                        /* gc is definitely reachable from outside the
422
 
                         * original 'young'.  Mark it as such, and traverse
423
 
                         * its pointers to find any other objects that may
424
 
                         * be directly reachable from it.  Note that the
425
 
                         * call to tp_traverse may append objects to young,
426
 
                         * so we have to wait until it returns to determine
427
 
                         * the next object to visit.
428
 
                         */
429
 
                        PyObject *op = FROM_GC(gc);
430
 
                        traverseproc traverse = Py_TYPE(op)->tp_traverse;
431
 
                        assert(gc->gc.gc_refs > 0);
432
 
                        gc->gc.gc_refs = GC_REACHABLE;
433
 
                        (void) traverse(op,
434
 
                                        (visitproc)visit_reachable,
435
 
                                        (void *)young);
436
 
                        next = gc->gc.gc_next;
437
 
                        if (PyTuple_CheckExact(op)) {
438
 
                                _PyTuple_MaybeUntrack(op);
439
 
                        }
440
 
                        else if (PyDict_CheckExact(op)) {
441
 
                                _PyDict_MaybeUntrack(op);
442
 
                        }
443
 
                }
444
 
                else {
445
 
                        /* This *may* be unreachable.  To make progress,
446
 
                         * assume it is.  gc isn't directly reachable from
447
 
                         * any object we've already traversed, but may be
448
 
                         * reachable from an object we haven't gotten to yet.
449
 
                         * visit_reachable will eventually move gc back into
450
 
                         * young if that's so, and we'll see it again.
451
 
                         */
452
 
                        next = gc->gc.gc_next;
453
 
                        gc_list_move(gc, unreachable);
454
 
                        gc->gc.gc_refs = GC_TENTATIVELY_UNREACHABLE;
455
 
                }
456
 
                gc = next;
457
 
        }
 
406
    PyGC_Head *gc = young->gc.gc_next;
 
407
 
 
408
    /* Invariants:  all objects "to the left" of us in young have gc_refs
 
409
     * = GC_REACHABLE, and are indeed reachable (directly or indirectly)
 
410
     * from outside the young list as it was at entry.  All other objects
 
411
     * from the original young "to the left" of us are in unreachable now,
 
412
     * and have gc_refs = GC_TENTATIVELY_UNREACHABLE.  All objects to the
 
413
     * left of us in 'young' now have been scanned, and no objects here
 
414
     * or to the right have been scanned yet.
 
415
     */
 
416
 
 
417
    while (gc != young) {
 
418
        PyGC_Head *next;
 
419
 
 
420
        if (gc->gc.gc_refs) {
 
421
            /* gc is definitely reachable from outside the
 
422
             * original 'young'.  Mark it as such, and traverse
 
423
             * its pointers to find any other objects that may
 
424
             * be directly reachable from it.  Note that the
 
425
             * call to tp_traverse may append objects to young,
 
426
             * so we have to wait until it returns to determine
 
427
             * the next object to visit.
 
428
             */
 
429
            PyObject *op = FROM_GC(gc);
 
430
            traverseproc traverse = Py_TYPE(op)->tp_traverse;
 
431
            assert(gc->gc.gc_refs > 0);
 
432
            gc->gc.gc_refs = GC_REACHABLE;
 
433
            (void) traverse(op,
 
434
                            (visitproc)visit_reachable,
 
435
                            (void *)young);
 
436
            next = gc->gc.gc_next;
 
437
            if (PyTuple_CheckExact(op)) {
 
438
                _PyTuple_MaybeUntrack(op);
 
439
            }
 
440
            else if (PyDict_CheckExact(op)) {
 
441
                _PyDict_MaybeUntrack(op);
 
442
            }
 
443
        }
 
444
        else {
 
445
            /* This *may* be unreachable.  To make progress,
 
446
             * assume it is.  gc isn't directly reachable from
 
447
             * any object we've already traversed, but may be
 
448
             * reachable from an object we haven't gotten to yet.
 
449
             * visit_reachable will eventually move gc back into
 
450
             * young if that's so, and we'll see it again.
 
451
             */
 
452
            next = gc->gc.gc_next;
 
453
            gc_list_move(gc, unreachable);
 
454
            gc->gc.gc_refs = GC_TENTATIVELY_UNREACHABLE;
 
455
        }
 
456
        gc = next;
 
457
    }
458
458
}
459
459
 
460
460
/* Return true if object has a finalization method. */
461
461
static int
462
462
has_finalizer(PyObject *op)
463
463
{
464
 
        if (PyGen_CheckExact(op))
465
 
                return PyGen_NeedsFinalizing((PyGenObject *)op);
466
 
        else
467
 
                return op->ob_type->tp_del != NULL;
 
464
    if (PyGen_CheckExact(op))
 
465
        return PyGen_NeedsFinalizing((PyGenObject *)op);
 
466
    else
 
467
        return op->ob_type->tp_del != NULL;
468
468
}
469
469
 
470
470
/* Move the objects in unreachable with __del__ methods into `finalizers`.
474
474
static void
475
475
move_finalizers(PyGC_Head *unreachable, PyGC_Head *finalizers)
476
476
{
477
 
        PyGC_Head *gc;
478
 
        PyGC_Head *next;
479
 
 
480
 
        /* March over unreachable.  Move objects with finalizers into
481
 
         * `finalizers`.
482
 
         */
483
 
        for (gc = unreachable->gc.gc_next; gc != unreachable; gc = next) {
484
 
                PyObject *op = FROM_GC(gc);
485
 
 
486
 
                assert(IS_TENTATIVELY_UNREACHABLE(op));
487
 
                next = gc->gc.gc_next;
488
 
 
489
 
                if (has_finalizer(op)) {
490
 
                        gc_list_move(gc, finalizers);
491
 
                        gc->gc.gc_refs = GC_REACHABLE;
492
 
                }
493
 
        }
 
477
    PyGC_Head *gc;
 
478
    PyGC_Head *next;
 
479
 
 
480
    /* March over unreachable.  Move objects with finalizers into
 
481
     * `finalizers`.
 
482
     */
 
483
    for (gc = unreachable->gc.gc_next; gc != unreachable; gc = next) {
 
484
        PyObject *op = FROM_GC(gc);
 
485
 
 
486
        assert(IS_TENTATIVELY_UNREACHABLE(op));
 
487
        next = gc->gc.gc_next;
 
488
 
 
489
        if (has_finalizer(op)) {
 
490
            gc_list_move(gc, finalizers);
 
491
            gc->gc.gc_refs = GC_REACHABLE;
 
492
        }
 
493
    }
494
494
}
495
495
 
496
496
/* A traversal callback for move_finalizer_reachable. */
497
497
static int
498
498
visit_move(PyObject *op, PyGC_Head *tolist)
499
499
{
500
 
        if (PyObject_IS_GC(op)) {
501
 
                if (IS_TENTATIVELY_UNREACHABLE(op)) {
502
 
                        PyGC_Head *gc = AS_GC(op);
503
 
                        gc_list_move(gc, tolist);
504
 
                        gc->gc.gc_refs = GC_REACHABLE;
505
 
                }
506
 
        }
507
 
        return 0;
 
500
    if (PyObject_IS_GC(op)) {
 
501
        if (IS_TENTATIVELY_UNREACHABLE(op)) {
 
502
            PyGC_Head *gc = AS_GC(op);
 
503
            gc_list_move(gc, tolist);
 
504
            gc->gc.gc_refs = GC_REACHABLE;
 
505
        }
 
506
    }
 
507
    return 0;
508
508
}
509
509
 
510
510
/* Move objects that are reachable from finalizers, from the unreachable set
513
513
static void
514
514
move_finalizer_reachable(PyGC_Head *finalizers)
515
515
{
516
 
        traverseproc traverse;
517
 
        PyGC_Head *gc = finalizers->gc.gc_next;
518
 
        for (; gc != finalizers; gc = gc->gc.gc_next) {
519
 
                /* Note that the finalizers list may grow during this. */
520
 
                traverse = Py_TYPE(FROM_GC(gc))->tp_traverse;
521
 
                (void) traverse(FROM_GC(gc),
522
 
                                (visitproc)visit_move,
523
 
                                (void *)finalizers);
524
 
        }
 
516
    traverseproc traverse;
 
517
    PyGC_Head *gc = finalizers->gc.gc_next;
 
518
    for (; gc != finalizers; gc = gc->gc.gc_next) {
 
519
        /* Note that the finalizers list may grow during this. */
 
520
        traverse = Py_TYPE(FROM_GC(gc))->tp_traverse;
 
521
        (void) traverse(FROM_GC(gc),
 
522
                        (visitproc)visit_move,
 
523
                        (void *)finalizers);
 
524
    }
525
525
}
526
526
 
527
527
/* Clear all weakrefs to unreachable objects, and if such a weakref has a
538
538
static int
539
539
handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
540
540
{
541
 
        PyGC_Head *gc;
542
 
        PyObject *op;           /* generally FROM_GC(gc) */
543
 
        PyWeakReference *wr;    /* generally a cast of op */
544
 
        PyGC_Head wrcb_to_call; /* weakrefs with callbacks to call */
545
 
        PyGC_Head *next;
546
 
        int num_freed = 0;
547
 
 
548
 
        gc_list_init(&wrcb_to_call);
549
 
 
550
 
        /* Clear all weakrefs to the objects in unreachable.  If such a weakref
551
 
         * also has a callback, move it into `wrcb_to_call` if the callback
552
 
         * needs to be invoked.  Note that we cannot invoke any callbacks until
553
 
         * all weakrefs to unreachable objects are cleared, lest the callback
554
 
         * resurrect an unreachable object via a still-active weakref.  We
555
 
         * make another pass over wrcb_to_call, invoking callbacks, after this
556
 
         * pass completes.
557
 
         */
558
 
        for (gc = unreachable->gc.gc_next; gc != unreachable; gc = next) {
559
 
                PyWeakReference **wrlist;
560
 
 
561
 
                op = FROM_GC(gc);
562
 
                assert(IS_TENTATIVELY_UNREACHABLE(op));
563
 
                next = gc->gc.gc_next;
564
 
 
565
 
                if (! PyType_SUPPORTS_WEAKREFS(Py_TYPE(op)))
566
 
                        continue;
567
 
 
568
 
                /* It supports weakrefs.  Does it have any? */
569
 
                wrlist = (PyWeakReference **)
570
 
                                        PyObject_GET_WEAKREFS_LISTPTR(op);
571
 
 
572
 
                /* `op` may have some weakrefs.  March over the list, clear
573
 
                 * all the weakrefs, and move the weakrefs with callbacks
574
 
                 * that must be called into wrcb_to_call.
575
 
                 */
576
 
                for (wr = *wrlist; wr != NULL; wr = *wrlist) {
577
 
                        PyGC_Head *wrasgc;      /* AS_GC(wr) */
578
 
 
579
 
                        /* _PyWeakref_ClearRef clears the weakref but leaves
580
 
                         * the callback pointer intact.  Obscure:  it also
581
 
                         * changes *wrlist.
582
 
                         */
583
 
                        assert(wr->wr_object == op);
584
 
                        _PyWeakref_ClearRef(wr);
585
 
                        assert(wr->wr_object == Py_None);
586
 
                        if (wr->wr_callback == NULL)
587
 
                                continue;       /* no callback */
588
 
 
589
 
        /* Headache time.  `op` is going away, and is weakly referenced by
590
 
         * `wr`, which has a callback.  Should the callback be invoked?  If wr
591
 
         * is also trash, no:
592
 
         *
593
 
         * 1. There's no need to call it.  The object and the weakref are
594
 
         *    both going away, so it's legitimate to pretend the weakref is
595
 
         *    going away first.  The user has to ensure a weakref outlives its
596
 
         *    referent if they want a guarantee that the wr callback will get
597
 
         *    invoked.
598
 
         *
599
 
         * 2. It may be catastrophic to call it.  If the callback is also in
600
 
         *    cyclic trash (CT), then although the CT is unreachable from
601
 
         *    outside the current generation, CT may be reachable from the
602
 
         *    callback.  Then the callback could resurrect insane objects.
603
 
         *
604
 
         * Since the callback is never needed and may be unsafe in this case,
605
 
         * wr is simply left in the unreachable set.  Note that because we
606
 
         * already called _PyWeakref_ClearRef(wr), its callback will never
607
 
         * trigger.
608
 
         *
609
 
         * OTOH, if wr isn't part of CT, we should invoke the callback:  the
610
 
         * weakref outlived the trash.  Note that since wr isn't CT in this
611
 
         * case, its callback can't be CT either -- wr acted as an external
612
 
         * root to this generation, and therefore its callback did too.  So
613
 
         * nothing in CT is reachable from the callback either, so it's hard
614
 
         * to imagine how calling it later could create a problem for us.  wr
615
 
         * is moved to wrcb_to_call in this case.
616
 
         */
617
 
                        if (IS_TENTATIVELY_UNREACHABLE(wr))
618
 
                                continue;
619
 
                        assert(IS_REACHABLE(wr));
620
 
 
621
 
                        /* Create a new reference so that wr can't go away
622
 
                         * before we can process it again.
623
 
                         */
624
 
                        Py_INCREF(wr);
625
 
 
626
 
                        /* Move wr to wrcb_to_call, for the next pass. */
627
 
                        wrasgc = AS_GC(wr);
628
 
                        assert(wrasgc != next); /* wrasgc is reachable, but
629
 
                                                   next isn't, so they can't
630
 
                                                   be the same */
631
 
                        gc_list_move(wrasgc, &wrcb_to_call);
632
 
                }
633
 
        }
634
 
 
635
 
        /* Invoke the callbacks we decided to honor.  It's safe to invoke them
636
 
         * because they can't reference unreachable objects.
637
 
         */
638
 
        while (! gc_list_is_empty(&wrcb_to_call)) {
639
 
                PyObject *temp;
640
 
                PyObject *callback;
641
 
 
642
 
                gc = wrcb_to_call.gc.gc_next;
643
 
                op = FROM_GC(gc);
644
 
                assert(IS_REACHABLE(op));
645
 
                assert(PyWeakref_Check(op));
646
 
                wr = (PyWeakReference *)op;
647
 
                callback = wr->wr_callback;
648
 
                assert(callback != NULL);
649
 
 
650
 
                /* copy-paste of weakrefobject.c's handle_callback() */
651
 
                temp = PyObject_CallFunctionObjArgs(callback, wr, NULL);
652
 
                if (temp == NULL)
653
 
                        PyErr_WriteUnraisable(callback);
654
 
                else
655
 
                        Py_DECREF(temp);
656
 
 
657
 
                /* Give up the reference we created in the first pass.  When
658
 
                 * op's refcount hits 0 (which it may or may not do right now),
659
 
                 * op's tp_dealloc will decref op->wr_callback too.  Note
660
 
                 * that the refcount probably will hit 0 now, and because this
661
 
                 * weakref was reachable to begin with, gc didn't already
662
 
                 * add it to its count of freed objects.  Example:  a reachable
663
 
                 * weak value dict maps some key to this reachable weakref.
664
 
                 * The callback removes this key->weakref mapping from the
665
 
                 * dict, leaving no other references to the weakref (excepting
666
 
                 * ours).
667
 
                 */
668
 
                Py_DECREF(op);
669
 
                if (wrcb_to_call.gc.gc_next == gc) {
670
 
                        /* object is still alive -- move it */
671
 
                        gc_list_move(gc, old);
672
 
                }
673
 
                else
674
 
                        ++num_freed;
675
 
        }
676
 
 
677
 
        return num_freed;
 
541
    PyGC_Head *gc;
 
542
    PyObject *op;               /* generally FROM_GC(gc) */
 
543
    PyWeakReference *wr;        /* generally a cast of op */
 
544
    PyGC_Head wrcb_to_call;     /* weakrefs with callbacks to call */
 
545
    PyGC_Head *next;
 
546
    int num_freed = 0;
 
547
 
 
548
    gc_list_init(&wrcb_to_call);
 
549
 
 
550
    /* Clear all weakrefs to the objects in unreachable.  If such a weakref
 
551
     * also has a callback, move it into `wrcb_to_call` if the callback
 
552
     * needs to be invoked.  Note that we cannot invoke any callbacks until
 
553
     * all weakrefs to unreachable objects are cleared, lest the callback
 
554
     * resurrect an unreachable object via a still-active weakref.  We
 
555
     * make another pass over wrcb_to_call, invoking callbacks, after this
 
556
     * pass completes.
 
557
     */
 
558
    for (gc = unreachable->gc.gc_next; gc != unreachable; gc = next) {
 
559
        PyWeakReference **wrlist;
 
560
 
 
561
        op = FROM_GC(gc);
 
562
        assert(IS_TENTATIVELY_UNREACHABLE(op));
 
563
        next = gc->gc.gc_next;
 
564
 
 
565
        if (! PyType_SUPPORTS_WEAKREFS(Py_TYPE(op)))
 
566
            continue;
 
567
 
 
568
        /* It supports weakrefs.  Does it have any? */
 
569
        wrlist = (PyWeakReference **)
 
570
                                PyObject_GET_WEAKREFS_LISTPTR(op);
 
571
 
 
572
        /* `op` may have some weakrefs.  March over the list, clear
 
573
         * all the weakrefs, and move the weakrefs with callbacks
 
574
         * that must be called into wrcb_to_call.
 
575
         */
 
576
        for (wr = *wrlist; wr != NULL; wr = *wrlist) {
 
577
            PyGC_Head *wrasgc;                  /* AS_GC(wr) */
 
578
 
 
579
            /* _PyWeakref_ClearRef clears the weakref but leaves
 
580
             * the callback pointer intact.  Obscure:  it also
 
581
             * changes *wrlist.
 
582
             */
 
583
            assert(wr->wr_object == op);
 
584
            _PyWeakref_ClearRef(wr);
 
585
            assert(wr->wr_object == Py_None);
 
586
            if (wr->wr_callback == NULL)
 
587
                continue;                       /* no callback */
 
588
 
 
589
    /* Headache time.  `op` is going away, and is weakly referenced by
 
590
     * `wr`, which has a callback.  Should the callback be invoked?  If wr
 
591
     * is also trash, no:
 
592
     *
 
593
     * 1. There's no need to call it.  The object and the weakref are
 
594
     *    both going away, so it's legitimate to pretend the weakref is
 
595
     *    going away first.  The user has to ensure a weakref outlives its
 
596
     *    referent if they want a guarantee that the wr callback will get
 
597
     *    invoked.
 
598
     *
 
599
     * 2. It may be catastrophic to call it.  If the callback is also in
 
600
     *    cyclic trash (CT), then although the CT is unreachable from
 
601
     *    outside the current generation, CT may be reachable from the
 
602
     *    callback.  Then the callback could resurrect insane objects.
 
603
     *
 
604
     * Since the callback is never needed and may be unsafe in this case,
 
605
     * wr is simply left in the unreachable set.  Note that because we
 
606
     * already called _PyWeakref_ClearRef(wr), its callback will never
 
607
     * trigger.
 
608
     *
 
609
     * OTOH, if wr isn't part of CT, we should invoke the callback:  the
 
610
     * weakref outlived the trash.  Note that since wr isn't CT in this
 
611
     * case, its callback can't be CT either -- wr acted as an external
 
612
     * root to this generation, and therefore its callback did too.  So
 
613
     * nothing in CT is reachable from the callback either, so it's hard
 
614
     * to imagine how calling it later could create a problem for us.  wr
 
615
     * is moved to wrcb_to_call in this case.
 
616
     */
 
617
            if (IS_TENTATIVELY_UNREACHABLE(wr))
 
618
                continue;
 
619
            assert(IS_REACHABLE(wr));
 
620
 
 
621
            /* Create a new reference so that wr can't go away
 
622
             * before we can process it again.
 
623
             */
 
624
            Py_INCREF(wr);
 
625
 
 
626
            /* Move wr to wrcb_to_call, for the next pass. */
 
627
            wrasgc = AS_GC(wr);
 
628
            assert(wrasgc != next); /* wrasgc is reachable, but
 
629
                                       next isn't, so they can't
 
630
                                       be the same */
 
631
            gc_list_move(wrasgc, &wrcb_to_call);
 
632
        }
 
633
    }
 
634
 
 
635
    /* Invoke the callbacks we decided to honor.  It's safe to invoke them
 
636
     * because they can't reference unreachable objects.
 
637
     */
 
638
    while (! gc_list_is_empty(&wrcb_to_call)) {
 
639
        PyObject *temp;
 
640
        PyObject *callback;
 
641
 
 
642
        gc = wrcb_to_call.gc.gc_next;
 
643
        op = FROM_GC(gc);
 
644
        assert(IS_REACHABLE(op));
 
645
        assert(PyWeakref_Check(op));
 
646
        wr = (PyWeakReference *)op;
 
647
        callback = wr->wr_callback;
 
648
        assert(callback != NULL);
 
649
 
 
650
        /* copy-paste of weakrefobject.c's handle_callback() */
 
651
        temp = PyObject_CallFunctionObjArgs(callback, wr, NULL);
 
652
        if (temp == NULL)
 
653
            PyErr_WriteUnraisable(callback);
 
654
        else
 
655
            Py_DECREF(temp);
 
656
 
 
657
        /* Give up the reference we created in the first pass.  When
 
658
         * op's refcount hits 0 (which it may or may not do right now),
 
659
         * op's tp_dealloc will decref op->wr_callback too.  Note
 
660
         * that the refcount probably will hit 0 now, and because this
 
661
         * weakref was reachable to begin with, gc didn't already
 
662
         * add it to its count of freed objects.  Example:  a reachable
 
663
         * weak value dict maps some key to this reachable weakref.
 
664
         * The callback removes this key->weakref mapping from the
 
665
         * dict, leaving no other references to the weakref (excepting
 
666
         * ours).
 
667
         */
 
668
        Py_DECREF(op);
 
669
        if (wrcb_to_call.gc.gc_next == gc) {
 
670
            /* object is still alive -- move it */
 
671
            gc_list_move(gc, old);
 
672
        }
 
673
        else
 
674
            ++num_freed;
 
675
    }
 
676
 
 
677
    return num_freed;
678
678
}
679
679
 
680
680
static void
681
681
debug_cycle(char *msg, PyObject *op)
682
682
{
683
 
        PySys_WriteStderr("gc: %.100s <%.100s %p>\n",
684
 
                          msg, Py_TYPE(op)->tp_name, op);
 
683
    PySys_WriteStderr("gc: %.100s <%.100s %p>\n",
 
684
                      msg, Py_TYPE(op)->tp_name, op);
685
685
}
686
686
 
687
687
/* Handle uncollectable garbage (cycles with finalizers, and stuff reachable
696
696
static int
697
697
handle_finalizers(PyGC_Head *finalizers, PyGC_Head *old)
698
698
{
699
 
        PyGC_Head *gc = finalizers->gc.gc_next;
700
 
 
701
 
        if (garbage == NULL) {
702
 
                garbage = PyList_New(0);
703
 
                if (garbage == NULL)
704
 
                        Py_FatalError("gc couldn't create gc.garbage list");
705
 
        }
706
 
        for (; gc != finalizers; gc = gc->gc.gc_next) {
707
 
                PyObject *op = FROM_GC(gc);
708
 
 
709
 
                if ((debug & DEBUG_SAVEALL) || has_finalizer(op)) {
710
 
                        if (PyList_Append(garbage, op) < 0)
711
 
                                return -1;
712
 
                }
713
 
        }
714
 
 
715
 
        gc_list_merge(finalizers, old);
716
 
        return 0;
 
699
    PyGC_Head *gc = finalizers->gc.gc_next;
 
700
 
 
701
    if (garbage == NULL) {
 
702
        garbage = PyList_New(0);
 
703
        if (garbage == NULL)
 
704
            Py_FatalError("gc couldn't create gc.garbage list");
 
705
    }
 
706
    for (; gc != finalizers; gc = gc->gc.gc_next) {
 
707
        PyObject *op = FROM_GC(gc);
 
708
 
 
709
        if ((debug & DEBUG_SAVEALL) || has_finalizer(op)) {
 
710
            if (PyList_Append(garbage, op) < 0)
 
711
                return -1;
 
712
        }
 
713
    }
 
714
 
 
715
    gc_list_merge(finalizers, old);
 
716
    return 0;
717
717
}
718
718
 
719
 
/* Break reference cycles by clearing the containers involved.  This is
 
719
/* Break reference cycles by clearing the containers involved.  This is
720
720
 * tricky business as the lists can be changing and we don't know which
721
721
 * objects may be freed.  It is possible I screwed something up here.
722
722
 */
723
723
static void
724
724
delete_garbage(PyGC_Head *collectable, PyGC_Head *old)
725
725
{
726
 
        inquiry clear;
727
 
 
728
 
        while (!gc_list_is_empty(collectable)) {
729
 
                PyGC_Head *gc = collectable->gc.gc_next;
730
 
                PyObject *op = FROM_GC(gc);
731
 
 
732
 
                assert(IS_TENTATIVELY_UNREACHABLE(op));
733
 
                if (debug & DEBUG_SAVEALL) {
734
 
                        PyList_Append(garbage, op);
735
 
                }
736
 
                else {
737
 
                        if ((clear = Py_TYPE(op)->tp_clear) != NULL) {
738
 
                                Py_INCREF(op);
739
 
                                clear(op);
740
 
                                Py_DECREF(op);
741
 
                        }
742
 
                }
743
 
                if (collectable->gc.gc_next == gc) {
744
 
                        /* object is still alive, move it, it may die later */
745
 
                        gc_list_move(gc, old);
746
 
                        gc->gc.gc_refs = GC_REACHABLE;
747
 
                }
748
 
        }
 
726
    inquiry clear;
 
727
 
 
728
    while (!gc_list_is_empty(collectable)) {
 
729
        PyGC_Head *gc = collectable->gc.gc_next;
 
730
        PyObject *op = FROM_GC(gc);
 
731
 
 
732
        assert(IS_TENTATIVELY_UNREACHABLE(op));
 
733
        if (debug & DEBUG_SAVEALL) {
 
734
            PyList_Append(garbage, op);
 
735
        }
 
736
        else {
 
737
            if ((clear = Py_TYPE(op)->tp_clear) != NULL) {
 
738
                Py_INCREF(op);
 
739
                clear(op);
 
740
                Py_DECREF(op);
 
741
            }
 
742
        }
 
743
        if (collectable->gc.gc_next == gc) {
 
744
            /* object is still alive, move it, it may die later */
 
745
            gc_list_move(gc, old);
 
746
            gc->gc.gc_refs = GC_REACHABLE;
 
747
        }
 
748
    }
749
749
}
750
750
 
751
751
/* Clear all free lists
756
756
static void
757
757
clear_freelists(void)
758
758
{
759
 
        (void)PyMethod_ClearFreeList();
760
 
        (void)PyFrame_ClearFreeList();
761
 
        (void)PyCFunction_ClearFreeList();
762
 
        (void)PyTuple_ClearFreeList();
763
 
        (void)PyUnicode_ClearFreeList();
764
 
        (void)PyFloat_ClearFreeList();
 
759
    (void)PyMethod_ClearFreeList();
 
760
    (void)PyFrame_ClearFreeList();
 
761
    (void)PyCFunction_ClearFreeList();
 
762
    (void)PyTuple_ClearFreeList();
 
763
    (void)PyUnicode_ClearFreeList();
 
764
    (void)PyFloat_ClearFreeList();
765
765
}
766
766
 
767
767
static double
768
768
get_time(void)
769
769
{
770
 
        double result = 0;
771
 
        if (tmod != NULL) {
772
 
                PyObject *f = PyObject_CallMethod(tmod, "time", NULL);
773
 
                if (f == NULL) {
774
 
                        PyErr_Clear();
775
 
                }
776
 
                else {
777
 
                        if (PyFloat_Check(f))
778
 
                                result = PyFloat_AsDouble(f);
779
 
                        Py_DECREF(f);
780
 
                }
781
 
        }
782
 
        return result;
 
770
    double result = 0;
 
771
    if (tmod != NULL) {
 
772
        PyObject *f = PyObject_CallMethod(tmod, "time", NULL);
 
773
        if (f == NULL) {
 
774
            PyErr_Clear();
 
775
        }
 
776
        else {
 
777
            if (PyFloat_Check(f))
 
778
                result = PyFloat_AsDouble(f);
 
779
            Py_DECREF(f);
 
780
        }
 
781
    }
 
782
    return result;
783
783
}
784
784
 
785
785
/* This is the main function.  Read this to understand how the
787
787
static Py_ssize_t
788
788
collect(int generation)
789
789
{
790
 
        int i;
791
 
        Py_ssize_t m = 0; /* # objects collected */
792
 
        Py_ssize_t n = 0; /* # unreachable objects that couldn't be collected */
793
 
        PyGC_Head *young; /* the generation we are examining */
794
 
        PyGC_Head *old; /* next older generation */
795
 
        PyGC_Head unreachable; /* non-problematic unreachable trash */
796
 
        PyGC_Head finalizers;  /* objects with, & reachable from, __del__ */
797
 
        PyGC_Head *gc;
798
 
        double t1 = 0.0;
799
 
 
800
 
        if (delstr == NULL) {
801
 
                delstr = PyUnicode_InternFromString("__del__");
802
 
                if (delstr == NULL)
803
 
                        Py_FatalError("gc couldn't allocate \"__del__\"");
804
 
        }
805
 
 
806
 
        if (debug & DEBUG_STATS) {
807
 
                t1 = get_time();
808
 
                PySys_WriteStderr("gc: collecting generation %d...\n",
809
 
                                  generation);
810
 
                PySys_WriteStderr("gc: objects in each generation:");
811
 
                for (i = 0; i < NUM_GENERATIONS; i++)
812
 
                        PySys_WriteStderr(" %" PY_FORMAT_SIZE_T "d",
813
 
                                          gc_list_size(GEN_HEAD(i)));
814
 
                PySys_WriteStderr("\n");
815
 
        }
816
 
 
817
 
        /* update collection and allocation counters */
818
 
        if (generation+1 < NUM_GENERATIONS)
819
 
                generations[generation+1].count += 1;
820
 
        for (i = 0; i <= generation; i++)
821
 
                generations[i].count = 0;
822
 
 
823
 
        /* merge younger generations with one we are currently collecting */
824
 
        for (i = 0; i < generation; i++) {
825
 
                gc_list_merge(GEN_HEAD(i), GEN_HEAD(generation));
826
 
        }
827
 
 
828
 
        /* handy references */
829
 
        young = GEN_HEAD(generation);
830
 
        if (generation < NUM_GENERATIONS-1)
831
 
                old = GEN_HEAD(generation+1);
832
 
        else
833
 
                old = young;
834
 
 
835
 
        /* Using ob_refcnt and gc_refs, calculate which objects in the
836
 
         * container set are reachable from outside the set (i.e., have a
837
 
         * refcount greater than 0 when all the references within the
838
 
         * set are taken into account).
839
 
         */
840
 
        update_refs(young);
841
 
        subtract_refs(young);
842
 
 
843
 
        /* Leave everything reachable from outside young in young, and move
844
 
         * everything else (in young) to unreachable.
845
 
         * NOTE:  This used to move the reachable objects into a reachable
846
 
         * set instead.  But most things usually turn out to be reachable,
847
 
         * so it's more efficient to move the unreachable things.
848
 
         */
849
 
        gc_list_init(&unreachable);
850
 
        move_unreachable(young, &unreachable);
851
 
 
852
 
        /* Move reachable objects to next generation. */
853
 
        if (young != old) {
854
 
                if (generation == NUM_GENERATIONS - 2) {
855
 
                        long_lived_pending += gc_list_size(young);
856
 
                }
857
 
                gc_list_merge(young, old);
858
 
        }
859
 
        else {
860
 
                long_lived_pending = 0;
861
 
                long_lived_total = gc_list_size(young);
862
 
        }
863
 
 
864
 
        /* All objects in unreachable are trash, but objects reachable from
865
 
         * finalizers can't safely be deleted.  Python programmers should take
866
 
         * care not to create such things.  For Python, finalizers means
867
 
         * instance objects with __del__ methods.  Weakrefs with callbacks
868
 
         * can also call arbitrary Python code but they will be dealt with by
869
 
         * handle_weakrefs().
870
 
         */
871
 
        gc_list_init(&finalizers);
872
 
        move_finalizers(&unreachable, &finalizers);
873
 
        /* finalizers contains the unreachable objects with a finalizer;
874
 
         * unreachable objects reachable *from* those are also uncollectable,
875
 
         * and we move those into the finalizers list too.
876
 
         */
877
 
        move_finalizer_reachable(&finalizers);
878
 
 
879
 
        /* Collect statistics on collectable objects found and print
880
 
         * debugging information.
881
 
         */
882
 
        for (gc = unreachable.gc.gc_next; gc != &unreachable;
883
 
                        gc = gc->gc.gc_next) {
884
 
                m++;
885
 
                if (debug & DEBUG_COLLECTABLE) {
886
 
                        debug_cycle("collectable", FROM_GC(gc));
887
 
                }
888
 
        }
889
 
 
890
 
        /* Clear weakrefs and invoke callbacks as necessary. */
891
 
        m += handle_weakrefs(&unreachable, old);
892
 
 
893
 
        /* Call tp_clear on objects in the unreachable set.  This will cause
894
 
         * the reference cycles to be broken.  It may also cause some objects
895
 
         * in finalizers to be freed.
896
 
         */
897
 
        delete_garbage(&unreachable, old);
898
 
 
899
 
        /* Collect statistics on uncollectable objects found and print
900
 
         * debugging information. */
901
 
        for (gc = finalizers.gc.gc_next;
902
 
             gc != &finalizers;
903
 
             gc = gc->gc.gc_next) {
904
 
                n++;
905
 
                if (debug & DEBUG_UNCOLLECTABLE)
906
 
                        debug_cycle("uncollectable", FROM_GC(gc));
907
 
        }
908
 
        if (debug & DEBUG_STATS) {
909
 
                double t2 = get_time();
910
 
                if (m == 0 && n == 0)
911
 
                        PySys_WriteStderr("gc: done");
912
 
                else
913
 
                        PySys_WriteStderr(
914
 
                            "gc: done, "
915
 
                            "%" PY_FORMAT_SIZE_T "d unreachable, "
916
 
                            "%" PY_FORMAT_SIZE_T "d uncollectable",
917
 
                            n+m, n);
918
 
                if (t1 && t2) {
919
 
                        PySys_WriteStderr(", %.4fs elapsed", t2-t1);
920
 
                }
921
 
                PySys_WriteStderr(".\n");
922
 
        }
923
 
 
924
 
        /* Append instances in the uncollectable set to a Python
925
 
         * reachable list of garbage.  The programmer has to deal with
926
 
         * this if they insist on creating this type of structure.
927
 
         */
928
 
        (void)handle_finalizers(&finalizers, old);
929
 
 
930
 
        /* Clear free list only during the collection of the highest
931
 
         * generation */
932
 
        if (generation == NUM_GENERATIONS-1) {
933
 
                clear_freelists();
934
 
        }
935
 
 
936
 
        if (PyErr_Occurred()) {
937
 
                if (gc_str == NULL)
938
 
                        gc_str = PyUnicode_FromString("garbage collection");
939
 
                PyErr_WriteUnraisable(gc_str);
940
 
                Py_FatalError("unexpected exception during garbage collection");
941
 
        }
942
 
        return n+m;
 
790
    int i;
 
791
    Py_ssize_t m = 0; /* # objects collected */
 
792
    Py_ssize_t n = 0; /* # unreachable objects that couldn't be collected */
 
793
    PyGC_Head *young; /* the generation we are examining */
 
794
    PyGC_Head *old; /* next older generation */
 
795
    PyGC_Head unreachable; /* non-problematic unreachable trash */
 
796
    PyGC_Head finalizers;  /* objects with, & reachable from, __del__ */
 
797
    PyGC_Head *gc;
 
798
    double t1 = 0.0;
 
799
 
 
800
    if (delstr == NULL) {
 
801
        delstr = PyUnicode_InternFromString("__del__");
 
802
        if (delstr == NULL)
 
803
            Py_FatalError("gc couldn't allocate \"__del__\"");
 
804
    }
 
805
 
 
806
    if (debug & DEBUG_STATS) {
 
807
        PySys_WriteStderr("gc: collecting generation %d...\n",
 
808
                          generation);
 
809
        PySys_WriteStderr("gc: objects in each generation:");
 
810
        for (i = 0; i < NUM_GENERATIONS; i++)
 
811
            PySys_WriteStderr(" %" PY_FORMAT_SIZE_T "d",
 
812
                              gc_list_size(GEN_HEAD(i)));
 
813
        t1 = get_time();
 
814
        PySys_WriteStderr("\n");
 
815
    }
 
816
 
 
817
    /* update collection and allocation counters */
 
818
    if (generation+1 < NUM_GENERATIONS)
 
819
        generations[generation+1].count += 1;
 
820
    for (i = 0; i <= generation; i++)
 
821
        generations[i].count = 0;
 
822
 
 
823
    /* merge younger generations with one we are currently collecting */
 
824
    for (i = 0; i < generation; i++) {
 
825
        gc_list_merge(GEN_HEAD(i), GEN_HEAD(generation));
 
826
    }
 
827
 
 
828
    /* handy references */
 
829
    young = GEN_HEAD(generation);
 
830
    if (generation < NUM_GENERATIONS-1)
 
831
        old = GEN_HEAD(generation+1);
 
832
    else
 
833
        old = young;
 
834
 
 
835
    /* Using ob_refcnt and gc_refs, calculate which objects in the
 
836
     * container set are reachable from outside the set (i.e., have a
 
837
     * refcount greater than 0 when all the references within the
 
838
     * set are taken into account).
 
839
     */
 
840
    update_refs(young);
 
841
    subtract_refs(young);
 
842
 
 
843
    /* Leave everything reachable from outside young in young, and move
 
844
     * everything else (in young) to unreachable.
 
845
     * NOTE:  This used to move the reachable objects into a reachable
 
846
     * set instead.  But most things usually turn out to be reachable,
 
847
     * so it's more efficient to move the unreachable things.
 
848
     */
 
849
    gc_list_init(&unreachable);
 
850
    move_unreachable(young, &unreachable);
 
851
 
 
852
    /* Move reachable objects to next generation. */
 
853
    if (young != old) {
 
854
        if (generation == NUM_GENERATIONS - 2) {
 
855
            long_lived_pending += gc_list_size(young);
 
856
        }
 
857
        gc_list_merge(young, old);
 
858
    }
 
859
    else {
 
860
        long_lived_pending = 0;
 
861
        long_lived_total = gc_list_size(young);
 
862
    }
 
863
 
 
864
    /* All objects in unreachable are trash, but objects reachable from
 
865
     * finalizers can't safely be deleted.  Python programmers should take
 
866
     * care not to create such things.  For Python, finalizers means
 
867
     * instance objects with __del__ methods.  Weakrefs with callbacks
 
868
     * can also call arbitrary Python code but they will be dealt with by
 
869
     * handle_weakrefs().
 
870
     */
 
871
    gc_list_init(&finalizers);
 
872
    move_finalizers(&unreachable, &finalizers);
 
873
    /* finalizers contains the unreachable objects with a finalizer;
 
874
     * unreachable objects reachable *from* those are also uncollectable,
 
875
     * and we move those into the finalizers list too.
 
876
     */
 
877
    move_finalizer_reachable(&finalizers);
 
878
 
 
879
    /* Collect statistics on collectable objects found and print
 
880
     * debugging information.
 
881
     */
 
882
    for (gc = unreachable.gc.gc_next; gc != &unreachable;
 
883
                    gc = gc->gc.gc_next) {
 
884
        m++;
 
885
        if (debug & DEBUG_COLLECTABLE) {
 
886
            debug_cycle("collectable", FROM_GC(gc));
 
887
        }
 
888
    }
 
889
 
 
890
    /* Clear weakrefs and invoke callbacks as necessary. */
 
891
    m += handle_weakrefs(&unreachable, old);
 
892
 
 
893
    /* Call tp_clear on objects in the unreachable set.  This will cause
 
894
     * the reference cycles to be broken.  It may also cause some objects
 
895
     * in finalizers to be freed.
 
896
     */
 
897
    delete_garbage(&unreachable, old);
 
898
 
 
899
    /* Collect statistics on uncollectable objects found and print
 
900
     * debugging information. */
 
901
    for (gc = finalizers.gc.gc_next;
 
902
         gc != &finalizers;
 
903
         gc = gc->gc.gc_next) {
 
904
        n++;
 
905
        if (debug & DEBUG_UNCOLLECTABLE)
 
906
            debug_cycle("uncollectable", FROM_GC(gc));
 
907
    }
 
908
    if (debug & DEBUG_STATS) {
 
909
        double t2 = get_time();
 
910
        if (m == 0 && n == 0)
 
911
            PySys_WriteStderr("gc: done");
 
912
        else
 
913
            PySys_WriteStderr(
 
914
                "gc: done, "
 
915
                "%" PY_FORMAT_SIZE_T "d unreachable, "
 
916
                "%" PY_FORMAT_SIZE_T "d uncollectable",
 
917
                n+m, n);
 
918
        if (t1 && t2) {
 
919
            PySys_WriteStderr(", %.4fs elapsed", t2-t1);
 
920
        }
 
921
        PySys_WriteStderr(".\n");
 
922
    }
 
923
 
 
924
    /* Append instances in the uncollectable set to a Python
 
925
     * reachable list of garbage.  The programmer has to deal with
 
926
     * this if they insist on creating this type of structure.
 
927
     */
 
928
    (void)handle_finalizers(&finalizers, old);
 
929
 
 
930
    /* Clear free list only during the collection of the highest
 
931
     * generation */
 
932
    if (generation == NUM_GENERATIONS-1) {
 
933
        clear_freelists();
 
934
    }
 
935
 
 
936
    if (PyErr_Occurred()) {
 
937
        if (gc_str == NULL)
 
938
            gc_str = PyUnicode_FromString("garbage collection");
 
939
        PyErr_WriteUnraisable(gc_str);
 
940
        Py_FatalError("unexpected exception during garbage collection");
 
941
    }
 
942
    return n+m;
943
943
}
944
944
 
945
945
static Py_ssize_t
946
946
collect_generations(void)
947
947
{
948
 
        int i;
949
 
        Py_ssize_t n = 0;
 
948
    int i;
 
949
    Py_ssize_t n = 0;
950
950
 
951
 
        /* Find the oldest generation (highest numbered) where the count
952
 
         * exceeds the threshold.  Objects in the that generation and
953
 
         * generations younger than it will be collected. */
954
 
        for (i = NUM_GENERATIONS-1; i >= 0; i--) {
955
 
                if (generations[i].count > generations[i].threshold) {
956
 
                        /* Avoid quadratic performance degradation in number
957
 
                           of tracked objects. See comments at the beginning
958
 
                           of this file, and issue #4074.
959
 
                        */
960
 
                        if (i == NUM_GENERATIONS - 1
961
 
                            && long_lived_pending < long_lived_total / 4)
962
 
                                continue;
963
 
                        n = collect(i);
964
 
                        break;
965
 
                }
966
 
        }
967
 
        return n;
 
951
    /* Find the oldest generation (highest numbered) where the count
 
952
     * exceeds the threshold.  Objects in the that generation and
 
953
     * generations younger than it will be collected. */
 
954
    for (i = NUM_GENERATIONS-1; i >= 0; i--) {
 
955
        if (generations[i].count > generations[i].threshold) {
 
956
            /* Avoid quadratic performance degradation in number
 
957
               of tracked objects. See comments at the beginning
 
958
               of this file, and issue #4074.
 
959
            */
 
960
            if (i == NUM_GENERATIONS - 1
 
961
                && long_lived_pending < long_lived_total / 4)
 
962
                continue;
 
963
            n = collect(i);
 
964
            break;
 
965
        }
 
966
    }
 
967
    return n;
968
968
}
969
969
 
970
970
PyDoc_STRVAR(gc_enable__doc__,
975
975
static PyObject *
976
976
gc_enable(PyObject *self, PyObject *noargs)
977
977
{
978
 
        enabled = 1;
979
 
        Py_INCREF(Py_None);
980
 
        return Py_None;
 
978
    enabled = 1;
 
979
    Py_INCREF(Py_None);
 
980
    return Py_None;
981
981
}
982
982
 
983
983
PyDoc_STRVAR(gc_disable__doc__,
988
988
static PyObject *
989
989
gc_disable(PyObject *self, PyObject *noargs)
990
990
{
991
 
        enabled = 0;
992
 
        Py_INCREF(Py_None);
993
 
        return Py_None;
 
991
    enabled = 0;
 
992
    Py_INCREF(Py_None);
 
993
    return Py_None;
994
994
}
995
995
 
996
996
PyDoc_STRVAR(gc_isenabled__doc__,
1001
1001
static PyObject *
1002
1002
gc_isenabled(PyObject *self, PyObject *noargs)
1003
1003
{
1004
 
        return PyBool_FromLong((long)enabled);
 
1004
    return PyBool_FromLong((long)enabled);
1005
1005
}
1006
1006
 
1007
1007
PyDoc_STRVAR(gc_collect__doc__,
1015
1015
static PyObject *
1016
1016
gc_collect(PyObject *self, PyObject *args, PyObject *kws)
1017
1017
{
1018
 
        static char *keywords[] = {"generation", NULL};
1019
 
        int genarg = NUM_GENERATIONS - 1;
1020
 
        Py_ssize_t n;
1021
 
 
1022
 
        if (!PyArg_ParseTupleAndKeywords(args, kws, "|i", keywords, &genarg))
1023
 
                return NULL;
1024
 
 
1025
 
        else if (genarg < 0 || genarg >= NUM_GENERATIONS) {
1026
 
                PyErr_SetString(PyExc_ValueError, "invalid generation");
1027
 
                return NULL;
1028
 
        }
1029
 
 
1030
 
        if (collecting)
1031
 
                n = 0; /* already collecting, don't do anything */
1032
 
        else {
1033
 
                collecting = 1;
1034
 
                n = collect(genarg);
1035
 
                collecting = 0;
1036
 
        }
1037
 
 
1038
 
        return PyLong_FromSsize_t(n);
 
1018
    static char *keywords[] = {"generation", NULL};
 
1019
    int genarg = NUM_GENERATIONS - 1;
 
1020
    Py_ssize_t n;
 
1021
 
 
1022
    if (!PyArg_ParseTupleAndKeywords(args, kws, "|i", keywords, &genarg))
 
1023
        return NULL;
 
1024
 
 
1025
    else if (genarg < 0 || genarg >= NUM_GENERATIONS) {
 
1026
        PyErr_SetString(PyExc_ValueError, "invalid generation");
 
1027
        return NULL;
 
1028
    }
 
1029
 
 
1030
    if (collecting)
 
1031
        n = 0; /* already collecting, don't do anything */
 
1032
    else {
 
1033
        collecting = 1;
 
1034
        n = collect(genarg);
 
1035
        collecting = 0;
 
1036
    }
 
1037
 
 
1038
    return PyLong_FromSsize_t(n);
1039
1039
}
1040
1040
 
1041
1041
PyDoc_STRVAR(gc_set_debug__doc__,
1055
1055
static PyObject *
1056
1056
gc_set_debug(PyObject *self, PyObject *args)
1057
1057
{
1058
 
        if (!PyArg_ParseTuple(args, "i:set_debug", &debug))
1059
 
                return NULL;
 
1058
    if (!PyArg_ParseTuple(args, "i:set_debug", &debug))
 
1059
        return NULL;
1060
1060
 
1061
 
        Py_INCREF(Py_None);
1062
 
        return Py_None;
 
1061
    Py_INCREF(Py_None);
 
1062
    return Py_None;
1063
1063
}
1064
1064
 
1065
1065
PyDoc_STRVAR(gc_get_debug__doc__,
1070
1070
static PyObject *
1071
1071
gc_get_debug(PyObject *self, PyObject *noargs)
1072
1072
{
1073
 
        return Py_BuildValue("i", debug);
 
1073
    return Py_BuildValue("i", debug);
1074
1074
}
1075
1075
 
1076
1076
PyDoc_STRVAR(gc_set_thresh__doc__,
1082
1082
static PyObject *
1083
1083
gc_set_thresh(PyObject *self, PyObject *args)
1084
1084
{
1085
 
        int i;
1086
 
        if (!PyArg_ParseTuple(args, "i|ii:set_threshold",
1087
 
                              &generations[0].threshold,
1088
 
                              &generations[1].threshold,
1089
 
                              &generations[2].threshold))
1090
 
                return NULL;
1091
 
        for (i = 2; i < NUM_GENERATIONS; i++) {
1092
 
                /* generations higher than 2 get the same threshold */
1093
 
                generations[i].threshold = generations[2].threshold;
1094
 
        }
 
1085
    int i;
 
1086
    if (!PyArg_ParseTuple(args, "i|ii:set_threshold",
 
1087
                          &generations[0].threshold,
 
1088
                          &generations[1].threshold,
 
1089
                          &generations[2].threshold))
 
1090
        return NULL;
 
1091
    for (i = 2; i < NUM_GENERATIONS; i++) {
 
1092
        /* generations higher than 2 get the same threshold */
 
1093
        generations[i].threshold = generations[2].threshold;
 
1094
    }
1095
1095
 
1096
 
        Py_INCREF(Py_None);
1097
 
        return Py_None;
 
1096
    Py_INCREF(Py_None);
 
1097
    return Py_None;
1098
1098
}
1099
1099
 
1100
1100
PyDoc_STRVAR(gc_get_thresh__doc__,
1105
1105
static PyObject *
1106
1106
gc_get_thresh(PyObject *self, PyObject *noargs)
1107
1107
{
1108
 
        return Py_BuildValue("(iii)",
1109
 
                             generations[0].threshold,
1110
 
                             generations[1].threshold,
1111
 
                             generations[2].threshold);
 
1108
    return Py_BuildValue("(iii)",
 
1109
                         generations[0].threshold,
 
1110
                         generations[1].threshold,
 
1111
                         generations[2].threshold);
1112
1112
}
1113
1113
 
1114
1114
PyDoc_STRVAR(gc_get_count__doc__,
1119
1119
static PyObject *
1120
1120
gc_get_count(PyObject *self, PyObject *noargs)
1121
1121
{
1122
 
        return Py_BuildValue("(iii)",
1123
 
                             generations[0].count,
1124
 
                             generations[1].count,
1125
 
                             generations[2].count);
 
1122
    return Py_BuildValue("(iii)",
 
1123
                         generations[0].count,
 
1124
                         generations[1].count,
 
1125
                         generations[2].count);
1126
1126
}
1127
1127
 
1128
1128
static int
1129
1129
referrersvisit(PyObject* obj, PyObject *objs)
1130
1130
{
1131
 
        Py_ssize_t i;
1132
 
        for (i = 0; i < PyTuple_GET_SIZE(objs); i++)
1133
 
                if (PyTuple_GET_ITEM(objs, i) == obj)
1134
 
                        return 1;
1135
 
        return 0;
 
1131
    Py_ssize_t i;
 
1132
    for (i = 0; i < PyTuple_GET_SIZE(objs); i++)
 
1133
        if (PyTuple_GET_ITEM(objs, i) == obj)
 
1134
            return 1;
 
1135
    return 0;
1136
1136
}
1137
1137
 
1138
1138
static int
1139
1139
gc_referrers_for(PyObject *objs, PyGC_Head *list, PyObject *resultlist)
1140
1140
{
1141
 
        PyGC_Head *gc;
1142
 
        PyObject *obj;
1143
 
        traverseproc traverse;
1144
 
        for (gc = list->gc.gc_next; gc != list; gc = gc->gc.gc_next) {
1145
 
                obj = FROM_GC(gc);
1146
 
                traverse = Py_TYPE(obj)->tp_traverse;
1147
 
                if (obj == objs || obj == resultlist)
1148
 
                        continue;
1149
 
                if (traverse(obj, (visitproc)referrersvisit, objs)) {
1150
 
                        if (PyList_Append(resultlist, obj) < 0)
1151
 
                                return 0; /* error */
1152
 
                }
1153
 
        }
1154
 
        return 1; /* no error */
 
1141
    PyGC_Head *gc;
 
1142
    PyObject *obj;
 
1143
    traverseproc traverse;
 
1144
    for (gc = list->gc.gc_next; gc != list; gc = gc->gc.gc_next) {
 
1145
        obj = FROM_GC(gc);
 
1146
        traverse = Py_TYPE(obj)->tp_traverse;
 
1147
        if (obj == objs || obj == resultlist)
 
1148
            continue;
 
1149
        if (traverse(obj, (visitproc)referrersvisit, objs)) {
 
1150
            if (PyList_Append(resultlist, obj) < 0)
 
1151
                return 0; /* error */
 
1152
        }
 
1153
    }
 
1154
    return 1; /* no error */
1155
1155
}
1156
1156
 
1157
1157
PyDoc_STRVAR(gc_get_referrers__doc__,
1161
1161
static PyObject *
1162
1162
gc_get_referrers(PyObject *self, PyObject *args)
1163
1163
{
1164
 
        int i;
1165
 
        PyObject *result = PyList_New(0);
1166
 
        if (!result) return NULL;
 
1164
    int i;
 
1165
    PyObject *result = PyList_New(0);
 
1166
    if (!result) return NULL;
1167
1167
 
1168
 
        for (i = 0; i < NUM_GENERATIONS; i++) {
1169
 
                if (!(gc_referrers_for(args, GEN_HEAD(i), result))) {
1170
 
                        Py_DECREF(result);
1171
 
                        return NULL;
1172
 
                }
1173
 
        }
1174
 
        return result;
 
1168
    for (i = 0; i < NUM_GENERATIONS; i++) {
 
1169
        if (!(gc_referrers_for(args, GEN_HEAD(i), result))) {
 
1170
            Py_DECREF(result);
 
1171
            return NULL;
 
1172
        }
 
1173
    }
 
1174
    return result;
1175
1175
}
1176
1176
 
1177
1177
/* Append obj to list; return true if error (out of memory), false if OK. */
1178
1178
static int
1179
1179
referentsvisit(PyObject *obj, PyObject *list)
1180
1180
{
1181
 
        return PyList_Append(list, obj) < 0;
 
1181
    return PyList_Append(list, obj) < 0;
1182
1182
}
1183
1183
 
1184
1184
PyDoc_STRVAR(gc_get_referents__doc__,
1188
1188
static PyObject *
1189
1189
gc_get_referents(PyObject *self, PyObject *args)
1190
1190
{
1191
 
        Py_ssize_t i;
1192
 
        PyObject *result = PyList_New(0);
1193
 
 
1194
 
        if (result == NULL)
1195
 
                return NULL;
1196
 
 
1197
 
        for (i = 0; i < PyTuple_GET_SIZE(args); i++) {
1198
 
                traverseproc traverse;
1199
 
                PyObject *obj = PyTuple_GET_ITEM(args, i);
1200
 
 
1201
 
                if (! PyObject_IS_GC(obj))
1202
 
                        continue;
1203
 
                traverse = Py_TYPE(obj)->tp_traverse;
1204
 
                if (! traverse)
1205
 
                        continue;
1206
 
                if (traverse(obj, (visitproc)referentsvisit, result)) {
1207
 
                        Py_DECREF(result);
1208
 
                        return NULL;
1209
 
                }
1210
 
        }
1211
 
        return result;
 
1191
    Py_ssize_t i;
 
1192
    PyObject *result = PyList_New(0);
 
1193
 
 
1194
    if (result == NULL)
 
1195
        return NULL;
 
1196
 
 
1197
    for (i = 0; i < PyTuple_GET_SIZE(args); i++) {
 
1198
        traverseproc traverse;
 
1199
        PyObject *obj = PyTuple_GET_ITEM(args, i);
 
1200
 
 
1201
        if (! PyObject_IS_GC(obj))
 
1202
            continue;
 
1203
        traverse = Py_TYPE(obj)->tp_traverse;
 
1204
        if (! traverse)
 
1205
            continue;
 
1206
        if (traverse(obj, (visitproc)referentsvisit, result)) {
 
1207
            Py_DECREF(result);
 
1208
            return NULL;
 
1209
        }
 
1210
    }
 
1211
    return result;
1212
1212
}
1213
1213
 
1214
1214
PyDoc_STRVAR(gc_get_objects__doc__,
1220
1220
static PyObject *
1221
1221
gc_get_objects(PyObject *self, PyObject *noargs)
1222
1222
{
1223
 
        int i;
1224
 
        PyObject* result;
 
1223
    int i;
 
1224
    PyObject* result;
1225
1225
 
1226
 
        result = PyList_New(0);
1227
 
        if (result == NULL)
1228
 
                return NULL;
1229
 
        for (i = 0; i < NUM_GENERATIONS; i++) {
1230
 
                if (append_objects(result, GEN_HEAD(i))) {
1231
 
                        Py_DECREF(result);
1232
 
                        return NULL;
1233
 
                }
1234
 
        }
1235
 
        return result;
 
1226
    result = PyList_New(0);
 
1227
    if (result == NULL)
 
1228
        return NULL;
 
1229
    for (i = 0; i < NUM_GENERATIONS; i++) {
 
1230
        if (append_objects(result, GEN_HEAD(i))) {
 
1231
            Py_DECREF(result);
 
1232
            return NULL;
 
1233
        }
 
1234
    }
 
1235
    return result;
1236
1236
}
1237
1237
 
1238
1238
PyDoc_STRVAR(gc_is_tracked__doc__,
1245
1245
static PyObject *
1246
1246
gc_is_tracked(PyObject *self, PyObject *obj)
1247
1247
{
1248
 
        PyObject *result;
1249
 
        
1250
 
        if (PyObject_IS_GC(obj) && IS_TRACKED(obj))
1251
 
                result = Py_True;
1252
 
        else
1253
 
                result = Py_False;
1254
 
        Py_INCREF(result);
1255
 
        return result;
 
1248
    PyObject *result;
 
1249
 
 
1250
    if (PyObject_IS_GC(obj) && IS_TRACKED(obj))
 
1251
        result = Py_True;
 
1252
    else
 
1253
        result = Py_False;
 
1254
    Py_INCREF(result);
 
1255
    return result;
1256
1256
}
1257
1257
 
1258
1258
 
1274
1274
"get_referents() -- Return the list of objects that an object refers to.\n");
1275
1275
 
1276
1276
static PyMethodDef GcMethods[] = {
1277
 
        {"enable",         gc_enable,     METH_NOARGS,  gc_enable__doc__},
1278
 
        {"disable",        gc_disable,    METH_NOARGS,  gc_disable__doc__},
1279
 
        {"isenabled",      gc_isenabled,  METH_NOARGS,  gc_isenabled__doc__},
1280
 
        {"set_debug",      gc_set_debug,  METH_VARARGS, gc_set_debug__doc__},
1281
 
        {"get_debug",      gc_get_debug,  METH_NOARGS,  gc_get_debug__doc__},
1282
 
        {"get_count",      gc_get_count,  METH_NOARGS,  gc_get_count__doc__},
1283
 
        {"set_threshold",  gc_set_thresh, METH_VARARGS, gc_set_thresh__doc__},
1284
 
        {"get_threshold",  gc_get_thresh, METH_NOARGS,  gc_get_thresh__doc__},
1285
 
        {"collect",        (PyCFunction)gc_collect,
1286
 
                METH_VARARGS | METH_KEYWORDS,           gc_collect__doc__},
1287
 
        {"get_objects",    gc_get_objects,METH_NOARGS,  gc_get_objects__doc__},
1288
 
        {"is_tracked",     gc_is_tracked, METH_O,       gc_is_tracked__doc__},
1289
 
        {"get_referrers",  gc_get_referrers, METH_VARARGS,
1290
 
                gc_get_referrers__doc__},
1291
 
        {"get_referents",  gc_get_referents, METH_VARARGS,
1292
 
                gc_get_referents__doc__},
1293
 
        {NULL,  NULL}           /* Sentinel */
 
1277
    {"enable",             gc_enable,     METH_NOARGS,  gc_enable__doc__},
 
1278
    {"disable",            gc_disable,    METH_NOARGS,  gc_disable__doc__},
 
1279
    {"isenabled",          gc_isenabled,  METH_NOARGS,  gc_isenabled__doc__},
 
1280
    {"set_debug",          gc_set_debug,  METH_VARARGS, gc_set_debug__doc__},
 
1281
    {"get_debug",          gc_get_debug,  METH_NOARGS,  gc_get_debug__doc__},
 
1282
    {"get_count",          gc_get_count,  METH_NOARGS,  gc_get_count__doc__},
 
1283
    {"set_threshold",  gc_set_thresh, METH_VARARGS, gc_set_thresh__doc__},
 
1284
    {"get_threshold",  gc_get_thresh, METH_NOARGS,  gc_get_thresh__doc__},
 
1285
    {"collect",            (PyCFunction)gc_collect,
 
1286
        METH_VARARGS | METH_KEYWORDS,           gc_collect__doc__},
 
1287
    {"get_objects",    gc_get_objects,METH_NOARGS,  gc_get_objects__doc__},
 
1288
    {"is_tracked",     gc_is_tracked, METH_O,       gc_is_tracked__doc__},
 
1289
    {"get_referrers",  gc_get_referrers, METH_VARARGS,
 
1290
        gc_get_referrers__doc__},
 
1291
    {"get_referents",  gc_get_referents, METH_VARARGS,
 
1292
        gc_get_referents__doc__},
 
1293
    {NULL,      NULL}           /* Sentinel */
1294
1294
};
1295
1295
 
1296
1296
static struct PyModuleDef gcmodule = {
1297
 
        PyModuleDef_HEAD_INIT,
1298
 
        "gc",
1299
 
        gc__doc__,
1300
 
        -1,
1301
 
        GcMethods,
1302
 
        NULL,
1303
 
        NULL,
1304
 
        NULL,
1305
 
        NULL
 
1297
    PyModuleDef_HEAD_INIT,
 
1298
    "gc",
 
1299
    gc__doc__,
 
1300
    -1,
 
1301
    GcMethods,
 
1302
    NULL,
 
1303
    NULL,
 
1304
    NULL,
 
1305
    NULL
1306
1306
};
1307
1307
 
1308
1308
 
1309
1309
PyMODINIT_FUNC
1310
1310
PyInit_gc(void)
1311
1311
{
1312
 
        PyObject *m;
1313
 
 
1314
 
        m = PyModule_Create(&gcmodule);
1315
 
 
1316
 
        if (m == NULL)
1317
 
                return NULL;
1318
 
 
1319
 
        if (garbage == NULL) {
1320
 
                garbage = PyList_New(0);
1321
 
                if (garbage == NULL)
1322
 
                        return NULL;
1323
 
        }
1324
 
        Py_INCREF(garbage);
1325
 
        if (PyModule_AddObject(m, "garbage", garbage) < 0)
1326
 
                return NULL;
1327
 
 
1328
 
        /* Importing can't be done in collect() because collect()
1329
 
         * can be called via PyGC_Collect() in Py_Finalize().
1330
 
         * This wouldn't be a problem, except that <initialized> is
1331
 
         * reset to 0 before calling collect which trips up
1332
 
         * the import and triggers an assertion.
1333
 
         */
1334
 
        if (tmod == NULL) {
1335
 
                tmod = PyImport_ImportModuleNoBlock("time");
1336
 
                if (tmod == NULL)
1337
 
                        PyErr_Clear();
1338
 
        }
 
1312
    PyObject *m;
 
1313
 
 
1314
    m = PyModule_Create(&gcmodule);
 
1315
 
 
1316
    if (m == NULL)
 
1317
        return NULL;
 
1318
 
 
1319
    if (garbage == NULL) {
 
1320
        garbage = PyList_New(0);
 
1321
        if (garbage == NULL)
 
1322
            return NULL;
 
1323
    }
 
1324
    Py_INCREF(garbage);
 
1325
    if (PyModule_AddObject(m, "garbage", garbage) < 0)
 
1326
        return NULL;
 
1327
 
 
1328
    /* Importing can't be done in collect() because collect()
 
1329
     * can be called via PyGC_Collect() in Py_Finalize().
 
1330
     * This wouldn't be a problem, except that <initialized> is
 
1331
     * reset to 0 before calling collect which trips up
 
1332
     * the import and triggers an assertion.
 
1333
     */
 
1334
    if (tmod == NULL) {
 
1335
        tmod = PyImport_ImportModuleNoBlock("time");
 
1336
        if (tmod == NULL)
 
1337
            PyErr_Clear();
 
1338
    }
1339
1339
 
1340
1340
#define ADD_INT(NAME) if (PyModule_AddIntConstant(m, #NAME, NAME) < 0) return NULL
1341
 
        ADD_INT(DEBUG_STATS);
1342
 
        ADD_INT(DEBUG_COLLECTABLE);
1343
 
        ADD_INT(DEBUG_UNCOLLECTABLE);
1344
 
        ADD_INT(DEBUG_SAVEALL);
1345
 
        ADD_INT(DEBUG_LEAK);
 
1341
    ADD_INT(DEBUG_STATS);
 
1342
    ADD_INT(DEBUG_COLLECTABLE);
 
1343
    ADD_INT(DEBUG_UNCOLLECTABLE);
 
1344
    ADD_INT(DEBUG_SAVEALL);
 
1345
    ADD_INT(DEBUG_LEAK);
1346
1346
#undef ADD_INT
1347
 
        return m;
 
1347
    return m;
1348
1348
}
1349
1349
 
1350
1350
/* API to invoke gc.collect() from C */
1351
1351
Py_ssize_t
1352
1352
PyGC_Collect(void)
1353
1353
{
1354
 
        Py_ssize_t n;
1355
 
 
1356
 
        if (collecting)
1357
 
                n = 0; /* already collecting, don't do anything */
1358
 
        else {
1359
 
                collecting = 1;
1360
 
                n = collect(NUM_GENERATIONS - 1);
1361
 
                collecting = 0;
1362
 
        }
1363
 
 
1364
 
        return n;
 
1354
    Py_ssize_t n;
 
1355
 
 
1356
    if (collecting)
 
1357
        n = 0; /* already collecting, don't do anything */
 
1358
    else {
 
1359
        collecting = 1;
 
1360
        n = collect(NUM_GENERATIONS - 1);
 
1361
        collecting = 0;
 
1362
    }
 
1363
 
 
1364
    return n;
1365
1365
}
1366
1366
 
1367
1367
/* for debugging */
1368
1368
void
1369
1369
_PyGC_Dump(PyGC_Head *g)
1370
1370
{
1371
 
        _PyObject_Dump(FROM_GC(g));
 
1371
    _PyObject_Dump(FROM_GC(g));
1372
1372
}
1373
1373
 
1374
1374
/* extension modules might be compiled with GC support so these
1382
1382
void
1383
1383
PyObject_GC_Track(void *op)
1384
1384
{
1385
 
        _PyObject_GC_TRACK(op);
 
1385
    _PyObject_GC_TRACK(op);
1386
1386
}
1387
1387
 
1388
1388
/* for binary compatibility with 2.2 */
1395
1395
void
1396
1396
PyObject_GC_UnTrack(void *op)
1397
1397
{
1398
 
        /* Obscure:  the Py_TRASHCAN mechanism requires that we be able to
1399
 
         * call PyObject_GC_UnTrack twice on an object.
1400
 
         */
1401
 
        if (IS_TRACKED(op))
1402
 
                _PyObject_GC_UNTRACK(op);
 
1398
    /* Obscure:  the Py_TRASHCAN mechanism requires that we be able to
 
1399
     * call PyObject_GC_UnTrack twice on an object.
 
1400
     */
 
1401
    if (IS_TRACKED(op))
 
1402
        _PyObject_GC_UNTRACK(op);
1403
1403
}
1404
1404
 
1405
1405
/* for binary compatibility with 2.2 */
1412
1412
PyObject *
1413
1413
_PyObject_GC_Malloc(size_t basicsize)
1414
1414
{
1415
 
        PyObject *op;
1416
 
        PyGC_Head *g;
1417
 
        if (basicsize > PY_SSIZE_T_MAX - sizeof(PyGC_Head))
1418
 
                return PyErr_NoMemory();
1419
 
        g = (PyGC_Head *)PyObject_MALLOC(
1420
 
                sizeof(PyGC_Head) + basicsize);
1421
 
        if (g == NULL)
1422
 
                return PyErr_NoMemory();
1423
 
        g->gc.gc_refs = GC_UNTRACKED;
1424
 
        generations[0].count++; /* number of allocated GC objects */
1425
 
        if (generations[0].count > generations[0].threshold &&
1426
 
            enabled &&
1427
 
            generations[0].threshold &&
1428
 
            !collecting &&
1429
 
            !PyErr_Occurred()) {
1430
 
                collecting = 1;
1431
 
                collect_generations();
1432
 
                collecting = 0;
1433
 
        }
1434
 
        op = FROM_GC(g);
1435
 
        return op;
 
1415
    PyObject *op;
 
1416
    PyGC_Head *g;
 
1417
    if (basicsize > PY_SSIZE_T_MAX - sizeof(PyGC_Head))
 
1418
        return PyErr_NoMemory();
 
1419
    g = (PyGC_Head *)PyObject_MALLOC(
 
1420
        sizeof(PyGC_Head) + basicsize);
 
1421
    if (g == NULL)
 
1422
        return PyErr_NoMemory();
 
1423
    g->gc.gc_refs = GC_UNTRACKED;
 
1424
    generations[0].count++; /* number of allocated GC objects */
 
1425
    if (generations[0].count > generations[0].threshold &&
 
1426
        enabled &&
 
1427
        generations[0].threshold &&
 
1428
        !collecting &&
 
1429
        !PyErr_Occurred()) {
 
1430
        collecting = 1;
 
1431
        collect_generations();
 
1432
        collecting = 0;
 
1433
    }
 
1434
    op = FROM_GC(g);
 
1435
    return op;
1436
1436
}
1437
1437
 
1438
1438
PyObject *
1439
1439
_PyObject_GC_New(PyTypeObject *tp)
1440
1440
{
1441
 
        PyObject *op = _PyObject_GC_Malloc(_PyObject_SIZE(tp));
1442
 
        if (op != NULL)
1443
 
                op = PyObject_INIT(op, tp);
1444
 
        return op;
 
1441
    PyObject *op = _PyObject_GC_Malloc(_PyObject_SIZE(tp));
 
1442
    if (op != NULL)
 
1443
        op = PyObject_INIT(op, tp);
 
1444
    return op;
1445
1445
}
1446
1446
 
1447
1447
PyVarObject *
1448
1448
_PyObject_GC_NewVar(PyTypeObject *tp, Py_ssize_t nitems)
1449
1449
{
1450
 
        const size_t size = _PyObject_VAR_SIZE(tp, nitems);
1451
 
        PyVarObject *op = (PyVarObject *) _PyObject_GC_Malloc(size);
1452
 
        if (op != NULL)
1453
 
                op = PyObject_INIT_VAR(op, tp, nitems);
1454
 
        return op;
 
1450
    const size_t size = _PyObject_VAR_SIZE(tp, nitems);
 
1451
    PyVarObject *op = (PyVarObject *) _PyObject_GC_Malloc(size);
 
1452
    if (op != NULL)
 
1453
        op = PyObject_INIT_VAR(op, tp, nitems);
 
1454
    return op;
1455
1455
}
1456
1456
 
1457
1457
PyVarObject *
1458
1458
_PyObject_GC_Resize(PyVarObject *op, Py_ssize_t nitems)
1459
1459
{
1460
 
        const size_t basicsize = _PyObject_VAR_SIZE(Py_TYPE(op), nitems);
1461
 
        PyGC_Head *g = AS_GC(op);
1462
 
        if (basicsize > PY_SSIZE_T_MAX - sizeof(PyGC_Head))
1463
 
                return (PyVarObject *)PyErr_NoMemory();
1464
 
        g = (PyGC_Head *)PyObject_REALLOC(g,  sizeof(PyGC_Head) + basicsize);
1465
 
        if (g == NULL)
1466
 
                return (PyVarObject *)PyErr_NoMemory();
1467
 
        op = (PyVarObject *) FROM_GC(g);
1468
 
        Py_SIZE(op) = nitems;
1469
 
        return op;
 
1460
    const size_t basicsize = _PyObject_VAR_SIZE(Py_TYPE(op), nitems);
 
1461
    PyGC_Head *g = AS_GC(op);
 
1462
    if (basicsize > PY_SSIZE_T_MAX - sizeof(PyGC_Head))
 
1463
        return (PyVarObject *)PyErr_NoMemory();
 
1464
    g = (PyGC_Head *)PyObject_REALLOC(g,  sizeof(PyGC_Head) + basicsize);
 
1465
    if (g == NULL)
 
1466
        return (PyVarObject *)PyErr_NoMemory();
 
1467
    op = (PyVarObject *) FROM_GC(g);
 
1468
    Py_SIZE(op) = nitems;
 
1469
    return op;
1470
1470
}
1471
1471
 
1472
1472
void
1473
1473
PyObject_GC_Del(void *op)
1474
1474
{
1475
 
        PyGC_Head *g = AS_GC(op);
1476
 
        if (IS_TRACKED(op))
1477
 
                gc_list_remove(g);
1478
 
        if (generations[0].count > 0) {
1479
 
                generations[0].count--;
1480
 
        }
1481
 
        PyObject_FREE(g);
 
1475
    PyGC_Head *g = AS_GC(op);
 
1476
    if (IS_TRACKED(op))
 
1477
        gc_list_remove(g);
 
1478
    if (generations[0].count > 0) {
 
1479
        generations[0].count--;
 
1480
    }
 
1481
    PyObject_FREE(g);
1482
1482
}
1483
1483
 
1484
1484
/* for binary compatibility with 2.2 */