blob: 72795c66bf7284d8a666e37ae804a5756d8d02f9 [file] [log] [blame]
Serhiy Storchaka93260282017-02-04 11:19:59 +02001/*[clinic input]
2preserve
3[clinic start generated code]*/
4
5PyDoc_STRVAR(gc_enable__doc__,
6"enable($module, /)\n"
7"--\n"
8"\n"
9"Enable automatic garbage collection.");
10
11#define GC_ENABLE_METHODDEF \
12 {"enable", (PyCFunction)gc_enable, METH_NOARGS, gc_enable__doc__},
13
14static PyObject *
15gc_enable_impl(PyObject *module);
16
17static PyObject *
18gc_enable(PyObject *module, PyObject *Py_UNUSED(ignored))
19{
20 return gc_enable_impl(module);
21}
22
23PyDoc_STRVAR(gc_disable__doc__,
24"disable($module, /)\n"
25"--\n"
26"\n"
27"Disable automatic garbage collection.");
28
29#define GC_DISABLE_METHODDEF \
30 {"disable", (PyCFunction)gc_disable, METH_NOARGS, gc_disable__doc__},
31
32static PyObject *
33gc_disable_impl(PyObject *module);
34
35static PyObject *
36gc_disable(PyObject *module, PyObject *Py_UNUSED(ignored))
37{
38 return gc_disable_impl(module);
39}
40
41PyDoc_STRVAR(gc_isenabled__doc__,
42"isenabled($module, /)\n"
43"--\n"
44"\n"
45"Returns true if automatic garbage collection is enabled.");
46
47#define GC_ISENABLED_METHODDEF \
48 {"isenabled", (PyCFunction)gc_isenabled, METH_NOARGS, gc_isenabled__doc__},
49
50static int
51gc_isenabled_impl(PyObject *module);
52
53static PyObject *
54gc_isenabled(PyObject *module, PyObject *Py_UNUSED(ignored))
55{
56 PyObject *return_value = NULL;
57 int _return_value;
58
59 _return_value = gc_isenabled_impl(module);
60 if ((_return_value == -1) && PyErr_Occurred()) {
61 goto exit;
62 }
63 return_value = PyBool_FromLong((long)_return_value);
64
65exit:
66 return return_value;
67}
68
69PyDoc_STRVAR(gc_collect__doc__,
70"collect($module, /, generation=2)\n"
71"--\n"
72"\n"
73"Run the garbage collector.\n"
74"\n"
75"With no arguments, run a full collection. The optional argument\n"
76"may be an integer specifying which generation to collect. A ValueError\n"
77"is raised if the generation number is invalid.\n"
78"\n"
79"The number of unreachable objects is returned.");
80
81#define GC_COLLECT_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +020082 {"collect", (PyCFunction)(void(*)(void))gc_collect, METH_FASTCALL|METH_KEYWORDS, gc_collect__doc__},
Serhiy Storchaka93260282017-02-04 11:19:59 +020083
84static Py_ssize_t
85gc_collect_impl(PyObject *module, int generation);
86
87static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +020088gc_collect(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka93260282017-02-04 11:19:59 +020089{
90 PyObject *return_value = NULL;
91 static const char * const _keywords[] = {"generation", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +020092 static _PyArg_Parser _parser = {NULL, _keywords, "collect", 0};
93 PyObject *argsbuf[1];
94 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
Serhiy Storchaka93260282017-02-04 11:19:59 +020095 int generation = NUM_GENERATIONS - 1;
96 Py_ssize_t _return_value;
97
Serhiy Storchaka31913912019-03-14 10:32:22 +020098 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf);
99 if (!args) {
Serhiy Storchaka93260282017-02-04 11:19:59 +0200100 goto exit;
101 }
Serhiy Storchaka31913912019-03-14 10:32:22 +0200102 if (!noptargs) {
103 goto skip_optional_pos;
104 }
105 if (PyFloat_Check(args[0])) {
106 PyErr_SetString(PyExc_TypeError,
107 "integer argument expected, got float" );
108 goto exit;
109 }
110 generation = _PyLong_AsInt(args[0]);
111 if (generation == -1 && PyErr_Occurred()) {
112 goto exit;
113 }
114skip_optional_pos:
Serhiy Storchaka93260282017-02-04 11:19:59 +0200115 _return_value = gc_collect_impl(module, generation);
116 if ((_return_value == -1) && PyErr_Occurred()) {
117 goto exit;
118 }
119 return_value = PyLong_FromSsize_t(_return_value);
120
121exit:
122 return return_value;
123}
124
125PyDoc_STRVAR(gc_set_debug__doc__,
126"set_debug($module, flags, /)\n"
127"--\n"
128"\n"
129"Set the garbage collection debugging flags.\n"
130"\n"
131" flags\n"
132" An integer that can have the following bits turned on:\n"
133" DEBUG_STATS - Print statistics during collection.\n"
134" DEBUG_COLLECTABLE - Print collectable objects found.\n"
135" DEBUG_UNCOLLECTABLE - Print unreachable but uncollectable objects\n"
136" found.\n"
137" DEBUG_SAVEALL - Save objects to gc.garbage rather than freeing them.\n"
138" DEBUG_LEAK - Debug leaking programs (everything but STATS).\n"
139"\n"
140"Debugging information is written to sys.stderr.");
141
142#define GC_SET_DEBUG_METHODDEF \
143 {"set_debug", (PyCFunction)gc_set_debug, METH_O, gc_set_debug__doc__},
144
145static PyObject *
146gc_set_debug_impl(PyObject *module, int flags);
147
148static PyObject *
149gc_set_debug(PyObject *module, PyObject *arg)
150{
151 PyObject *return_value = NULL;
152 int flags;
153
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200154 if (PyFloat_Check(arg)) {
155 PyErr_SetString(PyExc_TypeError,
156 "integer argument expected, got float" );
157 goto exit;
158 }
159 flags = _PyLong_AsInt(arg);
160 if (flags == -1 && PyErr_Occurred()) {
Serhiy Storchaka93260282017-02-04 11:19:59 +0200161 goto exit;
162 }
163 return_value = gc_set_debug_impl(module, flags);
164
165exit:
166 return return_value;
167}
168
169PyDoc_STRVAR(gc_get_debug__doc__,
170"get_debug($module, /)\n"
171"--\n"
172"\n"
173"Get the garbage collection debugging flags.");
174
175#define GC_GET_DEBUG_METHODDEF \
176 {"get_debug", (PyCFunction)gc_get_debug, METH_NOARGS, gc_get_debug__doc__},
177
178static int
179gc_get_debug_impl(PyObject *module);
180
181static PyObject *
182gc_get_debug(PyObject *module, PyObject *Py_UNUSED(ignored))
183{
184 PyObject *return_value = NULL;
185 int _return_value;
186
187 _return_value = gc_get_debug_impl(module);
188 if ((_return_value == -1) && PyErr_Occurred()) {
189 goto exit;
190 }
191 return_value = PyLong_FromLong((long)_return_value);
192
193exit:
194 return return_value;
195}
196
197PyDoc_STRVAR(gc_get_threshold__doc__,
198"get_threshold($module, /)\n"
199"--\n"
200"\n"
201"Return the current collection thresholds.");
202
203#define GC_GET_THRESHOLD_METHODDEF \
204 {"get_threshold", (PyCFunction)gc_get_threshold, METH_NOARGS, gc_get_threshold__doc__},
205
206static PyObject *
207gc_get_threshold_impl(PyObject *module);
208
209static PyObject *
210gc_get_threshold(PyObject *module, PyObject *Py_UNUSED(ignored))
211{
212 return gc_get_threshold_impl(module);
213}
214
215PyDoc_STRVAR(gc_get_count__doc__,
216"get_count($module, /)\n"
217"--\n"
218"\n"
219"Return a three-tuple of the current collection counts.");
220
221#define GC_GET_COUNT_METHODDEF \
222 {"get_count", (PyCFunction)gc_get_count, METH_NOARGS, gc_get_count__doc__},
223
224static PyObject *
225gc_get_count_impl(PyObject *module);
226
227static PyObject *
228gc_get_count(PyObject *module, PyObject *Py_UNUSED(ignored))
229{
230 return gc_get_count_impl(module);
231}
232
233PyDoc_STRVAR(gc_get_objects__doc__,
Pablo Galindo175421b2019-02-23 03:02:06 +0000234"get_objects($module, /, generation=None)\n"
Serhiy Storchaka93260282017-02-04 11:19:59 +0200235"--\n"
236"\n"
Pablo Galindo175421b2019-02-23 03:02:06 +0000237"Return a list of objects tracked by the collector (excluding the list returned).\n"
238"\n"
239" generation\n"
240" Generation to extract the objects from.\n"
241"\n"
242"If generation is not None, return only the objects tracked by the collector\n"
243"that are in that generation.");
Serhiy Storchaka93260282017-02-04 11:19:59 +0200244
245#define GC_GET_OBJECTS_METHODDEF \
Pablo Galindo175421b2019-02-23 03:02:06 +0000246 {"get_objects", (PyCFunction)(void(*)(void))gc_get_objects, METH_FASTCALL|METH_KEYWORDS, gc_get_objects__doc__},
Serhiy Storchaka93260282017-02-04 11:19:59 +0200247
248static PyObject *
Pablo Galindo175421b2019-02-23 03:02:06 +0000249gc_get_objects_impl(PyObject *module, Py_ssize_t generation);
Serhiy Storchaka93260282017-02-04 11:19:59 +0200250
251static PyObject *
Pablo Galindo175421b2019-02-23 03:02:06 +0000252gc_get_objects(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka93260282017-02-04 11:19:59 +0200253{
Pablo Galindo175421b2019-02-23 03:02:06 +0000254 PyObject *return_value = NULL;
255 static const char * const _keywords[] = {"generation", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +0200256 static _PyArg_Parser _parser = {NULL, _keywords, "get_objects", 0};
257 PyObject *argsbuf[1];
258 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
Pablo Galindo175421b2019-02-23 03:02:06 +0000259 Py_ssize_t generation = -1;
260
Serhiy Storchaka31913912019-03-14 10:32:22 +0200261 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf);
262 if (!args) {
Pablo Galindo175421b2019-02-23 03:02:06 +0000263 goto exit;
264 }
Serhiy Storchaka31913912019-03-14 10:32:22 +0200265 if (!noptargs) {
266 goto skip_optional_pos;
267 }
268 if (!_Py_convert_optional_to_ssize_t(args[0], &generation)) {
269 goto exit;
270 }
271skip_optional_pos:
Pablo Galindo175421b2019-02-23 03:02:06 +0000272 return_value = gc_get_objects_impl(module, generation);
273
274exit:
275 return return_value;
Serhiy Storchaka93260282017-02-04 11:19:59 +0200276}
277
278PyDoc_STRVAR(gc_get_stats__doc__,
279"get_stats($module, /)\n"
280"--\n"
281"\n"
282"Return a list of dictionaries containing per-generation statistics.");
283
284#define GC_GET_STATS_METHODDEF \
285 {"get_stats", (PyCFunction)gc_get_stats, METH_NOARGS, gc_get_stats__doc__},
286
287static PyObject *
288gc_get_stats_impl(PyObject *module);
289
290static PyObject *
291gc_get_stats(PyObject *module, PyObject *Py_UNUSED(ignored))
292{
293 return gc_get_stats_impl(module);
294}
295
296PyDoc_STRVAR(gc_is_tracked__doc__,
297"is_tracked($module, obj, /)\n"
298"--\n"
299"\n"
300"Returns true if the object is tracked by the garbage collector.\n"
301"\n"
302"Simple atomic objects will return false.");
303
304#define GC_IS_TRACKED_METHODDEF \
305 {"is_tracked", (PyCFunction)gc_is_tracked, METH_O, gc_is_tracked__doc__},
brainfvckc75edab2017-10-16 12:49:41 -0700306
Pablo Galindoa2ec3f02020-01-14 12:06:45 +0000307PyDoc_STRVAR(gc_is_finalized__doc__,
308"is_finalized($module, obj, /)\n"
309"--\n"
310"\n"
311"Returns true if the object has been already finalized by the GC.");
312
313#define GC_IS_FINALIZED_METHODDEF \
314 {"is_finalized", (PyCFunction)gc_is_finalized, METH_O, gc_is_finalized__doc__},
315
brainfvckc75edab2017-10-16 12:49:41 -0700316PyDoc_STRVAR(gc_freeze__doc__,
317"freeze($module, /)\n"
318"--\n"
319"\n"
320"Freeze all current tracked objects and ignore them for future collections.\n"
321"\n"
322"This can be used before a POSIX fork() call to make the gc copy-on-write friendly.\n"
323"Note: collection before a POSIX fork() call may free pages for future allocation\n"
324"which can cause copy-on-write.");
325
326#define GC_FREEZE_METHODDEF \
327 {"freeze", (PyCFunction)gc_freeze, METH_NOARGS, gc_freeze__doc__},
328
329static PyObject *
330gc_freeze_impl(PyObject *module);
331
332static PyObject *
333gc_freeze(PyObject *module, PyObject *Py_UNUSED(ignored))
334{
335 return gc_freeze_impl(module);
336}
337
338PyDoc_STRVAR(gc_unfreeze__doc__,
339"unfreeze($module, /)\n"
340"--\n"
341"\n"
342"Unfreeze all objects in the permanent generation.\n"
343"\n"
344"Put all objects in the permanent generation back into oldest generation.");
345
346#define GC_UNFREEZE_METHODDEF \
347 {"unfreeze", (PyCFunction)gc_unfreeze, METH_NOARGS, gc_unfreeze__doc__},
348
349static PyObject *
350gc_unfreeze_impl(PyObject *module);
351
352static PyObject *
353gc_unfreeze(PyObject *module, PyObject *Py_UNUSED(ignored))
354{
355 return gc_unfreeze_impl(module);
356}
357
358PyDoc_STRVAR(gc_get_freeze_count__doc__,
359"get_freeze_count($module, /)\n"
360"--\n"
361"\n"
362"Return the number of objects in the permanent generation.");
363
364#define GC_GET_FREEZE_COUNT_METHODDEF \
365 {"get_freeze_count", (PyCFunction)gc_get_freeze_count, METH_NOARGS, gc_get_freeze_count__doc__},
366
Victor Stinner05d68a82018-01-18 11:15:25 +0100367static Py_ssize_t
brainfvckc75edab2017-10-16 12:49:41 -0700368gc_get_freeze_count_impl(PyObject *module);
369
370static PyObject *
371gc_get_freeze_count(PyObject *module, PyObject *Py_UNUSED(ignored))
372{
373 PyObject *return_value = NULL;
Victor Stinner05d68a82018-01-18 11:15:25 +0100374 Py_ssize_t _return_value;
brainfvckc75edab2017-10-16 12:49:41 -0700375
376 _return_value = gc_get_freeze_count_impl(module);
377 if ((_return_value == -1) && PyErr_Occurred()) {
378 goto exit;
379 }
Victor Stinner05d68a82018-01-18 11:15:25 +0100380 return_value = PyLong_FromSsize_t(_return_value);
brainfvckc75edab2017-10-16 12:49:41 -0700381
382exit:
383 return return_value;
384}
Pablo Galindoa2ec3f02020-01-14 12:06:45 +0000385/*[clinic end generated code: output=bd6a8056989e2e69 input=a9049054013a1b77]*/