summaryrefslogtreecommitdiffstats
path: root/contrib/tools/python3/Python/tracemalloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/tools/python3/Python/tracemalloc.c')
-rw-r--r--contrib/tools/python3/Python/tracemalloc.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/contrib/tools/python3/Python/tracemalloc.c b/contrib/tools/python3/Python/tracemalloc.c
index 852e5b03917..99ba7876acc 100644
--- a/contrib/tools/python3/Python/tracemalloc.c
+++ b/contrib/tools/python3/Python/tracemalloc.c
@@ -3,11 +3,12 @@
#include "pycore_gc.h" // PyGC_Head
#include "pycore_hashtable.h" // _Py_hashtable_t
#include "pycore_initconfig.h" // _PyStatus_NO_MEMORY()
-#include "pycore_object.h" // _PyType_PreHeaderSize
+#include "pycore_object.h" // _PyType_PreHeaderSize()
#include "pycore_pymem.h" // _Py_tracemalloc_config
#include "pycore_runtime.h" // _Py_ID()
-#include "pycore_traceback.h"
+#include "pycore_traceback.h" // _Py_DumpASCII()
#include <pycore_frame.h>
+
#include "frameobject.h" // _PyInterpreterFrame_GetLine
#include <stdlib.h> // malloc()
@@ -250,6 +251,7 @@ hashtable_compare_traceback(const void *key1, const void *key2)
static void
tracemalloc_get_frame(_PyInterpreterFrame *pyframe, frame_t *frame)
{
+ assert(PyCode_Check(pyframe->f_executable));
frame->filename = &_Py_STR(anon_unknown);
int lineno = PyUnstable_InterpreterFrame_GetLine(pyframe);
if (lineno < 0) {
@@ -257,7 +259,7 @@ tracemalloc_get_frame(_PyInterpreterFrame *pyframe, frame_t *frame)
}
frame->lineno = (unsigned int)lineno;
- PyObject *filename = pyframe->f_code->co_filename;
+ PyObject *filename = filename = ((PyCodeObject *)pyframe->f_executable)->co_filename;
if (filename == NULL) {
#ifdef TRACE_DEBUG
@@ -311,7 +313,7 @@ traceback_hash(traceback_t *traceback)
/* code based on tuplehash() of Objects/tupleobject.c */
Py_uhash_t x, y; /* Unsigned for defined overflow behavior. */
int len = traceback->nframe;
- Py_uhash_t mult = _PyHASH_MULTIPLIER;
+ Py_uhash_t mult = PyHASH_MULTIPLIER;
frame_t *frame;
x = 0x345678UL;
@@ -906,6 +908,10 @@ _PyTraceMalloc_Start(int max_nframe)
return -1;
}
+ if (PyRefTracer_SetTracer(_PyTraceMalloc_TraceRef, NULL) < 0) {
+ return -1;
+ }
+
if (tracemalloc_config.tracing) {
/* hook already installed: do nothing */
return 0;
@@ -980,6 +986,8 @@ _PyTraceMalloc_Stop(void)
raw_free(tracemalloc_traceback);
tracemalloc_traceback = NULL;
+ (void)PyRefTracer_SetTracer(NULL, NULL);
+
done:
TABLES_UNLOCK();
}
@@ -1250,7 +1258,7 @@ tracemalloc_get_traceback_unlocked(unsigned int domain, uintptr_t ptr)
}
-#define PUTS(fd, str) _Py_write_noraise(fd, str, (int)strlen(str))
+#define PUTS(fd, str) (void)_Py_write_noraise(fd, str, (int)strlen(str))
static void
_PyMem_DumpFrame(int fd, frame_t * frame)
@@ -1385,8 +1393,12 @@ _PyTraceMalloc_Fini(void)
Do nothing if tracemalloc is not tracing memory allocations
or if the object memory block is not already traced. */
int
-_PyTraceMalloc_NewReference(PyObject *op)
+_PyTraceMalloc_TraceRef(PyObject *op, PyRefTracerEvent event, void* Py_UNUSED(ignore))
{
+ if (event != PyRefTracer_CREATE) {
+ return 0;
+ }
+
assert(PyGILState_Check());
if (!tracemalloc_config.tracing) {