Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit30aeb00

Browse files
authored
gh-126076: Account for relocated objects in tracemalloc (#126077)
1 parent899fdb2 commit30aeb00

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
#ifdefPy_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
#ifdefPy_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
#ifdefPy_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
#ifdefPy_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
#ifdefPy_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
#ifdefPy_TRACE_REFS
29572943
_Py_ForgetReference(op);
29582944
#endif
2945+
_PyReftracerTrack(op,PyRefTracer_DESTROY);
29592946
(*dealloc)(op);
29602947

29612948
#ifdefPy_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
#ifdefPy_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)

[8]ページ先頭

©2009-2025 Movatter.jp