Skip to content

Commit 30aeb00

Browse files
authored
gh-126076: Account for relocated objects in tracemalloc (#126077)
1 parent 899fdb2 commit 30aeb00

File tree

7 files changed

+18
-25
lines changed

7 files changed

+18
-25
lines changed

Include/internal/pycore_object.h

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,14 @@ 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)
97105

98106
#ifdef Py_REF_DEBUG
99107
/* 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)
208216
#ifdef Py_TRACE_REFS
209217
_Py_ForgetReference(op);
210218
#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-
}
219+
_PyReftracerTrack(op, PyRefTracer_DESTROY);
216220
destruct(op);
217221
}
218222
}
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 ``str`` 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
@@ -3196,6 +3196,7 @@ _PyBytes_Resize(PyObject **pv, Py_ssize_t newsize)
31963196
#ifdef Py_TRACE_REFS
31973197
_Py_ForgetReference(v);
31983198
#endif
3199+
_PyReftracerTrack(v, PyRefTracer_DESTROY);
31993200
*pv = (PyObject *)
32003201
PyObject_Realloc(v, PyBytesObject_SIZE + newsize);
32013202
if (*pv == NULL) {

Objects/object.c

Lines changed: 2 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
@@ -2554,10 +2550,6 @@ _Py_ResurrectReference(PyObject *op)
25542550
#ifdef Py_TRACE_REFS
25552551
_Py_AddToAllObjects(op);
25562552
#endif
2557-
if (_PyRuntime.ref_tracer.tracer_func != NULL) {
2558-
void* data = _PyRuntime.ref_tracer.tracer_data;
2559-
_PyRuntime.ref_tracer.tracer_func(op, PyRefTracer_CREATE, data);
2560-
}
25612553
}
25622554

25632555

@@ -2947,15 +2939,10 @@ _Py_Dealloc(PyObject *op)
29472939
Py_INCREF(type);
29482940
#endif
29492941

2950-
struct _reftracer_runtime_state *tracer = &_PyRuntime.ref_tracer;
2951-
if (tracer->tracer_func != NULL) {
2952-
void* data = tracer->tracer_data;
2953-
tracer->tracer_func(op, PyRefTracer_DESTROY, data);
2954-
}
2955-
29562942
#ifdef Py_TRACE_REFS
29572943
_Py_ForgetReference(op);
29582944
#endif
2945+
_PyReftracerTrack(op, PyRefTracer_DESTROY);
29592946
(*dealloc)(op);
29602947

29612948
#ifdef Py_DEBUG

Objects/tupleobject.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -966,6 +966,7 @@ _PyTuple_Resize(PyObject **pv, Py_ssize_t newsize)
966966
for (i = newsize; i < oldsize; i++) {
967967
Py_CLEAR(v->ob_item[i]);
968968
}
969+
_PyReftracerTrack((PyObject *)v, PyRefTracer_DESTROY);
969970
sv = PyObject_GC_Resize(PyTupleObject, v, newsize);
970971
if (sv == NULL) {
971972
*pv = NULL;

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)