annotate Modules/gcmodule.c @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents 351657165a05
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1 /*
24072
86b3760d285d SF bug #574132: Major GC related performance regression
Tim Peters <tim.peters@gmail.com>
parents: 24036
diff changeset
2
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
3 Reference Cycle Garbage Collection
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
4 ==================================
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
5
15013
25bc16952a24 - update Neil's email address
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15012
diff changeset
6 Neil Schemenauer <nas@arctrix.com>
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
7
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
8 Based on a post on the python-dev list. Ideas from Guido van Rossum,
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
9 Eric Tiedemann, and various others.
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
10
19585
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
11 http://www.arctrix.com/nas/python/gc/
48479
d040a3b63df4 Fix some broken URLs to GC design discussions.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 47580
diff changeset
12
d040a3b63df4 Fix some broken URLs to GC design discussions.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 47580
diff changeset
13 The following mailing list threads provide a historical perspective on
d040a3b63df4 Fix some broken URLs to GC design discussions.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 47580
diff changeset
14 the design of this module. Note that a fair amount of refinement has
d040a3b63df4 Fix some broken URLs to GC design discussions.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 47580
diff changeset
15 occurred since those discussions.
d040a3b63df4 Fix some broken URLs to GC design discussions.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 47580
diff changeset
16
d040a3b63df4 Fix some broken URLs to GC design discussions.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 47580
diff changeset
17 http://mail.python.org/pipermail/python-dev/2000-March/002385.html
d040a3b63df4 Fix some broken URLs to GC design discussions.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 47580
diff changeset
18 http://mail.python.org/pipermail/python-dev/2000-March/002434.html
d040a3b63df4 Fix some broken URLs to GC design discussions.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 47580
diff changeset
19 http://mail.python.org/pipermail/python-dev/2000-March/002497.html
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
20
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
21 For a highlevel view of the collection process, read the collect
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
22 function.
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
23
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
24 */
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
25
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
26 #include "Python.h"
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
27 #include "frameobject.h" /* for PyFrame_ClearFreeList */
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
28
19585
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
29 /* Get an object's GC head */
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
30 #define AS_GC(o) ((PyGC_Head *)(o)-1)
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
31
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
32 /* Get the object given the GC head */
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
33 #define FROM_GC(g) ((PyObject *)(((PyGC_Head *)g)+1))
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
34
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
35 /*** Global GC state ***/
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
36
23377
2f7d869dad4d Move all data for a single generation into a structure. The set of
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 23296
diff changeset
37 struct gc_generation {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
38 PyGC_Head head;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
39 int threshold; /* collection threshold */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
40 int count; /* count of allocations or collections of younger
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
41 generations */
23377
2f7d869dad4d Move all data for a single generation into a structure. The set of
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 23296
diff changeset
42 };
2f7d869dad4d Move all data for a single generation into a structure. The set of
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 23296
diff changeset
43
2f7d869dad4d Move all data for a single generation into a structure. The set of
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 23296
diff changeset
44 #define NUM_GENERATIONS 3
2f7d869dad4d Move all data for a single generation into a structure. The set of
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 23296
diff changeset
45 #define GEN_HEAD(n) (&generations[n].head)
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
46
23377
2f7d869dad4d Move all data for a single generation into a structure. The set of
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 23296
diff changeset
47 /* linked lists of container objects */
2f7d869dad4d Move all data for a single generation into a structure. The set of
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 23296
diff changeset
48 static struct gc_generation generations[NUM_GENERATIONS] = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
49 /* PyGC_Head, threshold, count */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
50 {{{GEN_HEAD(0), GEN_HEAD(0), 0}}, 700, 0},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
51 {{{GEN_HEAD(1), GEN_HEAD(1), 0}}, 10, 0},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
52 {{{GEN_HEAD(2), GEN_HEAD(2), 0}}, 10, 0},
23377
2f7d869dad4d Move all data for a single generation into a structure. The set of
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 23296
diff changeset
53 };
2f7d869dad4d Move all data for a single generation into a structure. The set of
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 23296
diff changeset
54
2f7d869dad4d Move all data for a single generation into a structure. The set of
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 23296
diff changeset
55 PyGC_Head *_PyGC_generation0 = GEN_HEAD(0);
2f7d869dad4d Move all data for a single generation into a structure. The set of
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 23296
diff changeset
56
13878
abfa4e4b2f3e Neil Schemenauer: GC enable(), disable(), isenabled() interface.
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents: 13570
diff changeset
57 static int enabled = 1; /* automatic collection enabled? */
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
58
19585
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
59 /* true if we are currently running the collector */
28511
acf3596fcc28 Reworked move_finalizer_reachable() to create two distinct lists:
Tim Peters <tim.peters@gmail.com>
parents: 28510
diff changeset
60 static int collecting = 0;
19585
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
61
24085
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
62 /* list of uncollectable objects */
28511
acf3596fcc28 Reworked move_finalizer_reachable() to create two distinct lists:
Tim Peters <tim.peters@gmail.com>
parents: 28510
diff changeset
63 static PyObject *garbage = NULL;
24085
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
64
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
65 /* Python string to use if unhandled exception occurs */
28511
acf3596fcc28 Reworked move_finalizer_reachable() to create two distinct lists:
Tim Peters <tim.peters@gmail.com>
parents: 28510
diff changeset
66 static PyObject *gc_str = NULL;
24085
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
67
76319
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
68 /* a list of callbacks to be invoked when collection is performed */
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
69 static PyObject *callbacks = NULL;
28504
cb5db5561cdc Fix Tim's boom example.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28498
diff changeset
70
76319
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
71 /* This is the number of objects that survived the last full collection. It
50679
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
72 approximates the number of long lived objects tracked by the GC.
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
73
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
74 (by "full collection", we mean a collection of the oldest generation).
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
75 */
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
76 static Py_ssize_t long_lived_total = 0;
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
77
76319
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
78 /* This is the number of objects that survived all "non-full" collections,
50679
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
79 and are awaiting to undergo a full collection for the first time.
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
80
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
81 */
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
82 static Py_ssize_t long_lived_pending = 0;
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
83
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
84 /*
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
85 NOTE: about the counting of long-lived objects.
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
86
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
87 To limit the cost of garbage collection, there are two strategies;
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
88 - make each collection faster, e.g. by scanning fewer objects
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
89 - do less collections
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
90 This heuristic is about the latter strategy.
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
91
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
92 In addition to the various configurable thresholds, we only trigger a
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
93 full collection if the ratio
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
94 long_lived_pending / long_lived_total
50679
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
95 is above a given value (hardwired to 25%).
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
96
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
97 The reason is that, while "non-full" collections (i.e., collections of
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
98 the young and middle generations) will always examine roughly the same
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
99 number of objects -- determined by the aforementioned thresholds --,
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
100 the cost of a full collection is proportional to the total number of
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
101 long-lived objects, which is virtually unbounded.
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
102
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
103 Indeed, it has been remarked that doing a full collection every
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
104 <constant number> of object creations entails a dramatic performance
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
105 degradation in workloads which consist in creating and storing lots of
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
106 long-lived objects (e.g. building a large list of GC-tracked objects would
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
107 show quadratic performance, instead of linear as expected: see issue #4074).
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
108
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
109 Using the above ratio, instead, yields amortized linear performance in
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
110 the total number of objects (the effect of which can be summarized
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
111 thusly: "each full garbage collection is more and more costly as the
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
112 number of objects grows, but we do fewer and fewer of them").
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
113
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
114 This heuristic was suggested by Martin von Löwis on python-dev in
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
115 June 2008. His original analysis and proposal can be found at:
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
116 http://mail.python.org/pipermail/python-dev/2008-June/080579.html
50679
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
117 */
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
118
77210
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
119 /*
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
120 NOTE: about untracking of mutable objects.
84507
781be7ad1074 gcmodule.c: strip trailing spaces
Victor Stinner <victor.stinner@gmail.com>
parents: 83835
diff changeset
121
77210
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
122 Certain types of container cannot participate in a reference cycle, and
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
123 so do not need to be tracked by the garbage collector. Untracking these
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
124 objects reduces the cost of garbage collections. However, determining
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
125 which objects may be untracked is not free, and the costs must be
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
126 weighed against the benefits for garbage collection.
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
127
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
128 There are two possible strategies for when to untrack a container:
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
129
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
130 i) When the container is created.
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
131 ii) When the container is examined by the garbage collector.
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
132
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
133 Tuples containing only immutable objects (integers, strings etc, and
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
134 recursively, tuples of immutable objects) do not need to be tracked.
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
135 The interpreter creates a large number of tuples, many of which will
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
136 not survive until garbage collection. It is therefore not worthwhile
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
137 to untrack eligible tuples at creation time.
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
138
84507
781be7ad1074 gcmodule.c: strip trailing spaces
Victor Stinner <victor.stinner@gmail.com>
parents: 83835
diff changeset
139 Instead, all tuples except the empty tuple are tracked when created.
781be7ad1074 gcmodule.c: strip trailing spaces
Victor Stinner <victor.stinner@gmail.com>
parents: 83835
diff changeset
140 During garbage collection it is determined whether any surviving tuples
781be7ad1074 gcmodule.c: strip trailing spaces
Victor Stinner <victor.stinner@gmail.com>
parents: 83835
diff changeset
141 can be untracked. A tuple can be untracked if all of its contents are
781be7ad1074 gcmodule.c: strip trailing spaces
Victor Stinner <victor.stinner@gmail.com>
parents: 83835
diff changeset
142 already not tracked. Tuples are examined for untracking in all garbage
77210
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
143 collection cycles. It may take more than one cycle to untrack a tuple.
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
144
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
145 Dictionaries containing only immutable objects also do not need to be
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
146 tracked. Dictionaries are untracked when created. If a tracked item is
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
147 inserted into a dictionary (either as a key or value), the dictionary
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
148 becomes tracked. During a full garbage collection (all generations),
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
149 the collector will untrack any dictionaries whose contents are not
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
150 tracked.
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
151
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
152 The module provides the python function is_tracked(obj), which returns
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
153 the CURRENT tracking status of the object. Subsequent garbage
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
154 collections may change the tracking status of the object.
84507
781be7ad1074 gcmodule.c: strip trailing spaces
Victor Stinner <victor.stinner@gmail.com>
parents: 83835
diff changeset
155
781be7ad1074 gcmodule.c: strip trailing spaces
Victor Stinner <victor.stinner@gmail.com>
parents: 83835
diff changeset
156 Untracking of certain containers was introduced in issue #4688, and
77210
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
157 the algorithm was refined in response to issue #14775.
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
158 */
50679
5d0eac01a285 Merged revisions 68462 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50542
diff changeset
159
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
160 /* set for debugging information */
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
161 #define DEBUG_STATS (1<<0) /* print collection statistics */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
162 #define DEBUG_COLLECTABLE (1<<1) /* print collectable objects */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
163 #define DEBUG_UNCOLLECTABLE (1<<2) /* print uncollectable objects */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
164 #define DEBUG_SAVEALL (1<<5) /* save all garbage in gc.garbage */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
165 #define DEBUG_LEAK DEBUG_COLLECTABLE | \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
166 DEBUG_UNCOLLECTABLE | \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
167 DEBUG_SAVEALL
14330
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14294
diff changeset
168 static int debug;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
169 static PyObject *tmod = NULL;
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
170
80063
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
171 /* Running stats per generation */
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
172 struct gc_generation_stats {
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
173 /* total number of collections */
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
174 Py_ssize_t collections;
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
175 /* total number of collected objects */
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
176 Py_ssize_t collected;
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
177 /* total number of uncollectable objects (put into gc.garbage) */
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
178 Py_ssize_t uncollectable;
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
179 };
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
180
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
181 static struct gc_generation_stats generation_stats[NUM_GENERATIONS];
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
182
24085
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
183 /*--------------------------------------------------------------------------
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
184 gc_refs values.
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
185
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
186 Between collections, every gc'ed object has one of two gc_refs values:
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
187
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
188 GC_UNTRACKED
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
189 The initial state; objects returned by PyObject_GC_Malloc are in this
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
190 state. The object doesn't live in any generation list, and its
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
191 tp_traverse slot must not be called.
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
192
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
193 GC_REACHABLE
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
194 The object lives in some generation list, and its tp_traverse is safe to
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
195 call. An object transitions to GC_REACHABLE when PyObject_GC_Track
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
196 is called.
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
197
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
198 During a collection, gc_refs can temporarily take on other states:
19585
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
199
24085
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
200 >= 0
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
201 At the start of a collection, update_refs() copies the true refcount
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
202 to gc_refs, for each object in the generation being collected.
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
203 subtract_refs() then adjusts gc_refs so that it equals the number of
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
204 times an object is referenced directly from outside the generation
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
205 being collected.
26138
4ab6b7c3f311 Fix typo.
Martin v. Löwis <martin@v.loewis.de>
parents: 24714
diff changeset
206 gc_refs remains >= 0 throughout these steps.
24085
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
207
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
208 GC_TENTATIVELY_UNREACHABLE
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
209 move_unreachable() then moves objects not reachable (whether directly or
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
210 indirectly) from outside the generation into an "unreachable" set.
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
211 Objects that are found to be reachable have gc_refs set to GC_REACHABLE
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
212 again. Objects that are found to be unreachable have gc_refs set to
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
213 GC_TENTATIVELY_UNREACHABLE. It's "tentatively" because the pass doing
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
214 this can't be sure until it ends, and GC_TENTATIVELY_UNREACHABLE may
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
215 transition back to GC_REACHABLE.
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
216
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
217 Only objects with GC_TENTATIVELY_UNREACHABLE still set are candidates
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
218 for collection. If it's decided not to collect such an object (e.g.,
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
219 it has a __del__ method), its gc_refs is restored to GC_REACHABLE again.
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
220 ----------------------------------------------------------------------------
22d2f037af9d Finished transitioning to using gc_refs to track gc objects' states.
Tim Peters <tim.peters@gmail.com>
parents: 24077
diff changeset
221 */
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
222 #define GC_UNTRACKED _PyGC_REFS_UNTRACKED
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
223 #define GC_REACHABLE _PyGC_REFS_REACHABLE
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
224 #define GC_TENTATIVELY_UNREACHABLE _PyGC_REFS_TENTATIVELY_UNREACHABLE
24075
32db075def3f OK, I couldn't stand it <0.5 wink>: removed all uncertainty about what's
Tim Peters <tim.peters@gmail.com>
parents: 24074
diff changeset
225
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
226 #define IS_TRACKED(o) (_PyGC_REFS(o) != GC_UNTRACKED)
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
227 #define IS_REACHABLE(o) (_PyGC_REFS(o) == GC_REACHABLE)
24075
32db075def3f OK, I couldn't stand it <0.5 wink>: removed all uncertainty about what's
Tim Peters <tim.peters@gmail.com>
parents: 24074
diff changeset
228 #define IS_TENTATIVELY_UNREACHABLE(o) ( \
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
229 _PyGC_REFS(o) == GC_TENTATIVELY_UNREACHABLE)
23495
68e3f3dd4d48 Add IS_TRACKED and IS_MOVED macros. This makes the logic a little more clear.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 23377
diff changeset
230
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
231 /*** list functions ***/
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
232
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
233 static void
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
234 gc_list_init(PyGC_Head *list)
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
235 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
236 list->gc.gc_prev = list;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
237 list->gc.gc_next = list;
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
238 }
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
239
23377
2f7d869dad4d Move all data for a single generation into a structure. The set of
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 23296
diff changeset
240 static int
2f7d869dad4d Move all data for a single generation into a structure. The set of
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 23296
diff changeset
241 gc_list_is_empty(PyGC_Head *list)
2f7d869dad4d Move all data for a single generation into a structure. The set of
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 23296
diff changeset
242 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
243 return (list->gc.gc_next == list);
23377
2f7d869dad4d Move all data for a single generation into a structure. The set of
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 23296
diff changeset
244 }
2f7d869dad4d Move all data for a single generation into a structure. The set of
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 23296
diff changeset
245
33869
223d20afc8b5 gc list function cleanup.
Tim Peters <tim.peters@gmail.com>
parents: 33867
diff changeset
246 #if 0
223d20afc8b5 gc list function cleanup.
Tim Peters <tim.peters@gmail.com>
parents: 33867
diff changeset
247 /* This became unused after gc_list_move() was introduced. */
223d20afc8b5 gc list function cleanup.
Tim Peters <tim.peters@gmail.com>
parents: 33867
diff changeset
248 /* Append `node` to `list`. */
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
249 static void
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
250 gc_list_append(PyGC_Head *node, PyGC_Head *list)
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
251 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
252 node->gc.gc_next = list;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
253 node->gc.gc_prev = list->gc.gc_prev;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
254 node->gc.gc_prev->gc.gc_next = node;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
255 list->gc.gc_prev = node;
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
256 }
33869
223d20afc8b5 gc list function cleanup.
Tim Peters <tim.peters@gmail.com>
parents: 33867
diff changeset
257 #endif
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
258
33869
223d20afc8b5 gc list function cleanup.
Tim Peters <tim.peters@gmail.com>
parents: 33867
diff changeset
259 /* Remove `node` from the gc list it's currently in. */
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
260 static void
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
261 gc_list_remove(PyGC_Head *node)
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
262 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
263 node->gc.gc_prev->gc.gc_next = node->gc.gc_next;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
264 node->gc.gc_next->gc.gc_prev = node->gc.gc_prev;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
265 node->gc.gc_next = NULL; /* object is not currently tracked */
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
266 }
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
267
33869
223d20afc8b5 gc list function cleanup.
Tim Peters <tim.peters@gmail.com>
parents: 33867
diff changeset
268 /* Move `node` from the gc list it's currently in (which is not explicitly
223d20afc8b5 gc list function cleanup.
Tim Peters <tim.peters@gmail.com>
parents: 33867
diff changeset
269 * named here) to the end of `list`. This is semantically the same as
223d20afc8b5 gc list function cleanup.
Tim Peters <tim.peters@gmail.com>
parents: 33867
diff changeset
270 * gc_list_remove(node) followed by gc_list_append(node, list).
223d20afc8b5 gc list function cleanup.
Tim Peters <tim.peters@gmail.com>
parents: 33867
diff changeset
271 */
223d20afc8b5 gc list function cleanup.
Tim Peters <tim.peters@gmail.com>
parents: 33867
diff changeset
272 static void
223d20afc8b5 gc list function cleanup.
Tim Peters <tim.peters@gmail.com>
parents: 33867
diff changeset
273 gc_list_move(PyGC_Head *node, PyGC_Head *list)
223d20afc8b5 gc list function cleanup.
Tim Peters <tim.peters@gmail.com>
parents: 33867
diff changeset
274 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
275 PyGC_Head *new_prev;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
276 PyGC_Head *current_prev = node->gc.gc_prev;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
277 PyGC_Head *current_next = node->gc.gc_next;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
278 /* Unlink from current list. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
279 current_prev->gc.gc_next = current_next;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
280 current_next->gc.gc_prev = current_prev;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
281 /* Relink at end of new list. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
282 new_prev = node->gc.gc_prev = list->gc.gc_prev;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
283 new_prev->gc.gc_next = list->gc.gc_prev = node;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
284 node->gc.gc_next = list;
33869
223d20afc8b5 gc list function cleanup.
Tim Peters <tim.peters@gmail.com>
parents: 33867
diff changeset
285 }
223d20afc8b5 gc list function cleanup.
Tim Peters <tim.peters@gmail.com>
parents: 33867
diff changeset
286
223d20afc8b5 gc list function cleanup.
Tim Peters <tim.peters@gmail.com>
parents: 33867
diff changeset
287 /* append list `from` onto list `to`; `from` becomes an empty list */
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
288 static void
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
289 gc_list_merge(PyGC_Head *from, PyGC_Head *to)
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
290 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
291 PyGC_Head *tail;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
292 assert(from != to);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
293 if (!gc_list_is_empty(from)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
294 tail = to->gc.gc_prev;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
295 tail->gc.gc_next = from->gc.gc_next;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
296 tail->gc.gc_next->gc.gc_prev = tail;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
297 to->gc.gc_prev = from->gc.gc_prev;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
298 to->gc.gc_prev->gc.gc_next = to;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
299 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
300 gc_list_init(from);
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
301 }
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
302
36839
7c1aca8e3d7d Make PyGC_Collect() use Py_ssize_t.
Neal Norwitz <nnorwitz@gmail.com>
parents: 36769
diff changeset
303 static Py_ssize_t
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
304 gc_list_size(PyGC_Head *list)
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
305 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
306 PyGC_Head *gc;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
307 Py_ssize_t n = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
308 for (gc = list->gc.gc_next; gc != list; gc = gc->gc.gc_next) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
309 n++;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
310 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
311 return n;
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
312 }
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
313
28515
4c596dd60c22 handle_finalizers(): Rewrote to call append_objects() and gc_list_merge()
Tim Peters <tim.peters@gmail.com>
parents: 28512
diff changeset
314 /* Append objects in a GC list to a Python list.
4c596dd60c22 handle_finalizers(): Rewrote to call append_objects() and gc_list_merge()
Tim Peters <tim.peters@gmail.com>
parents: 28512
diff changeset
315 * Return 0 if all OK, < 0 if error (out of memory for list).
4c596dd60c22 handle_finalizers(): Rewrote to call append_objects() and gc_list_merge()
Tim Peters <tim.peters@gmail.com>
parents: 28512
diff changeset
316 */
4c596dd60c22 handle_finalizers(): Rewrote to call append_objects() and gc_list_merge()
Tim Peters <tim.peters@gmail.com>
parents: 28512
diff changeset
317 static int
4c596dd60c22 handle_finalizers(): Rewrote to call append_objects() and gc_list_merge()
Tim Peters <tim.peters@gmail.com>
parents: 28512
diff changeset
318 append_objects(PyObject *py_list, PyGC_Head *gc_list)
4c596dd60c22 handle_finalizers(): Rewrote to call append_objects() and gc_list_merge()
Tim Peters <tim.peters@gmail.com>
parents: 28512
diff changeset
319 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
320 PyGC_Head *gc;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
321 for (gc = gc_list->gc.gc_next; gc != gc_list; gc = gc->gc.gc_next) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
322 PyObject *op = FROM_GC(gc);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
323 if (op != py_list) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
324 if (PyList_Append(py_list, op)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
325 return -1; /* exception */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
326 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
327 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
328 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
329 return 0;
28515
4c596dd60c22 handle_finalizers(): Rewrote to call append_objects() and gc_list_merge()
Tim Peters <tim.peters@gmail.com>
parents: 28512
diff changeset
330 }
4c596dd60c22 handle_finalizers(): Rewrote to call append_objects() and gc_list_merge()
Tim Peters <tim.peters@gmail.com>
parents: 28512
diff changeset
331
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
332 /*** end of list stuff ***/
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
333
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
334
24075
32db075def3f OK, I couldn't stand it <0.5 wink>: removed all uncertainty about what's
Tim Peters <tim.peters@gmail.com>
parents: 24074
diff changeset
335 /* Set all gc_refs = ob_refcnt. After this, gc_refs is > 0 for all objects
32db075def3f OK, I couldn't stand it <0.5 wink>: removed all uncertainty about what's
Tim Peters <tim.peters@gmail.com>
parents: 24074
diff changeset
336 * in containers, and is GC_REACHABLE for all tracked gc objects not in
32db075def3f OK, I couldn't stand it <0.5 wink>: removed all uncertainty about what's
Tim Peters <tim.peters@gmail.com>
parents: 24074
diff changeset
337 * containers.
24072
86b3760d285d SF bug #574132: Major GC related performance regression
Tim Peters <tim.peters@gmail.com>
parents: 24036
diff changeset
338 */
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
339 static void
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
340 update_refs(PyGC_Head *containers)
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
341 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
342 PyGC_Head *gc = containers->gc.gc_next;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
343 for (; gc != containers; gc = gc->gc.gc_next) {
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
344 assert(_PyGCHead_REFS(gc) == GC_REACHABLE);
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
345 _PyGCHead_SET_REFS(gc, Py_REFCNT(FROM_GC(gc)));
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
346 /* Python's cyclic gc should never see an incoming refcount
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
347 * of 0: if something decref'ed to 0, it should have been
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
348 * deallocated immediately at that time.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
349 * Possible cause (if the assert triggers): a tp_dealloc
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
350 * routine left a gc-aware object tracked during its teardown
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
351 * phase, and did something-- or allowed something to happen --
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
352 * that called back into Python. gc can trigger then, and may
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
353 * see the still-tracked dying object. Before this assert
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
354 * was added, such mistakes went on to allow gc to try to
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
355 * delete the object again. In a debug build, that caused
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
356 * a mysterious segfault, when _Py_ForgetReference tried
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
357 * to remove the object from the doubly-linked list of all
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
358 * objects a second time. In a release build, an actual
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
359 * double deallocation occurred, which leads to corruption
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
360 * of the allocator's internal bookkeeping pointers. That's
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
361 * so serious that maybe this should be a release-build
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
362 * check instead of an assert?
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
363 */
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
364 assert(_PyGCHead_REFS(gc) != 0);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
365 }
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
366 }
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
367
24075
32db075def3f OK, I couldn't stand it <0.5 wink>: removed all uncertainty about what's
Tim Peters <tim.peters@gmail.com>
parents: 24074
diff changeset
368 /* A traversal callback for subtract_refs. */
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
369 static int
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
370 visit_decref(PyObject *op, void *data)
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
371 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
372 assert(op != NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
373 if (PyObject_IS_GC(op)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
374 PyGC_Head *gc = AS_GC(op);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
375 /* We're only interested in gc_refs for objects in the
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
376 * generation being collected, which can be recognized
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
377 * because only they have positive gc_refs.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
378 */
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
379 assert(_PyGCHead_REFS(gc) != 0); /* else refcount was too small */
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
380 if (_PyGCHead_REFS(gc) > 0)
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
381 _PyGCHead_DECREF(gc);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
382 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
383 return 0;
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
384 }
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
385
24075
32db075def3f OK, I couldn't stand it <0.5 wink>: removed all uncertainty about what's
Tim Peters <tim.peters@gmail.com>
parents: 24074
diff changeset
386 /* Subtract internal references from gc_refs. After this, gc_refs is >= 0
32db075def3f OK, I couldn't stand it <0.5 wink>: removed all uncertainty about what's
Tim Peters <tim.peters@gmail.com>
parents: 24074
diff changeset
387 * for all objects in containers, and is GC_REACHABLE for all tracked gc
32db075def3f OK, I couldn't stand it <0.5 wink>: removed all uncertainty about what's
Tim Peters <tim.peters@gmail.com>
parents: 24074
diff changeset
388 * objects not in containers. The ones with gc_refs > 0 are directly
32db075def3f OK, I couldn't stand it <0.5 wink>: removed all uncertainty about what's
Tim Peters <tim.peters@gmail.com>
parents: 24074
diff changeset
389 * reachable from outside containers, and so can't be collected.
32db075def3f OK, I couldn't stand it <0.5 wink>: removed all uncertainty about what's
Tim Peters <tim.peters@gmail.com>
parents: 24074
diff changeset
390 */
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
391 static void
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
392 subtract_refs(PyGC_Head *containers)
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
393 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
394 traverseproc traverse;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
395 PyGC_Head *gc = containers->gc.gc_next;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
396 for (; gc != containers; gc=gc->gc.gc_next) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
397 traverse = Py_TYPE(FROM_GC(gc))->tp_traverse;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
398 (void) traverse(FROM_GC(gc),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
399 (visitproc)visit_decref,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
400 NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
401 }
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
402 }
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
403
24075
32db075def3f OK, I couldn't stand it <0.5 wink>: removed all uncertainty about what's
Tim Peters <tim.peters@gmail.com>
parents: 24074
diff changeset
404 /* A traversal callback for move_unreachable. */
32db075def3f OK, I couldn't stand it <0.5 wink>: removed all uncertainty about what's
Tim Peters <tim.peters@gmail.com>
parents: 24074
diff changeset
405 static int
32db075def3f OK, I couldn't stand it <0.5 wink>: removed all uncertainty about what's
Tim Peters <tim.peters@gmail.com>
parents: 24074
diff changeset
406 visit_reachable(PyObject *op, PyGC_Head *reachable)
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
407 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
408 if (PyObject_IS_GC(op)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
409 PyGC_Head *gc = AS_GC(op);
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
410 const Py_ssize_t gc_refs = _PyGCHead_REFS(gc);
24075
32db075def3f OK, I couldn't stand it <0.5 wink>: removed all uncertainty about what's
Tim Peters <tim.peters@gmail.com>
parents: 24074
diff changeset
411
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
412 if (gc_refs == 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
413 /* This is in move_unreachable's 'young' list, but
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
414 * the traversal hasn't yet gotten to it. All
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
415 * we need to do is tell move_unreachable that it's
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
416 * reachable.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
417 */
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
418 _PyGCHead_SET_REFS(gc, 1);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
419 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
420 else if (gc_refs == GC_TENTATIVELY_UNREACHABLE) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
421 /* This had gc_refs = 0 when move_unreachable got
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
422 * to it, but turns out it's reachable after all.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
423 * Move it back to move_unreachable's 'young' list,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
424 * and move_unreachable will eventually get to it
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
425 * again.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
426 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
427 gc_list_move(gc, reachable);
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
428 _PyGCHead_SET_REFS(gc, 1);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
429 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
430 /* Else there's nothing to do.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
431 * If gc_refs > 0, it must be in move_unreachable's 'young'
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
432 * list, and move_unreachable will eventually get to it.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
433 * If gc_refs == GC_REACHABLE, it's either in some other
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
434 * generation so we don't care about it, or move_unreachable
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
435 * already dealt with it.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
436 * If gc_refs == GC_UNTRACKED, it must be ignored.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
437 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
438 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
439 assert(gc_refs > 0
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
440 || gc_refs == GC_REACHABLE
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
441 || gc_refs == GC_UNTRACKED);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
442 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
443 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
444 return 0;
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
445 }
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
446
24075
32db075def3f OK, I couldn't stand it <0.5 wink>: removed all uncertainty about what's
Tim Peters <tim.peters@gmail.com>
parents: 24074
diff changeset
447 /* Move the unreachable objects from young to unreachable. After this,
32db075def3f OK, I couldn't stand it <0.5 wink>: removed all uncertainty about what's
Tim Peters <tim.peters@gmail.com>
parents: 24074
diff changeset
448 * all objects in young have gc_refs = GC_REACHABLE, and all objects in
32db075def3f OK, I couldn't stand it <0.5 wink>: removed all uncertainty about what's
Tim Peters <tim.peters@gmail.com>
parents: 24074
diff changeset
449 * unreachable have gc_refs = GC_TENTATIVELY_UNREACHABLE. All tracked
32db075def3f OK, I couldn't stand it <0.5 wink>: removed all uncertainty about what's
Tim Peters <tim.peters@gmail.com>
parents: 24074
diff changeset
450 * gc objects not in young or unreachable still have gc_refs = GC_REACHABLE.
32db075def3f OK, I couldn't stand it <0.5 wink>: removed all uncertainty about what's
Tim Peters <tim.peters@gmail.com>
parents: 24074
diff changeset
451 * All objects in young after this are directly or indirectly reachable
32db075def3f OK, I couldn't stand it <0.5 wink>: removed all uncertainty about what's
Tim Peters <tim.peters@gmail.com>
parents: 24074
diff changeset
452 * from outside the original young; and all objects in unreachable are
32db075def3f OK, I couldn't stand it <0.5 wink>: removed all uncertainty about what's
Tim Peters <tim.peters@gmail.com>
parents: 24074
diff changeset
453 * not.
24072
86b3760d285d SF bug #574132: Major GC related performance regression
Tim Peters <tim.peters@gmail.com>
parents: 24036
diff changeset
454 */
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
455 static void
24075
32db075def3f OK, I couldn't stand it <0.5 wink>: removed all uncertainty about what's
Tim Peters <tim.peters@gmail.com>
parents: 24074
diff changeset
456 move_unreachable(PyGC_Head *young, PyGC_Head *unreachable)
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
457 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
458 PyGC_Head *gc = young->gc.gc_next;
24075
32db075def3f OK, I couldn't stand it <0.5 wink>: removed all uncertainty about what's
Tim Peters <tim.peters@gmail.com>
parents: 24074
diff changeset
459
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
460 /* Invariants: all objects "to the left" of us in young have gc_refs
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
461 * = GC_REACHABLE, and are indeed reachable (directly or indirectly)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
462 * from outside the young list as it was at entry. All other objects
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
463 * from the original young "to the left" of us are in unreachable now,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
464 * and have gc_refs = GC_TENTATIVELY_UNREACHABLE. All objects to the
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
465 * left of us in 'young' now have been scanned, and no objects here
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
466 * or to the right have been scanned yet.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
467 */
24075
32db075def3f OK, I couldn't stand it <0.5 wink>: removed all uncertainty about what's
Tim Peters <tim.peters@gmail.com>
parents: 24074
diff changeset
468
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
469 while (gc != young) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
470 PyGC_Head *next;
24075
32db075def3f OK, I couldn't stand it <0.5 wink>: removed all uncertainty about what's
Tim Peters <tim.peters@gmail.com>
parents: 24074
diff changeset
471
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
472 if (_PyGCHead_REFS(gc)) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
473 /* gc is definitely reachable from outside the
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
474 * original 'young'. Mark it as such, and traverse
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
475 * its pointers to find any other objects that may
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
476 * be directly reachable from it. Note that the
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
477 * call to tp_traverse may append objects to young,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
478 * so we have to wait until it returns to determine
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
479 * the next object to visit.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
480 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
481 PyObject *op = FROM_GC(gc);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
482 traverseproc traverse = Py_TYPE(op)->tp_traverse;
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
483 assert(_PyGCHead_REFS(gc) > 0);
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
484 _PyGCHead_SET_REFS(gc, GC_REACHABLE);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
485 (void) traverse(op,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
486 (visitproc)visit_reachable,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
487 (void *)young);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
488 next = gc->gc.gc_next;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
489 if (PyTuple_CheckExact(op)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
490 _PyTuple_MaybeUntrack(op);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
491 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
492 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
493 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
494 /* This *may* be unreachable. To make progress,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
495 * assume it is. gc isn't directly reachable from
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
496 * any object we've already traversed, but may be
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
497 * reachable from an object we haven't gotten to yet.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
498 * visit_reachable will eventually move gc back into
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
499 * young if that's so, and we'll see it again.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
500 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
501 next = gc->gc.gc_next;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
502 gc_list_move(gc, unreachable);
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
503 _PyGCHead_SET_REFS(gc, GC_TENTATIVELY_UNREACHABLE);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
504 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
505 gc = next;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
506 }
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
507 }
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
508
77210
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
509 /* Try to untrack all currently tracked dictionaries */
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
510 static void
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
511 untrack_dicts(PyGC_Head *head)
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
512 {
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
513 PyGC_Head *next, *gc = head->gc.gc_next;
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
514 while (gc != head) {
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
515 PyObject *op = FROM_GC(gc);
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
516 next = gc->gc.gc_next;
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
517 if (PyDict_CheckExact(op))
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
518 _PyDict_MaybeUntrack(op);
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
519 gc = next;
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
520 }
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
521 }
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
522
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
523 /* Return true if object has a pre-PEP 442 finalization method. */
20818
9aded6235d89 Add has_finalizer predictate function. Use it when deciding which
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 20810
diff changeset
524 static int
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
525 has_legacy_finalizer(PyObject *op)
20818
9aded6235d89 Add has_finalizer predictate function. Use it when deciding which
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 20810
diff changeset
526 {
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
527 return op->ob_type->tp_del != NULL;
20818
9aded6235d89 Add has_finalizer predictate function. Use it when deciding which
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 20810
diff changeset
528 }
9aded6235d89 Add has_finalizer predictate function. Use it when deciding which
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 20810
diff changeset
529
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
530 /* Move the objects in unreachable with tp_del slots into `finalizers`.
33862
facb5a2f4b53 SF 1055820: weakref callback vs gc vs threads
Tim Peters <tim.peters@gmail.com>
parents: 31341
diff changeset
531 * Objects moved into `finalizers` have gc_refs set to GC_REACHABLE; the
facb5a2f4b53 SF 1055820: weakref callback vs gc vs threads
Tim Peters <tim.peters@gmail.com>
parents: 31341
diff changeset
532 * objects remaining in unreachable are left at GC_TENTATIVELY_UNREACHABLE.
28504
cb5db5561cdc Fix Tim's boom example.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28498
diff changeset
533 */
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
534 static void
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
535 move_legacy_finalizers(PyGC_Head *unreachable, PyGC_Head *finalizers)
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
536 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
537 PyGC_Head *gc;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
538 PyGC_Head *next;
28520
6653a56002ef Reworked has_finalizer() to use the new _PyObject_Lookup() instead
Tim Peters <tim.peters@gmail.com>
parents: 28516
diff changeset
539
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
540 /* March over unreachable. Move objects with finalizers into
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
541 * `finalizers`.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
542 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
543 for (gc = unreachable->gc.gc_next; gc != unreachable; gc = next) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
544 PyObject *op = FROM_GC(gc);
28504
cb5db5561cdc Fix Tim's boom example.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28498
diff changeset
545
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
546 assert(IS_TENTATIVELY_UNREACHABLE(op));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
547 next = gc->gc.gc_next;
28510
0de0ded19968 move_finalizers(): Rewrote. It's not necessary for this routine
Tim Peters <tim.peters@gmail.com>
parents: 28508
diff changeset
548
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
549 if (has_legacy_finalizer(op)) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
550 gc_list_move(gc, finalizers);
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
551 _PyGCHead_SET_REFS(gc, GC_REACHABLE);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
552 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
553 }
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
554 }
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
555
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
556 /* A traversal callback for move_legacy_finalizer_reachable. */
24075
32db075def3f OK, I couldn't stand it <0.5 wink>: removed all uncertainty about what's
Tim Peters <tim.peters@gmail.com>
parents: 24074
diff changeset
557 static int
32db075def3f OK, I couldn't stand it <0.5 wink>: removed all uncertainty about what's
Tim Peters <tim.peters@gmail.com>
parents: 24074
diff changeset
558 visit_move(PyObject *op, PyGC_Head *tolist)
32db075def3f OK, I couldn't stand it <0.5 wink>: removed all uncertainty about what's
Tim Peters <tim.peters@gmail.com>
parents: 24074
diff changeset
559 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
560 if (PyObject_IS_GC(op)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
561 if (IS_TENTATIVELY_UNREACHABLE(op)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
562 PyGC_Head *gc = AS_GC(op);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
563 gc_list_move(gc, tolist);
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
564 _PyGCHead_SET_REFS(gc, GC_REACHABLE);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
565 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
566 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
567 return 0;
24075
32db075def3f OK, I couldn't stand it <0.5 wink>: removed all uncertainty about what's
Tim Peters <tim.peters@gmail.com>
parents: 24074
diff changeset
568 }
32db075def3f OK, I couldn't stand it <0.5 wink>: removed all uncertainty about what's
Tim Peters <tim.peters@gmail.com>
parents: 24074
diff changeset
569
32db075def3f OK, I couldn't stand it <0.5 wink>: removed all uncertainty about what's
Tim Peters <tim.peters@gmail.com>
parents: 24074
diff changeset
570 /* Move objects that are reachable from finalizers, from the unreachable set
28520
6653a56002ef Reworked has_finalizer() to use the new _PyObject_Lookup() instead
Tim Peters <tim.peters@gmail.com>
parents: 28516
diff changeset
571 * into finalizers set.
24075
32db075def3f OK, I couldn't stand it <0.5 wink>: removed all uncertainty about what's
Tim Peters <tim.peters@gmail.com>
parents: 24074
diff changeset
572 */
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
573 static void
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
574 move_legacy_finalizer_reachable(PyGC_Head *finalizers)
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
575 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
576 traverseproc traverse;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
577 PyGC_Head *gc = finalizers->gc.gc_next;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
578 for (; gc != finalizers; gc = gc->gc.gc_next) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
579 /* Note that the finalizers list may grow during this. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
580 traverse = Py_TYPE(FROM_GC(gc))->tp_traverse;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
581 (void) traverse(FROM_GC(gc),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
582 (visitproc)visit_move,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
583 (void *)finalizers);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
584 }
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
585 }
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
586
33862
facb5a2f4b53 SF 1055820: weakref callback vs gc vs threads
Tim Peters <tim.peters@gmail.com>
parents: 31341
diff changeset
587 /* Clear all weakrefs to unreachable objects, and if such a weakref has a
facb5a2f4b53 SF 1055820: weakref callback vs gc vs threads
Tim Peters <tim.peters@gmail.com>
parents: 31341
diff changeset
588 * callback, invoke it if necessary. Note that it's possible for such
facb5a2f4b53 SF 1055820: weakref callback vs gc vs threads
Tim Peters <tim.peters@gmail.com>
parents: 31341
diff changeset
589 * weakrefs to be outside the unreachable set -- indeed, those are precisely
facb5a2f4b53 SF 1055820: weakref callback vs gc vs threads
Tim Peters <tim.peters@gmail.com>
parents: 31341
diff changeset
590 * the weakrefs whose callbacks must be invoked. See gc_weakref.txt for
facb5a2f4b53 SF 1055820: weakref callback vs gc vs threads
Tim Peters <tim.peters@gmail.com>
parents: 31341
diff changeset
591 * overview & some details. Some weakrefs with callbacks may be reclaimed
facb5a2f4b53 SF 1055820: weakref callback vs gc vs threads
Tim Peters <tim.peters@gmail.com>
parents: 31341
diff changeset
592 * directly by this routine; the number reclaimed is the return value. Other
facb5a2f4b53 SF 1055820: weakref callback vs gc vs threads
Tim Peters <tim.peters@gmail.com>
parents: 31341
diff changeset
593 * weakrefs with callbacks may be moved into the `old` generation. Objects
facb5a2f4b53 SF 1055820: weakref callback vs gc vs threads
Tim Peters <tim.peters@gmail.com>
parents: 31341
diff changeset
594 * moved into `old` have gc_refs set to GC_REACHABLE; the objects remaining in
facb5a2f4b53 SF 1055820: weakref callback vs gc vs threads
Tim Peters <tim.peters@gmail.com>
parents: 31341
diff changeset
595 * unreachable are left at GC_TENTATIVELY_UNREACHABLE. When this returns,
facb5a2f4b53 SF 1055820: weakref callback vs gc vs threads
Tim Peters <tim.peters@gmail.com>
parents: 31341
diff changeset
596 * no object in `unreachable` is weakly referenced anymore.
30988
caa1a48da4cc SF bug 839548: Bug in type's GC handling causes segfaults.
Tim Peters <tim.peters@gmail.com>
parents: 30918
diff changeset
597 */
caa1a48da4cc SF bug 839548: Bug in type's GC handling causes segfaults.
Tim Peters <tim.peters@gmail.com>
parents: 30918
diff changeset
598 static int
33862
facb5a2f4b53 SF 1055820: weakref callback vs gc vs threads
Tim Peters <tim.peters@gmail.com>
parents: 31341
diff changeset
599 handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
30988
caa1a48da4cc SF bug 839548: Bug in type's GC handling causes segfaults.
Tim Peters <tim.peters@gmail.com>
parents: 30918
diff changeset
600 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
601 PyGC_Head *gc;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
602 PyObject *op; /* generally FROM_GC(gc) */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
603 PyWeakReference *wr; /* generally a cast of op */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
604 PyGC_Head wrcb_to_call; /* weakrefs with callbacks to call */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
605 PyGC_Head *next;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
606 int num_freed = 0;
30988
caa1a48da4cc SF bug 839548: Bug in type's GC handling causes segfaults.
Tim Peters <tim.peters@gmail.com>
parents: 30918
diff changeset
607
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
608 gc_list_init(&wrcb_to_call);
33862
facb5a2f4b53 SF 1055820: weakref callback vs gc vs threads
Tim Peters <tim.peters@gmail.com>
parents: 31341
diff changeset
609
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
610 /* Clear all weakrefs to the objects in unreachable. If such a weakref
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
611 * also has a callback, move it into `wrcb_to_call` if the callback
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
612 * needs to be invoked. Note that we cannot invoke any callbacks until
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
613 * all weakrefs to unreachable objects are cleared, lest the callback
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
614 * resurrect an unreachable object via a still-active weakref. We
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
615 * make another pass over wrcb_to_call, invoking callbacks, after this
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
616 * pass completes.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
617 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
618 for (gc = unreachable->gc.gc_next; gc != unreachable; gc = next) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
619 PyWeakReference **wrlist;
33862
facb5a2f4b53 SF 1055820: weakref callback vs gc vs threads
Tim Peters <tim.peters@gmail.com>
parents: 31341
diff changeset
620
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
621 op = FROM_GC(gc);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
622 assert(IS_TENTATIVELY_UNREACHABLE(op));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
623 next = gc->gc.gc_next;
33862
facb5a2f4b53 SF 1055820: weakref callback vs gc vs threads
Tim Peters <tim.peters@gmail.com>
parents: 31341
diff changeset
624
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
625 if (! PyType_SUPPORTS_WEAKREFS(Py_TYPE(op)))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
626 continue;
33862
facb5a2f4b53 SF 1055820: weakref callback vs gc vs threads
Tim Peters <tim.peters@gmail.com>
parents: 31341
diff changeset
627
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
628 /* It supports weakrefs. Does it have any? */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
629 wrlist = (PyWeakReference **)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
630 PyObject_GET_WEAKREFS_LISTPTR(op);
33862
facb5a2f4b53 SF 1055820: weakref callback vs gc vs threads
Tim Peters <tim.peters@gmail.com>
parents: 31341
diff changeset
631
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
632 /* `op` may have some weakrefs. March over the list, clear
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
633 * all the weakrefs, and move the weakrefs with callbacks
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
634 * that must be called into wrcb_to_call.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
635 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
636 for (wr = *wrlist; wr != NULL; wr = *wrlist) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
637 PyGC_Head *wrasgc; /* AS_GC(wr) */
33862
facb5a2f4b53 SF 1055820: weakref callback vs gc vs threads
Tim Peters <tim.peters@gmail.com>
parents: 31341
diff changeset
638
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
639 /* _PyWeakref_ClearRef clears the weakref but leaves
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
640 * the callback pointer intact. Obscure: it also
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
641 * changes *wrlist.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
642 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
643 assert(wr->wr_object == op);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
644 _PyWeakref_ClearRef(wr);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
645 assert(wr->wr_object == Py_None);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
646 if (wr->wr_callback == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
647 continue; /* no callback */
30988
caa1a48da4cc SF bug 839548: Bug in type's GC handling causes segfaults.
Tim Peters <tim.peters@gmail.com>
parents: 30918
diff changeset
648
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
649 /* Headache time. `op` is going away, and is weakly referenced by
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
650 * `wr`, which has a callback. Should the callback be invoked? If wr
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
651 * is also trash, no:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
652 *
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
653 * 1. There's no need to call it. The object and the weakref are
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
654 * both going away, so it's legitimate to pretend the weakref is
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
655 * going away first. The user has to ensure a weakref outlives its
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
656 * referent if they want a guarantee that the wr callback will get
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
657 * invoked.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
658 *
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
659 * 2. It may be catastrophic to call it. If the callback is also in
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
660 * cyclic trash (CT), then although the CT is unreachable from
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
661 * outside the current generation, CT may be reachable from the
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
662 * callback. Then the callback could resurrect insane objects.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
663 *
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
664 * Since the callback is never needed and may be unsafe in this case,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
665 * wr is simply left in the unreachable set. Note that because we
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
666 * already called _PyWeakref_ClearRef(wr), its callback will never
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
667 * trigger.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
668 *
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
669 * OTOH, if wr isn't part of CT, we should invoke the callback: the
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
670 * weakref outlived the trash. Note that since wr isn't CT in this
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
671 * case, its callback can't be CT either -- wr acted as an external
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
672 * root to this generation, and therefore its callback did too. So
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
673 * nothing in CT is reachable from the callback either, so it's hard
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
674 * to imagine how calling it later could create a problem for us. wr
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
675 * is moved to wrcb_to_call in this case.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
676 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
677 if (IS_TENTATIVELY_UNREACHABLE(wr))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
678 continue;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
679 assert(IS_REACHABLE(wr));
33867
07d94a162cf8 handle_weakrefs(): Simplification -- there's no need to make a second
Tim Peters <tim.peters@gmail.com>
parents: 33862
diff changeset
680
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
681 /* Create a new reference so that wr can't go away
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
682 * before we can process it again.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
683 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
684 Py_INCREF(wr);
33862
facb5a2f4b53 SF 1055820: weakref callback vs gc vs threads
Tim Peters <tim.peters@gmail.com>
parents: 31341
diff changeset
685
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
686 /* Move wr to wrcb_to_call, for the next pass. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
687 wrasgc = AS_GC(wr);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
688 assert(wrasgc != next); /* wrasgc is reachable, but
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
689 next isn't, so they can't
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
690 be the same */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
691 gc_list_move(wrasgc, &wrcb_to_call);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
692 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
693 }
33862
facb5a2f4b53 SF 1055820: weakref callback vs gc vs threads
Tim Peters <tim.peters@gmail.com>
parents: 31341
diff changeset
694
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
695 /* Invoke the callbacks we decided to honor. It's safe to invoke them
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
696 * because they can't reference unreachable objects.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
697 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
698 while (! gc_list_is_empty(&wrcb_to_call)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
699 PyObject *temp;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
700 PyObject *callback;
33862
facb5a2f4b53 SF 1055820: weakref callback vs gc vs threads
Tim Peters <tim.peters@gmail.com>
parents: 31341
diff changeset
701
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
702 gc = wrcb_to_call.gc.gc_next;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
703 op = FROM_GC(gc);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
704 assert(IS_REACHABLE(op));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
705 assert(PyWeakref_Check(op));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
706 wr = (PyWeakReference *)op;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
707 callback = wr->wr_callback;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
708 assert(callback != NULL);
33862
facb5a2f4b53 SF 1055820: weakref callback vs gc vs threads
Tim Peters <tim.peters@gmail.com>
parents: 31341
diff changeset
709
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
710 /* copy-paste of weakrefobject.c's handle_callback() */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
711 temp = PyObject_CallFunctionObjArgs(callback, wr, NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
712 if (temp == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
713 PyErr_WriteUnraisable(callback);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
714 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
715 Py_DECREF(temp);
33862
facb5a2f4b53 SF 1055820: weakref callback vs gc vs threads
Tim Peters <tim.peters@gmail.com>
parents: 31341
diff changeset
716
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
717 /* Give up the reference we created in the first pass. When
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
718 * op's refcount hits 0 (which it may or may not do right now),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
719 * op's tp_dealloc will decref op->wr_callback too. Note
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
720 * that the refcount probably will hit 0 now, and because this
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
721 * weakref was reachable to begin with, gc didn't already
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
722 * add it to its count of freed objects. Example: a reachable
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
723 * weak value dict maps some key to this reachable weakref.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
724 * The callback removes this key->weakref mapping from the
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
725 * dict, leaving no other references to the weakref (excepting
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
726 * ours).
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
727 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
728 Py_DECREF(op);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
729 if (wrcb_to_call.gc.gc_next == gc) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
730 /* object is still alive -- move it */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
731 gc_list_move(gc, old);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
732 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
733 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
734 ++num_freed;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
735 }
33862
facb5a2f4b53 SF 1055820: weakref callback vs gc vs threads
Tim Peters <tim.peters@gmail.com>
parents: 31341
diff changeset
736
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
737 return num_freed;
30988
caa1a48da4cc SF bug 839548: Bug in type's GC handling causes segfaults.
Tim Peters <tim.peters@gmail.com>
parents: 30918
diff changeset
738 }
caa1a48da4cc SF bug 839548: Bug in type's GC handling causes segfaults.
Tim Peters <tim.peters@gmail.com>
parents: 30918
diff changeset
739
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
740 static void
14294
053627e7ac14 apply patch #101362 by Vladimir Marangozov
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 13878
diff changeset
741 debug_cycle(char *msg, PyObject *op)
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
742 {
68805
74d3dc78f0db Issue #10833: Use PyUnicode_FromFormat() and PyErr_Format() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents: 67333
diff changeset
743 PySys_FormatStderr("gc: %s <%s %p>\n",
74d3dc78f0db Issue #10833: Use PyUnicode_FromFormat() and PyErr_Format() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents: 67333
diff changeset
744 msg, Py_TYPE(op)->tp_name, op);
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
745 }
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
746
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
747 /* Handle uncollectable garbage (cycles with tp_del slots, and stuff reachable
28511
acf3596fcc28 Reworked move_finalizer_reachable() to create two distinct lists:
Tim Peters <tim.peters@gmail.com>
parents: 28510
diff changeset
748 * only from such cycles).
28520
6653a56002ef Reworked has_finalizer() to use the new _PyObject_Lookup() instead
Tim Peters <tim.peters@gmail.com>
parents: 28516
diff changeset
749 * If DEBUG_SAVEALL, all objects in finalizers are appended to the module
6653a56002ef Reworked has_finalizer() to use the new _PyObject_Lookup() instead
Tim Peters <tim.peters@gmail.com>
parents: 28516
diff changeset
750 * garbage list (a Python list), else only the objects in finalizers with
6653a56002ef Reworked has_finalizer() to use the new _PyObject_Lookup() instead
Tim Peters <tim.peters@gmail.com>
parents: 28516
diff changeset
751 * __del__ methods are appended to garbage. All objects in finalizers are
6653a56002ef Reworked has_finalizer() to use the new _PyObject_Lookup() instead
Tim Peters <tim.peters@gmail.com>
parents: 28516
diff changeset
752 * merged into the old list regardless.
28515
4c596dd60c22 handle_finalizers(): Rewrote to call append_objects() and gc_list_merge()
Tim Peters <tim.peters@gmail.com>
parents: 28512
diff changeset
753 * Returns 0 if all OK, <0 on error (out of memory to grow the garbage list).
4c596dd60c22 handle_finalizers(): Rewrote to call append_objects() and gc_list_merge()
Tim Peters <tim.peters@gmail.com>
parents: 28512
diff changeset
754 * The finalizers list is made empty on a successful return.
28511
acf3596fcc28 Reworked move_finalizer_reachable() to create two distinct lists:
Tim Peters <tim.peters@gmail.com>
parents: 28510
diff changeset
755 */
28515
4c596dd60c22 handle_finalizers(): Rewrote to call append_objects() and gc_list_merge()
Tim Peters <tim.peters@gmail.com>
parents: 28512
diff changeset
756 static int
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
757 handle_legacy_finalizers(PyGC_Head *finalizers, PyGC_Head *old)
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
758 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
759 PyGC_Head *gc = finalizers->gc.gc_next;
28520
6653a56002ef Reworked has_finalizer() to use the new _PyObject_Lookup() instead
Tim Peters <tim.peters@gmail.com>
parents: 28516
diff changeset
760
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
761 if (garbage == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
762 garbage = PyList_New(0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
763 if (garbage == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
764 Py_FatalError("gc couldn't create gc.garbage list");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
765 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
766 for (; gc != finalizers; gc = gc->gc.gc_next) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
767 PyObject *op = FROM_GC(gc);
28520
6653a56002ef Reworked has_finalizer() to use the new _PyObject_Lookup() instead
Tim Peters <tim.peters@gmail.com>
parents: 28516
diff changeset
768
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
769 if ((debug & DEBUG_SAVEALL) || has_legacy_finalizer(op)) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
770 if (PyList_Append(garbage, op) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
771 return -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
772 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
773 }
28520
6653a56002ef Reworked has_finalizer() to use the new _PyObject_Lookup() instead
Tim Peters <tim.peters@gmail.com>
parents: 28516
diff changeset
774
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
775 gc_list_merge(finalizers, old);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
776 return 0;
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
777 }
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
778
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
779 static void
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
780 finalize_garbage(PyGC_Head *collectable, PyGC_Head *old)
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
781 {
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
782 destructor finalize;
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
783 PyGC_Head *gc = collectable->gc.gc_next;
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
784
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
785 for (; gc != collectable; gc = gc->gc.gc_next) {
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
786 PyObject *op = FROM_GC(gc);
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
787
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
788 if (!_PyGCHead_FINALIZED(gc) &&
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
789 PyType_HasFeature(Py_TYPE(op), Py_TPFLAGS_HAVE_FINALIZE) &&
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
790 (finalize = Py_TYPE(op)->tp_finalize) != NULL) {
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
791 _PyGCHead_SET_FINALIZED(gc, 1);
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
792 Py_INCREF(op);
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
793 finalize(op);
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
794 if (Py_REFCNT(op) == 1) {
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
795 /* op will be destroyed */
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
796 gc = gc->gc.gc_prev;
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
797 }
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
798 Py_DECREF(op);
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
799 }
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
800 }
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
801 }
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
802
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
803 /* Walk the collectable list and check that they are really unreachable
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
804 from the outside (some objects could have been resurrected by a
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
805 finalizer). */
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
806 static int
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
807 check_garbage(PyGC_Head *collectable)
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
808 {
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
809 PyGC_Head *gc;
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
810 for (gc = collectable->gc.gc_next; gc != collectable;
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
811 gc = gc->gc.gc_next) {
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
812 _PyGCHead_SET_REFS(gc, Py_REFCNT(FROM_GC(gc)));
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
813 assert(_PyGCHead_REFS(gc) != 0);
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
814 }
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
815 subtract_refs(collectable);
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
816 for (gc = collectable->gc.gc_next; gc != collectable;
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
817 gc = gc->gc.gc_next) {
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
818 assert(_PyGCHead_REFS(gc) >= 0);
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
819 if (_PyGCHead_REFS(gc) != 0)
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
820 return -1;
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
821 }
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
822 return 0;
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
823 }
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
824
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
825 static void
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
826 revive_garbage(PyGC_Head *collectable)
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
827 {
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
828 PyGC_Head *gc;
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
829 for (gc = collectable->gc.gc_next; gc != collectable;
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
830 gc = gc->gc.gc_next) {
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
831 _PyGCHead_SET_REFS(gc, GC_REACHABLE);
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
832 }
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
833 }
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
834
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
835 /* Break reference cycles by clearing the containers involved. This is
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
836 * tricky business as the lists can be changing and we don't know which
24075
32db075def3f OK, I couldn't stand it <0.5 wink>: removed all uncertainty about what's
Tim Peters <tim.peters@gmail.com>
parents: 24074
diff changeset
837 * objects may be freed. It is possible I screwed something up here.
32db075def3f OK, I couldn't stand it <0.5 wink>: removed all uncertainty about what's
Tim Peters <tim.peters@gmail.com>
parents: 24074
diff changeset
838 */
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
839 static void
28504
cb5db5561cdc Fix Tim's boom example.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28498
diff changeset
840 delete_garbage(PyGC_Head *collectable, PyGC_Head *old)
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
841 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
842 inquiry clear;
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
843
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
844 while (!gc_list_is_empty(collectable)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
845 PyGC_Head *gc = collectable->gc.gc_next;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
846 PyObject *op = FROM_GC(gc);
24072
86b3760d285d SF bug #574132: Major GC related performance regression
Tim Peters <tim.peters@gmail.com>
parents: 24036
diff changeset
847
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
848 if (debug & DEBUG_SAVEALL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
849 PyList_Append(garbage, op);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
850 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
851 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
852 if ((clear = Py_TYPE(op)->tp_clear) != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
853 Py_INCREF(op);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
854 clear(op);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
855 Py_DECREF(op);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
856 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
857 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
858 if (collectable->gc.gc_next == gc) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
859 /* object is still alive, move it, it may die later */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
860 gc_list_move(gc, old);
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
861 _PyGCHead_SET_REFS(gc, GC_REACHABLE);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
862 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
863 }
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
864 }
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
865
45371
7c4c46342137 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60845 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44441
diff changeset
866 /* Clear all free lists
7c4c46342137 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60845 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44441
diff changeset
867 * All free lists are cleared during the collection of the highest generation.
7c4c46342137 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60845 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44441
diff changeset
868 * Allocated items in the free list may keep a pymalloc arena occupied.
7c4c46342137 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60845 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44441
diff changeset
869 * Clearing the free lists may give back memory to the OS earlier.
7c4c46342137 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60845 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44441
diff changeset
870 */
7c4c46342137 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60845 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44441
diff changeset
871 static void
7c4c46342137 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60845 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44441
diff changeset
872 clear_freelists(void)
7c4c46342137 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60845 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44441
diff changeset
873 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
874 (void)PyMethod_ClearFreeList();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
875 (void)PyFrame_ClearFreeList();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
876 (void)PyCFunction_ClearFreeList();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
877 (void)PyTuple_ClearFreeList();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
878 (void)PyUnicode_ClearFreeList();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
879 (void)PyFloat_ClearFreeList();
73551
910986542a75 Issue #13389: Full garbage collection passes now clear the freelists for
Antoine Pitrou <solipsis@pitrou.net>
parents: 72925
diff changeset
880 (void)PyList_ClearFreeList();
910986542a75 Issue #13389: Full garbage collection passes now clear the freelists for
Antoine Pitrou <solipsis@pitrou.net>
parents: 72925
diff changeset
881 (void)PyDict_ClearFreeList();
73994
57f0af61da53 Issue #6695: Full garbage collection runs now clear the freelist of set objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73551
diff changeset
882 (void)PySet_ClearFreeList();
45371
7c4c46342137 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60845 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44441
diff changeset
883 }
7c4c46342137 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60845 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44441
diff changeset
884
50542
5ebf82689d36 Merged revisions 67834 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48850
diff changeset
885 static double
5ebf82689d36 Merged revisions 67834 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48850
diff changeset
886 get_time(void)
5ebf82689d36 Merged revisions 67834 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48850
diff changeset
887 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
888 double result = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
889 if (tmod != NULL) {
72925
7109f31300fb Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents: 72835
diff changeset
890 _Py_IDENTIFIER(time);
72835
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 68805
diff changeset
891
5e33219492bc Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents: 68805
diff changeset
892 PyObject *f = _PyObject_CallMethodId(tmod, &PyId_time, NULL);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
893 if (f == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
894 PyErr_Clear();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
895 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
896 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
897 if (PyFloat_Check(f))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
898 result = PyFloat_AsDouble(f);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
899 Py_DECREF(f);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
900 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
901 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
902 return result;
50542
5ebf82689d36 Merged revisions 67834 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48850
diff changeset
903 }
5ebf82689d36 Merged revisions 67834 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48850
diff changeset
904
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
905 /* This is the main function. Read this to understand how the
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
906 * collection process works. */
36839
7c1aca8e3d7d Make PyGC_Collect() use Py_ssize_t.
Neal Norwitz <nnorwitz@gmail.com>
parents: 36769
diff changeset
907 static Py_ssize_t
83835
5abe85aefe29 Issue #17937: Try harder to collect cyclic garbage at shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83771
diff changeset
908 collect(int generation, Py_ssize_t *n_collected, Py_ssize_t *n_uncollectable,
5abe85aefe29 Issue #17937: Try harder to collect cyclic garbage at shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83771
diff changeset
909 int nofail)
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
910 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
911 int i;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
912 Py_ssize_t m = 0; /* # objects collected */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
913 Py_ssize_t n = 0; /* # unreachable objects that couldn't be collected */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
914 PyGC_Head *young; /* the generation we are examining */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
915 PyGC_Head *old; /* next older generation */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
916 PyGC_Head unreachable; /* non-problematic unreachable trash */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
917 PyGC_Head finalizers; /* objects with, & reachable from, __del__ */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
918 PyGC_Head *gc;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
919 double t1 = 0.0;
80063
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
920 struct gc_generation_stats *stats = &generation_stats[generation];
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
921
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
922 if (debug & DEBUG_STATS) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
923 PySys_WriteStderr("gc: collecting generation %d...\n",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
924 generation);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
925 PySys_WriteStderr("gc: objects in each generation:");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
926 for (i = 0; i < NUM_GENERATIONS; i++)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
927 PySys_WriteStderr(" %" PY_FORMAT_SIZE_T "d",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
928 gc_list_size(GEN_HEAD(i)));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
929 t1 = get_time();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
930 PySys_WriteStderr("\n");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
931 }
23377
2f7d869dad4d Move all data for a single generation into a structure. The set of
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 23296
diff changeset
932
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
933 /* update collection and allocation counters */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
934 if (generation+1 < NUM_GENERATIONS)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
935 generations[generation+1].count += 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
936 for (i = 0; i <= generation; i++)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
937 generations[i].count = 0;
23377
2f7d869dad4d Move all data for a single generation into a structure. The set of
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 23296
diff changeset
938
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
939 /* merge younger generations with one we are currently collecting */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
940 for (i = 0; i < generation; i++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
941 gc_list_merge(GEN_HEAD(i), GEN_HEAD(generation));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
942 }
23377
2f7d869dad4d Move all data for a single generation into a structure. The set of
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 23296
diff changeset
943
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
944 /* handy references */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
945 young = GEN_HEAD(generation);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
946 if (generation < NUM_GENERATIONS-1)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
947 old = GEN_HEAD(generation+1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
948 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
949 old = young;
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
950
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
951 /* Using ob_refcnt and gc_refs, calculate which objects in the
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
952 * container set are reachable from outside the set (i.e., have a
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
953 * refcount greater than 0 when all the references within the
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
954 * set are taken into account).
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
955 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
956 update_refs(young);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
957 subtract_refs(young);
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
958
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
959 /* Leave everything reachable from outside young in young, and move
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
960 * everything else (in young) to unreachable.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
961 * NOTE: This used to move the reachable objects into a reachable
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
962 * set instead. But most things usually turn out to be reachable,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
963 * so it's more efficient to move the unreachable things.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
964 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
965 gc_list_init(&unreachable);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
966 move_unreachable(young, &unreachable);
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
967
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
968 /* Move reachable objects to next generation. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
969 if (young != old) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
970 if (generation == NUM_GENERATIONS - 2) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
971 long_lived_pending += gc_list_size(young);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
972 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
973 gc_list_merge(young, old);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
974 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
975 else {
77210
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
976 /* We only untrack dicts in full collections, to avoid quadratic
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
977 dict build-up. See issue #14775. */
47e6217d0e84 Issue #14775: Fix a potential quadratic dict build-up due to the garbage collector repeatedly trying to untrack dicts.
Antoine Pitrou <solipsis@pitrou.net>
parents: 67333
diff changeset
978 untrack_dicts(young);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
979 long_lived_pending = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
980 long_lived_total = gc_list_size(young);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
981 }
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
982
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
983 /* All objects in unreachable are trash, but objects reachable from
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
984 * legacy finalizers (e.g. tp_del) can't safely be deleted.
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
985 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
986 gc_list_init(&finalizers);
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
987 move_legacy_finalizers(&unreachable, &finalizers);
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
988 /* finalizers contains the unreachable objects with a legacy finalizer;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
989 * unreachable objects reachable *from* those are also uncollectable,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
990 * and we move those into the finalizers list too.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
991 */
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
992 move_legacy_finalizer_reachable(&finalizers);
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
993
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
994 /* Collect statistics on collectable objects found and print
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
995 * debugging information.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
996 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
997 for (gc = unreachable.gc.gc_next; gc != &unreachable;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
998 gc = gc->gc.gc_next) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
999 m++;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1000 if (debug & DEBUG_COLLECTABLE) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1001 debug_cycle("collectable", FROM_GC(gc));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1002 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1003 }
33862
facb5a2f4b53 SF 1055820: weakref callback vs gc vs threads
Tim Peters <tim.peters@gmail.com>
parents: 31341
diff changeset
1004
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1005 /* Clear weakrefs and invoke callbacks as necessary. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1006 m += handle_weakrefs(&unreachable, old);
33862
facb5a2f4b53 SF 1055820: weakref callback vs gc vs threads
Tim Peters <tim.peters@gmail.com>
parents: 31341
diff changeset
1007
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
1008 /* Call tp_finalize on objects which have one. */
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
1009 finalize_garbage(&unreachable, old);
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
1010
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
1011 if (check_garbage(&unreachable)) {
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
1012 revive_garbage(&unreachable);
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
1013 gc_list_merge(&unreachable, old);
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
1014 }
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
1015 else {
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
1016 /* Call tp_clear on objects in the unreachable set. This will cause
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
1017 * the reference cycles to be broken. It may also cause some objects
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
1018 * in finalizers to be freed.
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
1019 */
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
1020 delete_garbage(&unreachable, old);
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
1021 }
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1022
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1023 /* Collect statistics on uncollectable objects found and print
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1024 * debugging information. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1025 for (gc = finalizers.gc.gc_next;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1026 gc != &finalizers;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1027 gc = gc->gc.gc_next) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1028 n++;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1029 if (debug & DEBUG_UNCOLLECTABLE)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1030 debug_cycle("uncollectable", FROM_GC(gc));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1031 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1032 if (debug & DEBUG_STATS) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1033 double t2 = get_time();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1034 if (m == 0 && n == 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1035 PySys_WriteStderr("gc: done");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1036 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1037 PySys_WriteStderr(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1038 "gc: done, "
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1039 "%" PY_FORMAT_SIZE_T "d unreachable, "
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1040 "%" PY_FORMAT_SIZE_T "d uncollectable",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1041 n+m, n);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1042 if (t1 && t2) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1043 PySys_WriteStderr(", %.4fs elapsed", t2-t1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1044 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1045 PySys_WriteStderr(".\n");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1046 }
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1047
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1048 /* Append instances in the uncollectable set to a Python
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1049 * reachable list of garbage. The programmer has to deal with
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1050 * this if they insist on creating this type of structure.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1051 */
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
1052 (void)handle_legacy_finalizers(&finalizers, old);
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1053
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1054 /* Clear free list only during the collection of the highest
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1055 * generation */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1056 if (generation == NUM_GENERATIONS-1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1057 clear_freelists();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1058 }
45371
7c4c46342137 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60845 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44441
diff changeset
1059
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1060 if (PyErr_Occurred()) {
83835
5abe85aefe29 Issue #17937: Try harder to collect cyclic garbage at shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83771
diff changeset
1061 if (nofail) {
5abe85aefe29 Issue #17937: Try harder to collect cyclic garbage at shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83771
diff changeset
1062 PyErr_Clear();
5abe85aefe29 Issue #17937: Try harder to collect cyclic garbage at shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83771
diff changeset
1063 }
5abe85aefe29 Issue #17937: Try harder to collect cyclic garbage at shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83771
diff changeset
1064 else {
5abe85aefe29 Issue #17937: Try harder to collect cyclic garbage at shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83771
diff changeset
1065 if (gc_str == NULL)
5abe85aefe29 Issue #17937: Try harder to collect cyclic garbage at shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83771
diff changeset
1066 gc_str = PyUnicode_FromString("garbage collection");
5abe85aefe29 Issue #17937: Try harder to collect cyclic garbage at shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83771
diff changeset
1067 PyErr_WriteUnraisable(gc_str);
5abe85aefe29 Issue #17937: Try harder to collect cyclic garbage at shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83771
diff changeset
1068 Py_FatalError("unexpected exception during garbage collection");
5abe85aefe29 Issue #17937: Try harder to collect cyclic garbage at shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83771
diff changeset
1069 }
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1070 }
76319
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1071
80063
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1072 /* Update stats */
76319
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1073 if (n_collected)
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1074 *n_collected = m;
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1075 if (n_uncollectable)
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1076 *n_uncollectable = n;
80063
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1077 stats->collections++;
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1078 stats->collected += m;
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1079 stats->uncollectable += n;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1080 return n+m;
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1081 }
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1082
76319
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1083 /* Invoke progress callbacks to notify clients that garbage collection
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1084 * is starting or stopping
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1085 */
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1086 static void
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1087 invoke_gc_callback(const char *phase, int generation,
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1088 Py_ssize_t collected, Py_ssize_t uncollectable)
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1089 {
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1090 Py_ssize_t i;
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1091 PyObject *info = NULL;
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1092
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1093 /* we may get called very early */
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1094 if (callbacks == NULL)
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1095 return;
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1096 /* The local variable cannot be rebound, check it for sanity */
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1097 assert(callbacks != NULL && PyList_CheckExact(callbacks));
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1098 if (PyList_GET_SIZE(callbacks) != 0) {
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1099 info = Py_BuildValue("{sisnsn}",
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1100 "generation", generation,
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1101 "collected", collected,
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1102 "uncollectable", uncollectable);
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1103 if (info == NULL) {
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1104 PyErr_WriteUnraisable(NULL);
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1105 return;
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1106 }
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1107 }
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1108 for (i=0; i<PyList_GET_SIZE(callbacks); i++) {
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1109 PyObject *r, *cb = PyList_GET_ITEM(callbacks, i);
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1110 Py_INCREF(cb); /* make sure cb doesn't go away */
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1111 r = PyObject_CallFunction(cb, "sO", phase, info);
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1112 Py_XDECREF(r);
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1113 if (r == NULL)
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1114 PyErr_WriteUnraisable(cb);
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1115 Py_DECREF(cb);
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1116 }
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1117 Py_XDECREF(info);
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1118 }
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1119
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1120 /* Perform garbage collection of a generation and invoke
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1121 * progress callbacks.
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1122 */
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1123 static Py_ssize_t
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1124 collect_with_callback(int generation)
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1125 {
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1126 Py_ssize_t result, collected, uncollectable;
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1127 invoke_gc_callback("start", generation, 0, 0);
83835
5abe85aefe29 Issue #17937: Try harder to collect cyclic garbage at shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83771
diff changeset
1128 result = collect(generation, &collected, &uncollectable, 0);
76319
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1129 invoke_gc_callback("stop", generation, collected, uncollectable);
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1130 return result;
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1131 }
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1132
36839
7c1aca8e3d7d Make PyGC_Collect() use Py_ssize_t.
Neal Norwitz <nnorwitz@gmail.com>
parents: 36769
diff changeset
1133 static Py_ssize_t
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1134 collect_generations(void)
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1135 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1136 int i;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1137 Py_ssize_t n = 0;
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1138
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1139 /* Find the oldest generation (highest numbered) where the count
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1140 * exceeds the threshold. Objects in the that generation and
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1141 * generations younger than it will be collected. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1142 for (i = NUM_GENERATIONS-1; i >= 0; i--) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1143 if (generations[i].count > generations[i].threshold) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1144 /* Avoid quadratic performance degradation in number
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1145 of tracked objects. See comments at the beginning
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1146 of this file, and issue #4074.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1147 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1148 if (i == NUM_GENERATIONS - 1
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1149 && long_lived_pending < long_lived_total / 4)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1150 continue;
76319
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1151 n = collect_with_callback(i);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1152 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1153 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1154 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1155 return n;
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1156 }
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1157
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23721
diff changeset
1158 PyDoc_STRVAR(gc_enable__doc__,
13878
abfa4e4b2f3e Neil Schemenauer: GC enable(), disable(), isenabled() interface.
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents: 13570
diff changeset
1159 "enable() -> None\n"
abfa4e4b2f3e Neil Schemenauer: GC enable(), disable(), isenabled() interface.
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents: 13570
diff changeset
1160 "\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23721
diff changeset
1161 "Enable automatic garbage collection.\n");
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1162
13878
abfa4e4b2f3e Neil Schemenauer: GC enable(), disable(), isenabled() interface.
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents: 13570
diff changeset
1163 static PyObject *
28512
174ce4cdec47 Switched from METH_VARARGS to METH_NOARGS for the 7 module functions that
Tim Peters <tim.peters@gmail.com>
parents: 28511
diff changeset
1164 gc_enable(PyObject *self, PyObject *noargs)
13878
abfa4e4b2f3e Neil Schemenauer: GC enable(), disable(), isenabled() interface.
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents: 13570
diff changeset
1165 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1166 enabled = 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1167 Py_INCREF(Py_None);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1168 return Py_None;
13878
abfa4e4b2f3e Neil Schemenauer: GC enable(), disable(), isenabled() interface.
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents: 13570
diff changeset
1169 }
abfa4e4b2f3e Neil Schemenauer: GC enable(), disable(), isenabled() interface.
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents: 13570
diff changeset
1170
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23721
diff changeset
1171 PyDoc_STRVAR(gc_disable__doc__,
13878
abfa4e4b2f3e Neil Schemenauer: GC enable(), disable(), isenabled() interface.
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents: 13570
diff changeset
1172 "disable() -> None\n"
abfa4e4b2f3e Neil Schemenauer: GC enable(), disable(), isenabled() interface.
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents: 13570
diff changeset
1173 "\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23721
diff changeset
1174 "Disable automatic garbage collection.\n");
13878
abfa4e4b2f3e Neil Schemenauer: GC enable(), disable(), isenabled() interface.
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents: 13570
diff changeset
1175
abfa4e4b2f3e Neil Schemenauer: GC enable(), disable(), isenabled() interface.
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents: 13570
diff changeset
1176 static PyObject *
28512
174ce4cdec47 Switched from METH_VARARGS to METH_NOARGS for the 7 module functions that
Tim Peters <tim.peters@gmail.com>
parents: 28511
diff changeset
1177 gc_disable(PyObject *self, PyObject *noargs)
13878
abfa4e4b2f3e Neil Schemenauer: GC enable(), disable(), isenabled() interface.
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents: 13570
diff changeset
1178 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1179 enabled = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1180 Py_INCREF(Py_None);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1181 return Py_None;
13878
abfa4e4b2f3e Neil Schemenauer: GC enable(), disable(), isenabled() interface.
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents: 13570
diff changeset
1182 }
abfa4e4b2f3e Neil Schemenauer: GC enable(), disable(), isenabled() interface.
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents: 13570
diff changeset
1183
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23721
diff changeset
1184 PyDoc_STRVAR(gc_isenabled__doc__,
13878
abfa4e4b2f3e Neil Schemenauer: GC enable(), disable(), isenabled() interface.
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents: 13570
diff changeset
1185 "isenabled() -> status\n"
abfa4e4b2f3e Neil Schemenauer: GC enable(), disable(), isenabled() interface.
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents: 13570
diff changeset
1186 "\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23721
diff changeset
1187 "Returns true if automatic garbage collection is enabled.\n");
13878
abfa4e4b2f3e Neil Schemenauer: GC enable(), disable(), isenabled() interface.
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents: 13570
diff changeset
1188
abfa4e4b2f3e Neil Schemenauer: GC enable(), disable(), isenabled() interface.
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents: 13570
diff changeset
1189 static PyObject *
28512
174ce4cdec47 Switched from METH_VARARGS to METH_NOARGS for the 7 module functions that
Tim Peters <tim.peters@gmail.com>
parents: 28511
diff changeset
1190 gc_isenabled(PyObject *self, PyObject *noargs)
13878
abfa4e4b2f3e Neil Schemenauer: GC enable(), disable(), isenabled() interface.
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents: 13570
diff changeset
1191 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1192 return PyBool_FromLong((long)enabled);
13878
abfa4e4b2f3e Neil Schemenauer: GC enable(), disable(), isenabled() interface.
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents: 13570
diff changeset
1193 }
abfa4e4b2f3e Neil Schemenauer: GC enable(), disable(), isenabled() interface.
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents: 13570
diff changeset
1194
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23721
diff changeset
1195 PyDoc_STRVAR(gc_collect__doc__,
36863
2d24f3a37a1b SF patch #1443865; gc.get_count() added and optional argument 'generation'
Barry Warsaw <barry@python.org>
parents: 36860
diff changeset
1196 "collect([generation]) -> n\n"
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1197 "\n"
36863
2d24f3a37a1b SF patch #1443865; gc.get_count() added and optional argument 'generation'
Barry Warsaw <barry@python.org>
parents: 36860
diff changeset
1198 "With no arguments, run a full collection. The optional argument\n"
2d24f3a37a1b SF patch #1443865; gc.get_count() added and optional argument 'generation'
Barry Warsaw <barry@python.org>
parents: 36860
diff changeset
1199 "may be an integer specifying which generation to collect. A ValueError\n"
2d24f3a37a1b SF patch #1443865; gc.get_count() added and optional argument 'generation'
Barry Warsaw <barry@python.org>
parents: 36860
diff changeset
1200 "is raised if the generation number is invalid.\n\n"
2d24f3a37a1b SF patch #1443865; gc.get_count() added and optional argument 'generation'
Barry Warsaw <barry@python.org>
parents: 36860
diff changeset
1201 "The number of unreachable objects is returned.\n");
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1202
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1203 static PyObject *
36863
2d24f3a37a1b SF patch #1443865; gc.get_count() added and optional argument 'generation'
Barry Warsaw <barry@python.org>
parents: 36860
diff changeset
1204 gc_collect(PyObject *self, PyObject *args, PyObject *kws)
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1205 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1206 static char *keywords[] = {"generation", NULL};
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1207 int genarg = NUM_GENERATIONS - 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1208 Py_ssize_t n;
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1209
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1210 if (!PyArg_ParseTupleAndKeywords(args, kws, "|i", keywords, &genarg))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1211 return NULL;
36863
2d24f3a37a1b SF patch #1443865; gc.get_count() added and optional argument 'generation'
Barry Warsaw <barry@python.org>
parents: 36860
diff changeset
1212
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1213 else if (genarg < 0 || genarg >= NUM_GENERATIONS) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1214 PyErr_SetString(PyExc_ValueError, "invalid generation");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1215 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1216 }
36863
2d24f3a37a1b SF patch #1443865; gc.get_count() added and optional argument 'generation'
Barry Warsaw <barry@python.org>
parents: 36860
diff changeset
1217
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1218 if (collecting)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1219 n = 0; /* already collecting, don't do anything */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1220 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1221 collecting = 1;
76319
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1222 n = collect_with_callback(genarg);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1223 collecting = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1224 }
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1225
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1226 return PyLong_FromSsize_t(n);
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1227 }
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1228
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23721
diff changeset
1229 PyDoc_STRVAR(gc_set_debug__doc__,
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1230 "set_debug(flags) -> None\n"
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1231 "\n"
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1232 "Set the garbage collection debugging flags. Debugging information is\n"
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1233 "written to sys.stderr.\n"
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1234 "\n"
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1235 "flags is an integer and can have the following bits turned on:\n"
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1236 "\n"
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1237 " DEBUG_STATS - Print statistics during collection.\n"
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1238 " DEBUG_COLLECTABLE - Print collectable objects found.\n"
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1239 " DEBUG_UNCOLLECTABLE - Print unreachable but uncollectable objects found.\n"
14756
6e9331e68a3b - Add DEBUG_SAVEALL option. When enabled all garbage objects found by the
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 14424
diff changeset
1240 " DEBUG_SAVEALL - Save objects to gc.garbage rather than freeing them.\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23721
diff changeset
1241 " DEBUG_LEAK - Debug leaking programs (everything but STATS).\n");
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1242
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1243 static PyObject *
13878
abfa4e4b2f3e Neil Schemenauer: GC enable(), disable(), isenabled() interface.
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents: 13570
diff changeset
1244 gc_set_debug(PyObject *self, PyObject *args)
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1245 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1246 if (!PyArg_ParseTuple(args, "i:set_debug", &debug))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1247 return NULL;
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1248
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1249 Py_INCREF(Py_None);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1250 return Py_None;
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1251 }
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1252
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23721
diff changeset
1253 PyDoc_STRVAR(gc_get_debug__doc__,
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1254 "get_debug() -> flags\n"
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1255 "\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23721
diff changeset
1256 "Get the garbage collection debugging flags.\n");
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1257
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1258 static PyObject *
28512
174ce4cdec47 Switched from METH_VARARGS to METH_NOARGS for the 7 module functions that
Tim Peters <tim.peters@gmail.com>
parents: 28511
diff changeset
1259 gc_get_debug(PyObject *self, PyObject *noargs)
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1260 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1261 return Py_BuildValue("i", debug);
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1262 }
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1263
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23721
diff changeset
1264 PyDoc_STRVAR(gc_set_thresh__doc__,
21833
070d392042e3 Fix spelling mistakes. Bugfix candidates.
Neal Norwitz <nnorwitz@gmail.com>
parents: 21139
diff changeset
1265 "set_threshold(threshold0, [threshold1, threshold2]) -> None\n"
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1266 "\n"
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1267 "Sets the collection thresholds. Setting threshold0 to zero disables\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23721
diff changeset
1268 "collection.\n");
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1269
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1270 static PyObject *
13878
abfa4e4b2f3e Neil Schemenauer: GC enable(), disable(), isenabled() interface.
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents: 13570
diff changeset
1271 gc_set_thresh(PyObject *self, PyObject *args)
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1272 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1273 int i;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1274 if (!PyArg_ParseTuple(args, "i|ii:set_threshold",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1275 &generations[0].threshold,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1276 &generations[1].threshold,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1277 &generations[2].threshold))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1278 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1279 for (i = 2; i < NUM_GENERATIONS; i++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1280 /* generations higher than 2 get the same threshold */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1281 generations[i].threshold = generations[2].threshold;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1282 }
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1283
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1284 Py_INCREF(Py_None);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1285 return Py_None;
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1286 }
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1287
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23721
diff changeset
1288 PyDoc_STRVAR(gc_get_thresh__doc__,
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1289 "get_threshold() -> (threshold0, threshold1, threshold2)\n"
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1290 "\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23721
diff changeset
1291 "Return the current collection thresholds\n");
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1292
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1293 static PyObject *
28512
174ce4cdec47 Switched from METH_VARARGS to METH_NOARGS for the 7 module functions that
Tim Peters <tim.peters@gmail.com>
parents: 28511
diff changeset
1294 gc_get_thresh(PyObject *self, PyObject *noargs)
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1295 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1296 return Py_BuildValue("(iii)",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1297 generations[0].threshold,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1298 generations[1].threshold,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1299 generations[2].threshold);
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1300 }
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1301
36863
2d24f3a37a1b SF patch #1443865; gc.get_count() added and optional argument 'generation'
Barry Warsaw <barry@python.org>
parents: 36860
diff changeset
1302 PyDoc_STRVAR(gc_get_count__doc__,
2d24f3a37a1b SF patch #1443865; gc.get_count() added and optional argument 'generation'
Barry Warsaw <barry@python.org>
parents: 36860
diff changeset
1303 "get_count() -> (count0, count1, count2)\n"
2d24f3a37a1b SF patch #1443865; gc.get_count() added and optional argument 'generation'
Barry Warsaw <barry@python.org>
parents: 36860
diff changeset
1304 "\n"
2d24f3a37a1b SF patch #1443865; gc.get_count() added and optional argument 'generation'
Barry Warsaw <barry@python.org>
parents: 36860
diff changeset
1305 "Return the current collection counts\n");
2d24f3a37a1b SF patch #1443865; gc.get_count() added and optional argument 'generation'
Barry Warsaw <barry@python.org>
parents: 36860
diff changeset
1306
2d24f3a37a1b SF patch #1443865; gc.get_count() added and optional argument 'generation'
Barry Warsaw <barry@python.org>
parents: 36860
diff changeset
1307 static PyObject *
2d24f3a37a1b SF patch #1443865; gc.get_count() added and optional argument 'generation'
Barry Warsaw <barry@python.org>
parents: 36860
diff changeset
1308 gc_get_count(PyObject *self, PyObject *noargs)
2d24f3a37a1b SF patch #1443865; gc.get_count() added and optional argument 'generation'
Barry Warsaw <barry@python.org>
parents: 36860
diff changeset
1309 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1310 return Py_BuildValue("(iii)",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1311 generations[0].count,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1312 generations[1].count,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1313 generations[2].count);
36863
2d24f3a37a1b SF patch #1443865; gc.get_count() added and optional argument 'generation'
Barry Warsaw <barry@python.org>
parents: 36860
diff changeset
1314 }
2d24f3a37a1b SF patch #1443865; gc.get_count() added and optional argument 'generation'
Barry Warsaw <barry@python.org>
parents: 36860
diff changeset
1315
19096
45ccf3b889b5 Add get_referents function. Closes SF patch #402925.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15013
diff changeset
1316 static int
21038
afb789aada16 Rename get_referents to get_referrers. Fixes #483815.
Martin v. Löwis <martin@v.loewis.de>
parents: 20820
diff changeset
1317 referrersvisit(PyObject* obj, PyObject *objs)
19096
45ccf3b889b5 Add get_referents function. Closes SF patch #402925.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15013
diff changeset
1318 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1319 Py_ssize_t i;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1320 for (i = 0; i < PyTuple_GET_SIZE(objs); i++)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1321 if (PyTuple_GET_ITEM(objs, i) == obj)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1322 return 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1323 return 0;
19096
45ccf3b889b5 Add get_referents function. Closes SF patch #402925.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15013
diff changeset
1324 }
45ccf3b889b5 Add get_referents function. Closes SF patch #402925.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15013
diff changeset
1325
19128
4901a935490d Remove "referents" structure (it's not needed). Check return value
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19097
diff changeset
1326 static int
21038
afb789aada16 Rename get_referents to get_referrers. Fixes #483815.
Martin v. Löwis <martin@v.loewis.de>
parents: 20820
diff changeset
1327 gc_referrers_for(PyObject *objs, PyGC_Head *list, PyObject *resultlist)
19096
45ccf3b889b5 Add get_referents function. Closes SF patch #402925.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15013
diff changeset
1328 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1329 PyGC_Head *gc;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1330 PyObject *obj;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1331 traverseproc traverse;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1332 for (gc = list->gc.gc_next; gc != list; gc = gc->gc.gc_next) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1333 obj = FROM_GC(gc);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1334 traverse = Py_TYPE(obj)->tp_traverse;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1335 if (obj == objs || obj == resultlist)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1336 continue;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1337 if (traverse(obj, (visitproc)referrersvisit, objs)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1338 if (PyList_Append(resultlist, obj) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1339 return 0; /* error */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1340 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1341 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1342 return 1; /* no error */
19096
45ccf3b889b5 Add get_referents function. Closes SF patch #402925.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15013
diff changeset
1343 }
45ccf3b889b5 Add get_referents function. Closes SF patch #402925.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15013
diff changeset
1344
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23721
diff changeset
1345 PyDoc_STRVAR(gc_get_referrers__doc__,
21038
afb789aada16 Rename get_referents to get_referrers. Fixes #483815.
Martin v. Löwis <martin@v.loewis.de>
parents: 20820
diff changeset
1346 "get_referrers(*objs) -> list\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23721
diff changeset
1347 Return the list of objects that directly refer to any of objs.");
19096
45ccf3b889b5 Add get_referents function. Closes SF patch #402925.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15013
diff changeset
1348
19128
4901a935490d Remove "referents" structure (it's not needed). Check return value
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19097
diff changeset
1349 static PyObject *
21038
afb789aada16 Rename get_referents to get_referrers. Fixes #483815.
Martin v. Löwis <martin@v.loewis.de>
parents: 20820
diff changeset
1350 gc_get_referrers(PyObject *self, PyObject *args)
19096
45ccf3b889b5 Add get_referents function. Closes SF patch #402925.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15013
diff changeset
1351 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1352 int i;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1353 PyObject *result = PyList_New(0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1354 if (!result) return NULL;
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36863
diff changeset
1355
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1356 for (i = 0; i < NUM_GENERATIONS; i++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1357 if (!(gc_referrers_for(args, GEN_HEAD(i), result))) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1358 Py_DECREF(result);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1359 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1360 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1361 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1362 return result;
19096
45ccf3b889b5 Add get_referents function. Closes SF patch #402925.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15013
diff changeset
1363 }
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1364
28522
487df294d328 Finished implementing gc.get_referrents(): dealt with error and end
Tim Peters <tim.peters@gmail.com>
parents: 28521
diff changeset
1365 /* Append obj to list; return true if error (out of memory), false if OK. */
28497
40d9659b56c9 Add get_referrents() helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26138
diff changeset
1366 static int
28523
c01fdc3a9180 s/referrents/referents/g. Gotta love that referrers remains rife with rs.
Tim Peters <tim.peters@gmail.com>
parents: 28522
diff changeset
1367 referentsvisit(PyObject *obj, PyObject *list)
28497
40d9659b56c9 Add get_referrents() helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26138
diff changeset
1368 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1369 return PyList_Append(list, obj) < 0;
28497
40d9659b56c9 Add get_referrents() helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26138
diff changeset
1370 }
40d9659b56c9 Add get_referrents() helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26138
diff changeset
1371
28523
c01fdc3a9180 s/referrents/referents/g. Gotta love that referrers remains rife with rs.
Tim Peters <tim.peters@gmail.com>
parents: 28522
diff changeset
1372 PyDoc_STRVAR(gc_get_referents__doc__,
c01fdc3a9180 s/referrents/referents/g. Gotta love that referrers remains rife with rs.
Tim Peters <tim.peters@gmail.com>
parents: 28522
diff changeset
1373 "get_referents(*objs) -> list\n\
28498
3e399a8618db Add get_referrents() helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 28497
diff changeset
1374 Return the list of objects that are directly referred to by objs.");
28497
40d9659b56c9 Add get_referrents() helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26138
diff changeset
1375
40d9659b56c9 Add get_referrents() helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26138
diff changeset
1376 static PyObject *
28523
c01fdc3a9180 s/referrents/referents/g. Gotta love that referrers remains rife with rs.
Tim Peters <tim.peters@gmail.com>
parents: 28522
diff changeset
1377 gc_get_referents(PyObject *self, PyObject *args)
28497
40d9659b56c9 Add get_referrents() helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26138
diff changeset
1378 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1379 Py_ssize_t i;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1380 PyObject *result = PyList_New(0);
28522
487df294d328 Finished implementing gc.get_referrents(): dealt with error and end
Tim Peters <tim.peters@gmail.com>
parents: 28521
diff changeset
1381
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1382 if (result == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1383 return NULL;
28522
487df294d328 Finished implementing gc.get_referrents(): dealt with error and end
Tim Peters <tim.peters@gmail.com>
parents: 28521
diff changeset
1384
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1385 for (i = 0; i < PyTuple_GET_SIZE(args); i++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1386 traverseproc traverse;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1387 PyObject *obj = PyTuple_GET_ITEM(args, i);
28522
487df294d328 Finished implementing gc.get_referrents(): dealt with error and end
Tim Peters <tim.peters@gmail.com>
parents: 28521
diff changeset
1388
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1389 if (! PyObject_IS_GC(obj))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1390 continue;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1391 traverse = Py_TYPE(obj)->tp_traverse;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1392 if (! traverse)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1393 continue;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1394 if (traverse(obj, (visitproc)referentsvisit, result)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1395 Py_DECREF(result);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1396 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1397 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1398 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1399 return result;
28497
40d9659b56c9 Add get_referrents() helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26138
diff changeset
1400 }
40d9659b56c9 Add get_referrents() helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26138
diff changeset
1401
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23721
diff changeset
1402 PyDoc_STRVAR(gc_get_objects__doc__,
19097
9e6f7804ef14 Add get_objects function. This is a low level function (like
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19096
diff changeset
1403 "get_objects() -> [...]\n"
9e6f7804ef14 Add get_objects function. This is a low level function (like
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19096
diff changeset
1404 "\n"
9e6f7804ef14 Add get_objects function. This is a low level function (like
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19096
diff changeset
1405 "Return a list of objects tracked by the collector (excluding the list\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23721
diff changeset
1406 "returned).\n");
19097
9e6f7804ef14 Add get_objects function. This is a low level function (like
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19096
diff changeset
1407
9e6f7804ef14 Add get_objects function. This is a low level function (like
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19096
diff changeset
1408 static PyObject *
28512
174ce4cdec47 Switched from METH_VARARGS to METH_NOARGS for the 7 module functions that
Tim Peters <tim.peters@gmail.com>
parents: 28511
diff changeset
1409 gc_get_objects(PyObject *self, PyObject *noargs)
19097
9e6f7804ef14 Add get_objects function. This is a low level function (like
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19096
diff changeset
1410 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1411 int i;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1412 PyObject* result;
19097
9e6f7804ef14 Add get_objects function. This is a low level function (like
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19096
diff changeset
1413
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1414 result = PyList_New(0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1415 if (result == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1416 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1417 for (i = 0; i < NUM_GENERATIONS; i++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1418 if (append_objects(result, GEN_HEAD(i))) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1419 Py_DECREF(result);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1420 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1421 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1422 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1423 return result;
19097
9e6f7804ef14 Add get_objects function. This is a low level function (like
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19096
diff changeset
1424 }
9e6f7804ef14 Add get_objects function. This is a low level function (like
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19096
diff changeset
1425
80063
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1426 PyDoc_STRVAR(gc_get_stats__doc__,
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1427 "get_stats() -> [...]\n"
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1428 "\n"
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1429 "Return a list of dictionaries containing per-generation statistics.\n");
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1430
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1431 static PyObject *
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1432 gc_get_stats(PyObject *self, PyObject *noargs)
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1433 {
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1434 int i;
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1435 PyObject *result;
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1436 struct gc_generation_stats stats[NUM_GENERATIONS], *st;
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1437
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1438 /* To get consistent values despite allocations while constructing
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1439 the result list, we use a snapshot of the running stats. */
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1440 for (i = 0; i < NUM_GENERATIONS; i++) {
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1441 stats[i] = generation_stats[i];
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1442 }
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1443
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1444 result = PyList_New(0);
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1445 if (result == NULL)
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1446 return NULL;
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1447
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1448 for (i = 0; i < NUM_GENERATIONS; i++) {
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1449 PyObject *dict;
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1450 st = &stats[i];
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1451 dict = Py_BuildValue("{snsnsn}",
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1452 "collections", st->collections,
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1453 "collected", st->collected,
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1454 "uncollectable", st->uncollectable
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1455 );
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1456 if (dict == NULL)
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1457 goto error;
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1458 if (PyList_Append(result, dict)) {
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1459 Py_DECREF(dict);
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1460 goto error;
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1461 }
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1462 Py_DECREF(dict);
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1463 }
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1464 return result;
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1465
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1466 error:
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1467 Py_XDECREF(result);
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1468 return NULL;
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1469 }
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1470
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1471
52291
94bd0666ffa7 Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50679
diff changeset
1472 PyDoc_STRVAR(gc_is_tracked__doc__,
94bd0666ffa7 Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50679
diff changeset
1473 "is_tracked(obj) -> bool\n"
94bd0666ffa7 Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50679
diff changeset
1474 "\n"
94bd0666ffa7 Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50679
diff changeset
1475 "Returns true if the object is tracked by the garbage collector.\n"
94bd0666ffa7 Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50679
diff changeset
1476 "Simple atomic objects will return false.\n"
94bd0666ffa7 Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50679
diff changeset
1477 );
94bd0666ffa7 Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50679
diff changeset
1478
94bd0666ffa7 Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50679
diff changeset
1479 static PyObject *
94bd0666ffa7 Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50679
diff changeset
1480 gc_is_tracked(PyObject *self, PyObject *obj)
94bd0666ffa7 Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50679
diff changeset
1481 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1482 PyObject *result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1483
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1484 if (PyObject_IS_GC(obj) && IS_TRACKED(obj))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1485 result = Py_True;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1486 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1487 result = Py_False;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1488 Py_INCREF(result);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1489 return result;
52291
94bd0666ffa7 Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50679
diff changeset
1490 }
94bd0666ffa7 Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50679
diff changeset
1491
19097
9e6f7804ef14 Add get_objects function. This is a low level function (like
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19096
diff changeset
1492
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23721
diff changeset
1493 PyDoc_STRVAR(gc__doc__,
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1494 "This module provides access to the garbage collector for reference cycles.\n"
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1495 "\n"
13878
abfa4e4b2f3e Neil Schemenauer: GC enable(), disable(), isenabled() interface.
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents: 13570
diff changeset
1496 "enable() -- Enable automatic garbage collection.\n"
abfa4e4b2f3e Neil Schemenauer: GC enable(), disable(), isenabled() interface.
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents: 13570
diff changeset
1497 "disable() -- Disable automatic garbage collection.\n"
abfa4e4b2f3e Neil Schemenauer: GC enable(), disable(), isenabled() interface.
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents: 13570
diff changeset
1498 "isenabled() -- Returns true if automatic collection is enabled.\n"
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1499 "collect() -- Do a full collection right now.\n"
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39620
diff changeset
1500 "get_count() -- Return the current collection counts.\n"
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1501 "set_debug() -- Set debugging flags.\n"
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1502 "get_debug() -- Get debugging flags.\n"
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1503 "set_threshold() -- Set the collection thresholds.\n"
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1504 "get_threshold() -- Return the current the collection thresholds.\n"
19097
9e6f7804ef14 Add get_objects function. This is a low level function (like
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19096
diff changeset
1505 "get_objects() -- Return a list of all objects tracked by the collector.\n"
52291
94bd0666ffa7 Merged revisions 70546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50679
diff changeset
1506 "is_tracked() -- Returns true if a given object is tracked.\n"
28497
40d9659b56c9 Add get_referrents() helper function.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 26138
diff changeset
1507 "get_referrers() -- Return the list of objects that refer to an object.\n"
28523
c01fdc3a9180 s/referrents/referents/g. Gotta love that referrers remains rife with rs.
Tim Peters <tim.peters@gmail.com>
parents: 28522
diff changeset
1508 "get_referents() -- Return the list of objects that an object refers to.\n");
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1509
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1510 static PyMethodDef GcMethods[] = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1511 {"enable", gc_enable, METH_NOARGS, gc_enable__doc__},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1512 {"disable", gc_disable, METH_NOARGS, gc_disable__doc__},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1513 {"isenabled", gc_isenabled, METH_NOARGS, gc_isenabled__doc__},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1514 {"set_debug", gc_set_debug, METH_VARARGS, gc_set_debug__doc__},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1515 {"get_debug", gc_get_debug, METH_NOARGS, gc_get_debug__doc__},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1516 {"get_count", gc_get_count, METH_NOARGS, gc_get_count__doc__},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1517 {"set_threshold", gc_set_thresh, METH_VARARGS, gc_set_thresh__doc__},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1518 {"get_threshold", gc_get_thresh, METH_NOARGS, gc_get_thresh__doc__},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1519 {"collect", (PyCFunction)gc_collect,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1520 METH_VARARGS | METH_KEYWORDS, gc_collect__doc__},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1521 {"get_objects", gc_get_objects,METH_NOARGS, gc_get_objects__doc__},
80063
43d87cdf9457 Issue #16351: New function gc.get_stats() returns per-generation collection statistics.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77211
diff changeset
1522 {"get_stats", gc_get_stats, METH_NOARGS, gc_get_stats__doc__},
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1523 {"is_tracked", gc_is_tracked, METH_O, gc_is_tracked__doc__},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1524 {"get_referrers", gc_get_referrers, METH_VARARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1525 gc_get_referrers__doc__},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1526 {"get_referents", gc_get_referents, METH_VARARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1527 gc_get_referents__doc__},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1528 {NULL, NULL} /* Sentinel */
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1529 };
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1530
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 45371
diff changeset
1531 static struct PyModuleDef gcmodule = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1532 PyModuleDef_HEAD_INIT,
63852
1bd3534136a0 Issue #477863: Print a warning at shutdown if gc.garbage is not empty.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
1533 "gc", /* m_name */
1bd3534136a0 Issue #477863: Print a warning at shutdown if gc.garbage is not empty.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
1534 gc__doc__, /* m_doc */
1bd3534136a0 Issue #477863: Print a warning at shutdown if gc.garbage is not empty.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
1535 -1, /* m_size */
1bd3534136a0 Issue #477863: Print a warning at shutdown if gc.garbage is not empty.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
1536 GcMethods, /* m_methods */
1bd3534136a0 Issue #477863: Print a warning at shutdown if gc.garbage is not empty.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
1537 NULL, /* m_reload */
1bd3534136a0 Issue #477863: Print a warning at shutdown if gc.garbage is not empty.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
1538 NULL, /* m_traverse */
1bd3534136a0 Issue #477863: Print a warning at shutdown if gc.garbage is not empty.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
1539 NULL, /* m_clear */
1bd3534136a0 Issue #477863: Print a warning at shutdown if gc.garbage is not empty.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
1540 NULL /* m_free */
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 45371
diff changeset
1541 };
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 45371
diff changeset
1542
30311
f003e48f562d Bug #794140: cygwin builds do not embed
Jason Tishler <jason@tishler.net>
parents: 28651
diff changeset
1543 PyMODINIT_FUNC
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 45371
diff changeset
1544 PyInit_gc(void)
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1545 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1546 PyObject *m;
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1547
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1548 m = PyModule_Create(&gcmodule);
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 45371
diff changeset
1549
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1550 if (m == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1551 return NULL;
28516
78f846fb570a initgc(): Rewrote to use the PyModule_AddXYZ API; cuts code size.
Tim Peters <tim.peters@gmail.com>
parents: 28515
diff changeset
1552
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1553 if (garbage == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1554 garbage = PyList_New(0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1555 if (garbage == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1556 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1557 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1558 Py_INCREF(garbage);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1559 if (PyModule_AddObject(m, "garbage", garbage) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1560 return NULL;
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1561
76319
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1562 if (callbacks == NULL) {
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1563 callbacks = PyList_New(0);
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1564 if (callbacks == NULL)
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1565 return NULL;
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1566 }
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1567 Py_INCREF(callbacks);
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1568 if (PyModule_AddObject(m, "callbacks", callbacks) < 0)
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1569 return NULL;
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1570
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1571 /* Importing can't be done in collect() because collect()
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1572 * can be called via PyGC_Collect() in Py_Finalize().
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1573 * This wouldn't be a problem, except that <initialized> is
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1574 * reset to 0 before calling collect which trips up
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1575 * the import and triggers an assertion.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1576 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1577 if (tmod == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1578 tmod = PyImport_ImportModuleNoBlock("time");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1579 if (tmod == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1580 PyErr_Clear();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1581 }
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1582
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 45371
diff changeset
1583 #define ADD_INT(NAME) if (PyModule_AddIntConstant(m, #NAME, NAME) < 0) return NULL
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1584 ADD_INT(DEBUG_STATS);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1585 ADD_INT(DEBUG_COLLECTABLE);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1586 ADD_INT(DEBUG_UNCOLLECTABLE);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1587 ADD_INT(DEBUG_SAVEALL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1588 ADD_INT(DEBUG_LEAK);
28516
78f846fb570a initgc(): Rewrote to use the PyModule_AddXYZ API; cuts code size.
Tim Peters <tim.peters@gmail.com>
parents: 28515
diff changeset
1589 #undef ADD_INT
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1590 return m;
13183
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1591 }
54bffdddc0ef final patches from Neil Schemenauer for garbage collection
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1592
28651
7fda09f751ad - New C API PyGC_Collect(), same as calling gc.collect().
Guido van Rossum <guido@python.org>
parents: 28523
diff changeset
1593 /* API to invoke gc.collect() from C */
36839
7c1aca8e3d7d Make PyGC_Collect() use Py_ssize_t.
Neal Norwitz <nnorwitz@gmail.com>
parents: 36769
diff changeset
1594 Py_ssize_t
28651
7fda09f751ad - New C API PyGC_Collect(), same as calling gc.collect().
Guido van Rossum <guido@python.org>
parents: 28523
diff changeset
1595 PyGC_Collect(void)
7fda09f751ad - New C API PyGC_Collect(), same as calling gc.collect().
Guido van Rossum <guido@python.org>
parents: 28523
diff changeset
1596 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1597 Py_ssize_t n;
28651
7fda09f751ad - New C API PyGC_Collect(), same as calling gc.collect().
Guido van Rossum <guido@python.org>
parents: 28523
diff changeset
1598
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1599 if (collecting)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1600 n = 0; /* already collecting, don't do anything */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1601 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1602 collecting = 1;
76319
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1603 n = collect_with_callback(NUM_GENERATIONS - 1);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1604 collecting = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1605 }
28651
7fda09f751ad - New C API PyGC_Collect(), same as calling gc.collect().
Guido van Rossum <guido@python.org>
parents: 28523
diff changeset
1606
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1607 return n;
28651
7fda09f751ad - New C API PyGC_Collect(), same as calling gc.collect().
Guido van Rossum <guido@python.org>
parents: 28523
diff changeset
1608 }
7fda09f751ad - New C API PyGC_Collect(), same as calling gc.collect().
Guido van Rossum <guido@python.org>
parents: 28523
diff changeset
1609
83835
5abe85aefe29 Issue #17937: Try harder to collect cyclic garbage at shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83771
diff changeset
1610 Py_ssize_t
5abe85aefe29 Issue #17937: Try harder to collect cyclic garbage at shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83771
diff changeset
1611 _PyGC_CollectNoFail(void)
5abe85aefe29 Issue #17937: Try harder to collect cyclic garbage at shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83771
diff changeset
1612 {
5abe85aefe29 Issue #17937: Try harder to collect cyclic garbage at shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83771
diff changeset
1613 Py_ssize_t n;
5abe85aefe29 Issue #17937: Try harder to collect cyclic garbage at shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83771
diff changeset
1614
85180
351657165a05 Replace an overly optimistic assert() in _PyGC_CollectNoFail with a simple guard.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85055
diff changeset
1615 /* Ideally, this function is only called on interpreter shutdown,
351657165a05 Replace an overly optimistic assert() in _PyGC_CollectNoFail with a simple guard.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85055
diff changeset
1616 and therefore not recursively. Unfortunately, when there are daemon
351657165a05 Replace an overly optimistic assert() in _PyGC_CollectNoFail with a simple guard.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85055
diff changeset
1617 threads, a daemon thread can start a cyclic garbage collection
351657165a05 Replace an overly optimistic assert() in _PyGC_CollectNoFail with a simple guard.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85055
diff changeset
1618 during interpreter shutdown (and then never finish it).
351657165a05 Replace an overly optimistic assert() in _PyGC_CollectNoFail with a simple guard.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85055
diff changeset
1619 See http://bugs.python.org/issue8713#msg195178 for an example.
351657165a05 Replace an overly optimistic assert() in _PyGC_CollectNoFail with a simple guard.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85055
diff changeset
1620 */
351657165a05 Replace an overly optimistic assert() in _PyGC_CollectNoFail with a simple guard.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85055
diff changeset
1621 if (collecting)
351657165a05 Replace an overly optimistic assert() in _PyGC_CollectNoFail with a simple guard.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85055
diff changeset
1622 n = 0;
351657165a05 Replace an overly optimistic assert() in _PyGC_CollectNoFail with a simple guard.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85055
diff changeset
1623 else {
351657165a05 Replace an overly optimistic assert() in _PyGC_CollectNoFail with a simple guard.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85055
diff changeset
1624 collecting = 1;
351657165a05 Replace an overly optimistic assert() in _PyGC_CollectNoFail with a simple guard.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85055
diff changeset
1625 n = collect(NUM_GENERATIONS - 1, NULL, NULL, 1);
351657165a05 Replace an overly optimistic assert() in _PyGC_CollectNoFail with a simple guard.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85055
diff changeset
1626 collecting = 0;
351657165a05 Replace an overly optimistic assert() in _PyGC_CollectNoFail with a simple guard.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85055
diff changeset
1627 }
83835
5abe85aefe29 Issue #17937: Try harder to collect cyclic garbage at shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83771
diff changeset
1628 return n;
5abe85aefe29 Issue #17937: Try harder to collect cyclic garbage at shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83771
diff changeset
1629 }
83650
f0833e6ff2d2 Issue #1545463: Global variables caught in reference cycles are now garbage-collected at shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents: 80063
diff changeset
1630
63852
1bd3534136a0 Issue #477863: Print a warning at shutdown if gc.garbage is not empty.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
1631 void
83650
f0833e6ff2d2 Issue #1545463: Global variables caught in reference cycles are now garbage-collected at shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents: 80063
diff changeset
1632 _PyGC_DumpShutdownStats(void)
63852
1bd3534136a0 Issue #477863: Print a warning at shutdown if gc.garbage is not empty.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
1633 {
64732
e5f0ff7d7a06 Do not print additional shutdown message when gc.DEBUG_SAVEALL is set
Antoine Pitrou <solipsis@pitrou.net>
parents: 63852
diff changeset
1634 if (!(debug & DEBUG_SAVEALL)
e5f0ff7d7a06 Do not print additional shutdown message when gc.DEBUG_SAVEALL is set
Antoine Pitrou <solipsis@pitrou.net>
parents: 63852
diff changeset
1635 && garbage != NULL && PyList_GET_SIZE(garbage) > 0) {
65624
39b9e9de372b Add a new warning gategory, ResourceWarning, as discussed on python-dev. It is silent by default,
Georg Brandl <georg@python.org>
parents: 64732
diff changeset
1636 char *message;
39b9e9de372b Add a new warning gategory, ResourceWarning, as discussed on python-dev. It is silent by default,
Georg Brandl <georg@python.org>
parents: 64732
diff changeset
1637 if (debug & DEBUG_UNCOLLECTABLE)
65949
62b3a0a99b19 Issue #10279: fix test_gc under Win64.
Antoine Pitrou <solipsis@pitrou.net>
parents: 65624
diff changeset
1638 message = "gc: %zd uncollectable objects at " \
65624
39b9e9de372b Add a new warning gategory, ResourceWarning, as discussed on python-dev. It is silent by default,
Georg Brandl <georg@python.org>
parents: 64732
diff changeset
1639 "shutdown";
39b9e9de372b Add a new warning gategory, ResourceWarning, as discussed on python-dev. It is silent by default,
Georg Brandl <georg@python.org>
parents: 64732
diff changeset
1640 else
65949
62b3a0a99b19 Issue #10279: fix test_gc under Win64.
Antoine Pitrou <solipsis@pitrou.net>
parents: 65624
diff changeset
1641 message = "gc: %zd uncollectable objects at " \
65624
39b9e9de372b Add a new warning gategory, ResourceWarning, as discussed on python-dev. It is silent by default,
Georg Brandl <georg@python.org>
parents: 64732
diff changeset
1642 "shutdown; use gc.set_debug(gc.DEBUG_UNCOLLECTABLE) to list them";
83687
8a5bebea9fec Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83650
diff changeset
1643 /* PyErr_WarnFormat does too many things and we are at shutdown,
8a5bebea9fec Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83650
diff changeset
1644 the warnings module's dependencies (e.g. linecache) may be gone
8a5bebea9fec Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83650
diff changeset
1645 already. */
8a5bebea9fec Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83650
diff changeset
1646 if (PyErr_WarnExplicitFormat(PyExc_ResourceWarning, "gc", 0,
8a5bebea9fec Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83650
diff changeset
1647 "gc", NULL, message,
8a5bebea9fec Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83650
diff changeset
1648 PyList_GET_SIZE(garbage)))
65624
39b9e9de372b Add a new warning gategory, ResourceWarning, as discussed on python-dev. It is silent by default,
Georg Brandl <georg@python.org>
parents: 64732
diff changeset
1649 PyErr_WriteUnraisable(NULL);
63852
1bd3534136a0 Issue #477863: Print a warning at shutdown if gc.garbage is not empty.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
1650 if (debug & DEBUG_UNCOLLECTABLE) {
1bd3534136a0 Issue #477863: Print a warning at shutdown if gc.garbage is not empty.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
1651 PyObject *repr = NULL, *bytes = NULL;
1bd3534136a0 Issue #477863: Print a warning at shutdown if gc.garbage is not empty.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
1652 repr = PyObject_Repr(garbage);
1bd3534136a0 Issue #477863: Print a warning at shutdown if gc.garbage is not empty.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
1653 if (!repr || !(bytes = PyUnicode_EncodeFSDefault(repr)))
1bd3534136a0 Issue #477863: Print a warning at shutdown if gc.garbage is not empty.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
1654 PyErr_WriteUnraisable(garbage);
1bd3534136a0 Issue #477863: Print a warning at shutdown if gc.garbage is not empty.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
1655 else {
1bd3534136a0 Issue #477863: Print a warning at shutdown if gc.garbage is not empty.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
1656 PySys_WriteStderr(
83687
8a5bebea9fec Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 83650
diff changeset
1657 " %s\n",
63852
1bd3534136a0 Issue #477863: Print a warning at shutdown if gc.garbage is not empty.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
1658 PyBytes_AS_STRING(bytes)
1bd3534136a0 Issue #477863: Print a warning at shutdown if gc.garbage is not empty.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
1659 );
1bd3534136a0 Issue #477863: Print a warning at shutdown if gc.garbage is not empty.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
1660 }
1bd3534136a0 Issue #477863: Print a warning at shutdown if gc.garbage is not empty.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
1661 Py_XDECREF(repr);
1bd3534136a0 Issue #477863: Print a warning at shutdown if gc.garbage is not empty.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
1662 Py_XDECREF(bytes);
1bd3534136a0 Issue #477863: Print a warning at shutdown if gc.garbage is not empty.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
1663 }
1bd3534136a0 Issue #477863: Print a warning at shutdown if gc.garbage is not empty.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
1664 }
83650
f0833e6ff2d2 Issue #1545463: Global variables caught in reference cycles are now garbage-collected at shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents: 80063
diff changeset
1665 }
f0833e6ff2d2 Issue #1545463: Global variables caught in reference cycles are now garbage-collected at shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents: 80063
diff changeset
1666
f0833e6ff2d2 Issue #1545463: Global variables caught in reference cycles are now garbage-collected at shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents: 80063
diff changeset
1667 void
f0833e6ff2d2 Issue #1545463: Global variables caught in reference cycles are now garbage-collected at shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents: 80063
diff changeset
1668 _PyGC_Fini(void)
f0833e6ff2d2 Issue #1545463: Global variables caught in reference cycles are now garbage-collected at shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents: 80063
diff changeset
1669 {
76319
88f8ef5785d7 Issue #10576: Add a progress callback to gcmodule
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 76161
diff changeset
1670 Py_CLEAR(callbacks);
85055
ff91c8b9c693 In _PyGC_Fini(), lose the reference that was kept to the time module
Antoine Pitrou <solipsis@pitrou.net>
parents: 84911
diff changeset
1671 Py_CLEAR(tmod);
63852
1bd3534136a0 Issue #477863: Print a warning at shutdown if gc.garbage is not empty.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
1672 }
1bd3534136a0 Issue #477863: Print a warning at shutdown if gc.garbage is not empty.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
1673
19585
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
1674 /* for debugging */
28651
7fda09f751ad - New C API PyGC_Collect(), same as calling gc.collect().
Guido van Rossum <guido@python.org>
parents: 28523
diff changeset
1675 void
7fda09f751ad - New C API PyGC_Collect(), same as calling gc.collect().
Guido van Rossum <guido@python.org>
parents: 28523
diff changeset
1676 _PyGC_Dump(PyGC_Head *g)
19585
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
1677 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1678 _PyObject_Dump(FROM_GC(g));
19585
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
1679 }
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
1680
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
1681 /* extension modules might be compiled with GC support so these
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
1682 functions must always be available */
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
1683
22972
95819f7f0bcd Allow PyObject_Del to be used as a function designator. Provide binary
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22648
diff changeset
1684 #undef PyObject_GC_Track
95819f7f0bcd Allow PyObject_Del to be used as a function designator. Provide binary
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22648
diff changeset
1685 #undef PyObject_GC_UnTrack
95819f7f0bcd Allow PyObject_Del to be used as a function designator. Provide binary
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22648
diff changeset
1686 #undef PyObject_GC_Del
95819f7f0bcd Allow PyObject_Del to be used as a function designator. Provide binary
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22648
diff changeset
1687 #undef _PyObject_GC_Malloc
95819f7f0bcd Allow PyObject_Del to be used as a function designator. Provide binary
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22648
diff changeset
1688
19585
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
1689 void
22972
95819f7f0bcd Allow PyObject_Del to be used as a function designator. Provide binary
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22648
diff changeset
1690 PyObject_GC_Track(void *op)
19585
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
1691 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1692 _PyObject_GC_TRACK(op);
19585
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
1693 }
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
1694
22972
95819f7f0bcd Allow PyObject_Del to be used as a function designator. Provide binary
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22648
diff changeset
1695 /* for binary compatibility with 2.2 */
19585
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
1696 void
22972
95819f7f0bcd Allow PyObject_Del to be used as a function designator. Provide binary
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22648
diff changeset
1697 _PyObject_GC_Track(PyObject *op)
95819f7f0bcd Allow PyObject_Del to be used as a function designator. Provide binary
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22648
diff changeset
1698 {
95819f7f0bcd Allow PyObject_Del to be used as a function designator. Provide binary
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22648
diff changeset
1699 PyObject_GC_Track(op);
95819f7f0bcd Allow PyObject_Del to be used as a function designator. Provide binary
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22648
diff changeset
1700 }
95819f7f0bcd Allow PyObject_Del to be used as a function designator. Provide binary
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22648
diff changeset
1701
95819f7f0bcd Allow PyObject_Del to be used as a function designator. Provide binary
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22648
diff changeset
1702 void
95819f7f0bcd Allow PyObject_Del to be used as a function designator. Provide binary
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22648
diff changeset
1703 PyObject_GC_UnTrack(void *op)
19585
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
1704 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1705 /* Obscure: the Py_TRASHCAN mechanism requires that we be able to
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1706 * call PyObject_GC_UnTrack twice on an object.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1707 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1708 if (IS_TRACKED(op))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1709 _PyObject_GC_UNTRACK(op);
19585
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
1710 }
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
1711
22972
95819f7f0bcd Allow PyObject_Del to be used as a function designator. Provide binary
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22648
diff changeset
1712 /* for binary compatibility with 2.2 */
95819f7f0bcd Allow PyObject_Del to be used as a function designator. Provide binary
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22648
diff changeset
1713 void
95819f7f0bcd Allow PyObject_Del to be used as a function designator. Provide binary
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22648
diff changeset
1714 _PyObject_GC_UnTrack(PyObject *op)
95819f7f0bcd Allow PyObject_Del to be used as a function designator. Provide binary
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22648
diff changeset
1715 {
95819f7f0bcd Allow PyObject_Del to be used as a function designator. Provide binary
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22648
diff changeset
1716 PyObject_GC_UnTrack(op);
95819f7f0bcd Allow PyObject_Del to be used as a function designator. Provide binary
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22648
diff changeset
1717 }
95819f7f0bcd Allow PyObject_Del to be used as a function designator. Provide binary
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22648
diff changeset
1718
19585
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
1719 PyObject *
22972
95819f7f0bcd Allow PyObject_Del to be used as a function designator. Provide binary
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22648
diff changeset
1720 _PyObject_GC_Malloc(size_t basicsize)
19585
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
1721 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1722 PyObject *op;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1723 PyGC_Head *g;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1724 if (basicsize > PY_SSIZE_T_MAX - sizeof(PyGC_Head))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1725 return PyErr_NoMemory();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1726 g = (PyGC_Head *)PyObject_MALLOC(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1727 sizeof(PyGC_Head) + basicsize);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1728 if (g == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1729 return PyErr_NoMemory();
84911
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
1730 g->gc.gc_refs = 0;
3f994367a979 Issue #18112: PEP 442 implementation (safe object finalization).
Antoine Pitrou <solipsis@pitrou.net>
parents: 84508
diff changeset
1731 _PyGCHead_SET_REFS(g, GC_UNTRACKED);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1732 generations[0].count++; /* number of allocated GC objects */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1733 if (generations[0].count > generations[0].threshold &&
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1734 enabled &&
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1735 generations[0].threshold &&
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1736 !collecting &&
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1737 !PyErr_Occurred()) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1738 collecting = 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1739 collect_generations();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1740 collecting = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1741 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1742 op = FROM_GC(g);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1743 return op;
19585
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
1744 }
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
1745
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
1746 PyObject *
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
1747 _PyObject_GC_New(PyTypeObject *tp)
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
1748 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1749 PyObject *op = _PyObject_GC_Malloc(_PyObject_SIZE(tp));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1750 if (op != NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1751 op = PyObject_INIT(op, tp);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1752 return op;
19585
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
1753 }
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
1754
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
1755 PyVarObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
1756 _PyObject_GC_NewVar(PyTypeObject *tp, Py_ssize_t nitems)
19585
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
1757 {
84508
111c2a070f28 Issue #18408: PyObject_GC_NewVar() now raises SystemError exception if nitems
Victor Stinner <victor.stinner@gmail.com>
parents: 84507
diff changeset
1758 size_t size;
111c2a070f28 Issue #18408: PyObject_GC_NewVar() now raises SystemError exception if nitems
Victor Stinner <victor.stinner@gmail.com>
parents: 84507
diff changeset
1759 PyVarObject *op;
111c2a070f28 Issue #18408: PyObject_GC_NewVar() now raises SystemError exception if nitems
Victor Stinner <victor.stinner@gmail.com>
parents: 84507
diff changeset
1760
111c2a070f28 Issue #18408: PyObject_GC_NewVar() now raises SystemError exception if nitems
Victor Stinner <victor.stinner@gmail.com>
parents: 84507
diff changeset
1761 if (nitems < 0) {
111c2a070f28 Issue #18408: PyObject_GC_NewVar() now raises SystemError exception if nitems
Victor Stinner <victor.stinner@gmail.com>
parents: 84507
diff changeset
1762 PyErr_BadInternalCall();
111c2a070f28 Issue #18408: PyObject_GC_NewVar() now raises SystemError exception if nitems
Victor Stinner <victor.stinner@gmail.com>
parents: 84507
diff changeset
1763 return NULL;
111c2a070f28 Issue #18408: PyObject_GC_NewVar() now raises SystemError exception if nitems
Victor Stinner <victor.stinner@gmail.com>
parents: 84507
diff changeset
1764 }
111c2a070f28 Issue #18408: PyObject_GC_NewVar() now raises SystemError exception if nitems
Victor Stinner <victor.stinner@gmail.com>
parents: 84507
diff changeset
1765 size = _PyObject_VAR_SIZE(tp, nitems);
111c2a070f28 Issue #18408: PyObject_GC_NewVar() now raises SystemError exception if nitems
Victor Stinner <victor.stinner@gmail.com>
parents: 84507
diff changeset
1766 op = (PyVarObject *) _PyObject_GC_Malloc(size);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1767 if (op != NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1768 op = PyObject_INIT_VAR(op, tp, nitems);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1769 return op;
19585
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
1770 }
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
1771
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
1772 PyVarObject *
36524
4c8606191c0c Change _PyObject_GC_Resize to expect Py_ssize_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 36501
diff changeset
1773 _PyObject_GC_Resize(PyVarObject *op, Py_ssize_t nitems)
19585
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
1774 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1775 const size_t basicsize = _PyObject_VAR_SIZE(Py_TYPE(op), nitems);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1776 PyGC_Head *g = AS_GC(op);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1777 if (basicsize > PY_SSIZE_T_MAX - sizeof(PyGC_Head))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1778 return (PyVarObject *)PyErr_NoMemory();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1779 g = (PyGC_Head *)PyObject_REALLOC(g, sizeof(PyGC_Head) + basicsize);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1780 if (g == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1781 return (PyVarObject *)PyErr_NoMemory();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1782 op = (PyVarObject *) FROM_GC(g);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1783 Py_SIZE(op) = nitems;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1784 return op;
19585
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
1785 }
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
1786
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
1787 void
22972
95819f7f0bcd Allow PyObject_Del to be used as a function designator. Provide binary
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22648
diff changeset
1788 PyObject_GC_Del(void *op)
19585
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
1789 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1790 PyGC_Head *g = AS_GC(op);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1791 if (IS_TRACKED(op))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1792 gc_list_remove(g);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1793 if (generations[0].count > 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1794 generations[0].count--;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1795 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61165
diff changeset
1796 PyObject_FREE(g);
19585
c43d7a8f00a4 Make more things internal to this file. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 19128
diff changeset
1797 }