Skip to content

Commit eb692d9

Browse files
authored
[3.13] gh-126076: Account for relocated objects in tracemalloc (GH-126077) (#127823)
(cherry picked from commit 30aeb00)
1 parent 78dfc28 commit eb692d9

File tree

7 files changed

+18
-25
lines changed

7 files changed

+18
-25
lines changed

Include/internal/pycore_object.h

+9-5
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,14 @@ PyAPI_FUNC(void) _Py_NO_RETURN _Py_FatalRefcountErrorFunc(
105105
#define _Py_FatalRefcountError(message) \
106106
_Py_FatalRefcountErrorFunc(__func__, (message))
107107

108+
#define _PyReftracerTrack(obj, operation) \
109+
do { \
110+
struct _reftracer_runtime_state *tracer = &_PyRuntime.ref_tracer; \
111+
if (tracer->tracer_func != NULL) { \
112+
void *data = tracer->tracer_data; \
113+
tracer->tracer_func((obj), (operation), data); \
114+
} \
115+
} while(0)
108116

109117
#ifdef Py_REF_DEBUG
110118
/* The symbol is only exposed in the API for the sake of extensions
@@ -216,11 +224,7 @@ _Py_DECREF_SPECIALIZED(PyObject *op, const destructor destruct)
216224
#ifdef Py_TRACE_REFS
217225
_Py_ForgetReference(op);
218226
#endif
219-
struct _reftracer_runtime_state *tracer = &_PyRuntime.ref_tracer;
220-
if (tracer->tracer_func != NULL) {
221-
void* data = tracer->tracer_data;
222-
tracer->tracer_func(op, PyRefTracer_DESTROY, data);
223-
}
227+
_PyReftracerTrack(op, PyRefTracer_DESTROY);
224228
destruct(op);
225229
}
226230
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Relocated objects such as ``tuple``, ``bytes`` and ``str`` objects are
2+
properly tracked by :mod:`tracemalloc` and its associated hooks. Patch by
3+
Pablo Galindo.

Objects/bytesobject.c

+1
Original file line numberDiff line numberDiff line change
@@ -3171,6 +3171,7 @@ _PyBytes_Resize(PyObject **pv, Py_ssize_t newsize)
31713171
#ifdef Py_TRACE_REFS
31723172
_Py_ForgetReference(v);
31733173
#endif
3174+
_PyReftracerTrack(v, PyRefTracer_DESTROY);
31743175
*pv = (PyObject *)
31753176
PyObject_Realloc(v, PyBytesObject_SIZE + newsize);
31763177
if (*pv == NULL) {

Objects/object.c

+2-15
Original file line numberDiff line numberDiff line change
@@ -2467,11 +2467,7 @@ new_reference(PyObject *op)
24672467
#ifdef Py_TRACE_REFS
24682468
_Py_AddToAllObjects(op);
24692469
#endif
2470-
struct _reftracer_runtime_state *tracer = &_PyRuntime.ref_tracer;
2471-
if (tracer->tracer_func != NULL) {
2472-
void* data = tracer->tracer_data;
2473-
tracer->tracer_func(op, PyRefTracer_CREATE, data);
2474-
}
2470+
_PyReftracerTrack(op, PyRefTracer_CREATE);
24752471
}
24762472

24772473
void
@@ -2543,10 +2539,6 @@ _Py_ResurrectReference(PyObject *op)
25432539
#ifdef Py_TRACE_REFS
25442540
_Py_AddToAllObjects(op);
25452541
#endif
2546-
if (_PyRuntime.ref_tracer.tracer_func != NULL) {
2547-
void* data = _PyRuntime.ref_tracer.tracer_data;
2548-
_PyRuntime.ref_tracer.tracer_func(op, PyRefTracer_CREATE, data);
2549-
}
25502542
}
25512543

25522544

@@ -2936,15 +2928,10 @@ _Py_Dealloc(PyObject *op)
29362928
Py_INCREF(type);
29372929
#endif
29382930

2939-
struct _reftracer_runtime_state *tracer = &_PyRuntime.ref_tracer;
2940-
if (tracer->tracer_func != NULL) {
2941-
void* data = tracer->tracer_data;
2942-
tracer->tracer_func(op, PyRefTracer_DESTROY, data);
2943-
}
2944-
29452931
#ifdef Py_TRACE_REFS
29462932
_Py_ForgetReference(op);
29472933
#endif
2934+
_PyReftracerTrack(op, PyRefTracer_DESTROY);
29482935
(*dealloc)(op);
29492936

29502937
#ifdef Py_DEBUG

Objects/tupleobject.c

+1
Original file line numberDiff line numberDiff line change
@@ -942,6 +942,7 @@ _PyTuple_Resize(PyObject **pv, Py_ssize_t newsize)
942942
for (i = newsize; i < oldsize; i++) {
943943
Py_CLEAR(v->ob_item[i]);
944944
}
945+
_PyReftracerTrack((PyObject *)v, PyRefTracer_DESTROY);
945946
sv = PyObject_GC_Resize(PyTupleObject, v, newsize);
946947
if (sv == NULL) {
947948
*pv = NULL;

Objects/unicodeobject.c

+1
Original file line numberDiff line numberDiff line change
@@ -1121,6 +1121,7 @@ resize_compact(PyObject *unicode, Py_ssize_t length)
11211121
#ifdef Py_TRACE_REFS
11221122
_Py_ForgetReference(unicode);
11231123
#endif
1124+
_PyReftracerTrack(unicode, PyRefTracer_DESTROY);
11241125

11251126
new_unicode = (PyObject *)PyObject_Realloc(unicode, new_size);
11261127
if (new_unicode == NULL) {

Python/ceval.c

+1-5
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,7 @@
9595
} \
9696
_Py_DECREF_STAT_INC(); \
9797
if (--op->ob_refcnt == 0) { \
98-
struct _reftracer_runtime_state *tracer = &_PyRuntime.ref_tracer; \
99-
if (tracer->tracer_func != NULL) { \
100-
void* data = tracer->tracer_data; \
101-
tracer->tracer_func(op, PyRefTracer_DESTROY, data); \
102-
} \
98+
_PyReftracerTrack(op, PyRefTracer_DESTROY); \
10399
destructor d = (destructor)(dealloc); \
104100
d(op); \
105101
} \

0 commit comments

Comments
 (0)