summaryrefslogtreecommitdiff
path: root/Modules/gcmodule.c
diff options
context:
space:
mode:
authorSteve Dower <steve.dower@microsoft.com>2017-02-04 15:05:40 -0800
committerSteve Dower <steve.dower@microsoft.com>2017-02-04 15:05:40 -0800
commitb2fa705fd3887c326e811c418469c784353027f4 (patch)
treeb3428f73de91453edbfd4df1a5d4a212d182eb44 /Modules/gcmodule.c
parent134e58fd3aaa2e91390041e143f3f0a21a60142b (diff)
parentb53654b6dbfce8318a7d4d1cdaddca7a7fec194b (diff)
downloadcpython-b2fa705fd3887c326e811c418469c784353027f4.tar.gz
Issue #29392: Prevent crash when passing invalid arguments into msvcrt module.
Diffstat (limited to 'Modules/gcmodule.c')
-rw-r--r--Modules/gcmodule.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c
index cb7222db89..754348e20a 100644
--- a/Modules/gcmodule.c
+++ b/Modules/gcmodule.c
@@ -25,6 +25,7 @@
#include "Python.h"
#include "frameobject.h" /* for PyFrame_ClearFreeList */
+#include "pydtrace.h"
#include "pytime.h" /* for _PyTime_GetMonotonicClock() */
/* Get an object's GC head */
@@ -738,7 +739,7 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
}
static void
-debug_cycle(char *msg, PyObject *op)
+debug_cycle(const char *msg, PyObject *op)
{
PySys_FormatStderr("gc: %s <%s %p>\n",
msg, Py_TYPE(op)->tp_name, op);
@@ -892,6 +893,7 @@ clear_freelists(void)
(void)PyList_ClearFreeList();
(void)PyDict_ClearFreeList();
(void)PySet_ClearFreeList();
+ (void)PyAsyncGen_ClearFreeLists();
}
/* This is the main function. Read this to understand how the
@@ -924,6 +926,9 @@ collect(int generation, Py_ssize_t *n_collected, Py_ssize_t *n_uncollectable,
PySys_WriteStderr("\n");
}
+ if (PyDTrace_GC_START_ENABLED())
+ PyDTrace_GC_START(generation);
+
/* update collection and allocation counters */
if (generation+1 < NUM_GENERATIONS)
generations[generation+1].count += 1;
@@ -1068,6 +1073,10 @@ collect(int generation, Py_ssize_t *n_collected, Py_ssize_t *n_uncollectable,
stats->collections++;
stats->collected += m;
stats->uncollectable += n;
+
+ if (PyDTrace_GC_DONE_ENABLED())
+ PyDTrace_GC_DONE(n+m);
+
return n+m;
}
@@ -1588,6 +1597,15 @@ PyGC_Collect(void)
}
Py_ssize_t
+_PyGC_CollectIfEnabled(void)
+{
+ if (!enabled)
+ return 0;
+
+ return PyGC_Collect();
+}
+
+Py_ssize_t
_PyGC_CollectNoFail(void)
{
Py_ssize_t n;