Skip to content

Commit b982284

Browse files
committed
gh-126076: Account for relocated objects in tracemalloc
1 parent 2544159 commit b982284

File tree

7 files changed

+20
-25
lines changed

7 files changed

+20
-25
lines changed

Include/internal/pycore_object.h

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,15 @@ PyAPI_FUNC(void) _Py_NO_RETURN _Py_FatalRefcountErrorFunc(
9494
#define _Py_FatalRefcountError(message) \
9595
_Py_FatalRefcountErrorFunc(__func__, (message))
9696

97+
#define _PyReftracerTrack(obj, operation) \
98+
do { \
99+
struct _reftracer_runtime_state *tracer = &_PyRuntime.ref_tracer; \
100+
if (tracer->tracer_func != NULL) { \
101+
void* data = tracer->tracer_data; \
102+
tracer->tracer_func(obj, (operation), data); \
103+
} \
104+
} while(0)
105+
97106

98107
#ifdef Py_REF_DEBUG
99108
/* The symbol is only exposed in the API for the sake of extensions
@@ -208,11 +217,7 @@ _Py_DECREF_SPECIALIZED(PyObject *op, const destructor destruct)
208217
#ifdef Py_TRACE_REFS
209218
_Py_ForgetReference(op);
210219
#endif
211-
struct _reftracer_runtime_state *tracer = &_PyRuntime.ref_tracer;
212-
if (tracer->tracer_func != NULL) {
213-
void* data = tracer->tracer_data;
214-
tracer->tracer_func(op, PyRefTracer_DESTROY, data);
215-
}
220+
_PyReftracerTrack(op, PyRefTracer_DESTROY);
216221
destruct(op);
217222
}
218223
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Relocated objects such as ``tuple``, ``bytes`` and ``unicode`` objects are
2+
properly tracked by :mod:`tracemalloc` and its associated hooks. Patch by
3+
Pablo Galindo

Objects/bytesobject.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3195,6 +3195,7 @@ _PyBytes_Resize(PyObject **pv, Py_ssize_t newsize)
31953195
#ifdef Py_TRACE_REFS
31963196
_Py_ForgetReference(v);
31973197
#endif
3198+
_PyReftracerTrack(v, PyRefTracer_DESTROY);
31983199
*pv = (PyObject *)
31993200
PyObject_Realloc(v, PyBytesObject_SIZE + newsize);
32003201
if (*pv == NULL) {

Objects/object.c

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2457,11 +2457,7 @@ new_reference(PyObject *op)
24572457
#ifdef Py_TRACE_REFS
24582458
_Py_AddToAllObjects(op);
24592459
#endif
2460-
struct _reftracer_runtime_state *tracer = &_PyRuntime.ref_tracer;
2461-
if (tracer->tracer_func != NULL) {
2462-
void* data = tracer->tracer_data;
2463-
tracer->tracer_func(op, PyRefTracer_CREATE, data);
2464-
}
2460+
_PyReftracerTrack(op, PyRefTracer_CREATE);
24652461
}
24662462

24672463
void
@@ -2525,10 +2521,7 @@ _Py_ResurrectReference(PyObject *op)
25252521
#ifdef Py_TRACE_REFS
25262522
_Py_AddToAllObjects(op);
25272523
#endif
2528-
if (_PyRuntime.ref_tracer.tracer_func != NULL) {
2529-
void* data = _PyRuntime.ref_tracer.tracer_data;
2530-
_PyRuntime.ref_tracer.tracer_func(op, PyRefTracer_CREATE, data);
2531-
}
2524+
_PyReftracerTrack(op, PyRefTracer_CREATE);
25322525
}
25332526

25342527

@@ -2917,12 +2910,7 @@ _Py_Dealloc(PyObject *op)
29172910
// Make sure that type->tp_name remains valid
29182911
Py_INCREF(type);
29192912
#endif
2920-
2921-
struct _reftracer_runtime_state *tracer = &_PyRuntime.ref_tracer;
2922-
if (tracer->tracer_func != NULL) {
2923-
void* data = tracer->tracer_data;
2924-
tracer->tracer_func(op, PyRefTracer_DESTROY, data);
2925-
}
2913+
_PyReftracerTrack(op, PyRefTracer_DESTROY);
29262914

29272915
#ifdef Py_TRACE_REFS
29282916
_Py_ForgetReference(op);

Objects/tupleobject.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -961,6 +961,7 @@ _PyTuple_Resize(PyObject **pv, Py_ssize_t newsize)
961961
#ifdef Py_TRACE_REFS
962962
_Py_ForgetReference((PyObject *) v);
963963
#endif
964+
_PyReftracerTrack(v, PyRefTracer_DESTROY);
964965
/* DECREF items deleted by shrinkage */
965966
for (i = newsize; i < oldsize; i++) {
966967
Py_CLEAR(v->ob_item[i]);

Objects/unicodeobject.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1129,6 +1129,7 @@ resize_compact(PyObject *unicode, Py_ssize_t length)
11291129
#ifdef Py_TRACE_REFS
11301130
_Py_ForgetReference(unicode);
11311131
#endif
1132+
_PyReftracerTrack(unicode, PyRefTracer_DESTROY);
11321133

11331134
new_unicode = (PyObject *)PyObject_Realloc(unicode, new_size);
11341135
if (new_unicode == NULL) {

Python/ceval.c

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -99,11 +99,7 @@
9999
} \
100100
_Py_DECREF_STAT_INC(); \
101101
if (--op->ob_refcnt == 0) { \
102-
struct _reftracer_runtime_state *tracer = &_PyRuntime.ref_tracer; \
103-
if (tracer->tracer_func != NULL) { \
104-
void* data = tracer->tracer_data; \
105-
tracer->tracer_func(op, PyRefTracer_DESTROY, data); \
106-
} \
102+
_PyReftracerTrack(op, PyRefTracer_DESTROY); \
107103
destructor d = (destructor)(dealloc); \
108104
d(op); \
109105
} \

0 commit comments

Comments
 (0)