summaryrefslogtreecommitdiff
path: root/Modules/gcmodule.c
diff options
context:
space:
mode:
author?ukasz Langa <lukasz@langa.pl>2016-09-09 17:37:37 -0700
committer?ukasz Langa <lukasz@langa.pl>2016-09-09 17:37:37 -0700
commit7d9e9f40d8903147693be8d2bbb4a129005ca49e (patch)
treea4ca33331b37128faf789c34330c40ec7cb03c7e /Modules/gcmodule.c
parent4770c6502066daf65f10d99418c18e48399ff964 (diff)
downloadcpython-7d9e9f40d8903147693be8d2bbb4a129005ca49e.tar.gz
DTrace support: function calls, GC activity, line execution
Tested on macOS 10.11 dtrace, Ubuntu 16.04 SystemTap, and libbcc. Largely based by an initial patch by Jes?s Cea Avi?n, with some influence from Dave Malcolm's SystemTap patch and Nikhil Benesch's unification patch. Things deliberately left out for simplicity: - ustack helpers, I have no way of testing them at this point since they are Solaris-specific - PyFrameObject * in function__entry/function__return, this is SystemTap-specific - SPARC support - dynamic tracing - sys module dtrace facility introspection All of those might be added later.
Diffstat (limited to 'Modules/gcmodule.c')
-rw-r--r--Modules/gcmodule.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c
index 07950a6228..2575d96d71 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 */
@@ -925,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;
@@ -1069,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;
}