Mercurial > cpython-lru_cache-weakref
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 |
| 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 | 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 } |
