summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPablo Galindo Salgado <Pablogsal@gmail.com>2024-11-19 10:35:17 (GMT)
committerGitHub <noreply@github.com>2024-11-19 10:35:17 (GMT)
commit30aeb00d367d0cc9e5a7603371636cddea09f1c0 (patch)
tree70460af295fd174eeee64b893ecee84132c3f66f
parent899fdb213db6c5881c5f9c6760ead6fd713d2070 (diff)
downloadcpython-30aeb00d367d0cc9e5a7603371636cddea09f1c0.zip
cpython-30aeb00d367d0cc9e5a7603371636cddea09f1c0.tar.gz
cpython-30aeb00d367d0cc9e5a7603371636cddea09f1c0.tar.bz2
gh-126076: Account for relocated objects in tracemalloc (#126077)
-rw-r--r--Include/internal/pycore_object.h14
-rw-r--r--Misc/NEWS.d/next/Core_and_Builtins/2024-10-28-13-18-16.gh-issue-126076.MebZuS.rst3
-rw-r--r--Objects/bytesobject.c1
-rw-r--r--Objects/object.c17
-rw-r--r--Objects/tupleobject.c1
-rw-r--r--Objects/unicodeobject.c1
-rw-r--r--Python/ceval.c6
7 files changed, 18 insertions, 25 deletions
diff --git a/Include/internal/pycore_object.h b/Include/internal/pycore_object.h
index c7af720..cafc02f 100644
--- a/Include/internal/pycore_object.h
+++ b/Include/internal/pycore_object.h
@@ -94,6 +94,14 @@ PyAPI_FUNC(void) _Py_NO_RETURN _Py_FatalRefcountErrorFunc(
#define _Py_FatalRefcountError(message) \
_Py_FatalRefcountErrorFunc(__func__, (message))
+#define _PyReftracerTrack(obj, operation) \
+ do { \
+ struct _reftracer_runtime_state *tracer = &_PyRuntime.ref_tracer; \
+ if (tracer->tracer_func != NULL) { \
+ void *data = tracer->tracer_data; \
+ tracer->tracer_func((obj), (operation), data); \
+ } \
+ } while(0)
#ifdef Py_REF_DEBUG
/* The symbol is only exposed in the API for the sake of extensions
@@ -208,11 +216,7 @@ _Py_DECREF_SPECIALIZED(PyObject *op, const destructor destruct)
#ifdef Py_TRACE_REFS
_Py_ForgetReference(op);
#endif
- struct _reftracer_runtime_state *tracer = &_PyRuntime.ref_tracer;
- if (tracer->tracer_func != NULL) {
- void* data = tracer->tracer_data;
- tracer->tracer_func(op, PyRefTracer_DESTROY, data);
- }
+ _PyReftracerTrack(op, PyRefTracer_DESTROY);
destruct(op);
}
}
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2024-10-28-13-18-16.gh-issue-126076.MebZuS.rst b/Misc/NEWS.d/next/Core_and_Builtins/2024-10-28-13-18-16.gh-issue-126076.MebZuS.rst
new file mode 100644
index 0000000..5108ca5
--- /dev/null
+++ b/Misc/NEWS.d/next/Core_and_Builtins/2024-10-28-13-18-16.gh-issue-126076.MebZuS.rst
@@ -0,0 +1,3 @@
+Relocated objects such as ``tuple``, ``bytes`` and ``str`` objects are
+properly tracked by :mod:`tracemalloc` and its associated hooks. Patch by
+Pablo Galindo.
diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c
index ac02cfe..8c7651f 100644
--- a/Objects/bytesobject.c
+++ b/Objects/bytesobject.c
@@ -3196,6 +3196,7 @@ _PyBytes_Resize(PyObject **pv, Py_ssize_t newsize)
#ifdef Py_TRACE_REFS
_Py_ForgetReference(v);
#endif
+ _PyReftracerTrack(v, PyRefTracer_DESTROY);
*pv = (PyObject *)
PyObject_Realloc(v, PyBytesObject_SIZE + newsize);
if (*pv == NULL) {
diff --git a/Objects/object.c b/Objects/object.c
index 052dea9..b115bc7 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -2457,11 +2457,7 @@ new_reference(PyObject *op)
#ifdef Py_TRACE_REFS
_Py_AddToAllObjects(op);
#endif
- struct _reftracer_runtime_state *tracer = &_PyRuntime.ref_tracer;
- if (tracer->tracer_func != NULL) {
- void* data = tracer->tracer_data;
- tracer->tracer_func(op, PyRefTracer_CREATE, data);
- }
+ _PyReftracerTrack(op, PyRefTracer_CREATE);
}
void
@@ -2554,10 +2550,6 @@ _Py_ResurrectReference(PyObject *op)
#ifdef Py_TRACE_REFS
_Py_AddToAllObjects(op);
#endif
- if (_PyRuntime.ref_tracer.tracer_func != NULL) {
- void* data = _PyRuntime.ref_tracer.tracer_data;
- _PyRuntime.ref_tracer.tracer_func(op, PyRefTracer_CREATE, data);
- }
}
@@ -2947,15 +2939,10 @@ _Py_Dealloc(PyObject *op)
Py_INCREF(type);
#endif
- struct _reftracer_runtime_state *tracer = &_PyRuntime.ref_tracer;
- if (tracer->tracer_func != NULL) {
- void* data = tracer->tracer_data;
- tracer->tracer_func(op, PyRefTracer_DESTROY, data);
- }
-
#ifdef Py_TRACE_REFS
_Py_ForgetReference(op);
#endif
+ _PyReftracerTrack(op, PyRefTracer_DESTROY);
(*dealloc)(op);
#ifdef Py_DEBUG
diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c
index 193914d..4997772 100644
--- a/Objects/tupleobject.c
+++ b/Objects/tupleobject.c
@@ -966,6 +966,7 @@ _PyTuple_Resize(PyObject **pv, Py_ssize_t newsize)
for (i = newsize; i < oldsize; i++) {
Py_CLEAR(v->ob_item[i]);
}
+ _PyReftracerTrack((PyObject *)v, PyRefTracer_DESTROY);
sv = PyObject_GC_Resize(PyTupleObject, v, newsize);
if (sv == NULL) {
*pv = NULL;
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
index 9cd9781..562e331 100644
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -1129,6 +1129,7 @@ resize_compact(PyObject *unicode, Py_ssize_t length)
#ifdef Py_TRACE_REFS
_Py_ForgetReference(unicode);
#endif
+ _PyReftracerTrack(unicode, PyRefTracer_DESTROY);
new_unicode = (PyObject *)PyObject_Realloc(unicode, new_size);
if (new_unicode == NULL) {
diff --git a/Python/ceval.c b/Python/ceval.c
index 9a608f0..892dc5f 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -99,11 +99,7 @@
} \
_Py_DECREF_STAT_INC(); \
if (--op->ob_refcnt == 0) { \
- struct _reftracer_runtime_state *tracer = &_PyRuntime.ref_tracer; \
- if (tracer->tracer_func != NULL) { \
- void* data = tracer->tracer_data; \
- tracer->tracer_func(op, PyRefTracer_DESTROY, data); \
- } \
+ _PyReftracerTrack(op, PyRefTracer_DESTROY); \
destructor d = (destructor)(dealloc); \
d(op); \
} \