mirror of
https://github.com/python/cpython.git
synced 2026-01-06 15:32:22 +00:00
gh-127599: Fix _Py_RefcntAdd missing calls to _Py_INCREF_STAT_INC/_Py_INCREF_IMMORTAL_STAT_INC (#127717)
Previously, `_Py_RefcntAdd` hasn't called `_Py_INCREF_STAT_INC/_Py_INCREF_IMMORTAL_STAT_INC` which is incorrect. Now it has been fixed.
This commit is contained in:
parent
7900a85019
commit
ab05beb8ce
3 changed files with 13 additions and 0 deletions
|
|
@ -18,6 +18,12 @@
|
|||
//
|
||||
// Define _PY_INTERPRETER macro to increment interpreter_increfs and
|
||||
// interpreter_decrefs. Otherwise, increment increfs and decrefs.
|
||||
//
|
||||
// The number of incref operations counted by `incref` and
|
||||
// `interpreter_incref` is the number of increment operations, which is
|
||||
// not equal to the total of all reference counts. A single increment
|
||||
// operation may increase the reference count of an object by more than
|
||||
// one. For example, see `_Py_RefcntAdd`.
|
||||
|
||||
#ifndef Py_CPYTHON_PYSTATS_H
|
||||
# error "this header file must not be included directly"
|
||||
|
|
|
|||
|
|
@ -131,6 +131,7 @@ extern void _Py_DecRefTotal(PyThreadState *);
|
|||
static inline void _Py_RefcntAdd(PyObject* op, Py_ssize_t n)
|
||||
{
|
||||
if (_Py_IsImmortal(op)) {
|
||||
_Py_INCREF_IMMORTAL_STAT_INC();
|
||||
return;
|
||||
}
|
||||
#ifdef Py_REF_DEBUG
|
||||
|
|
@ -159,6 +160,10 @@ static inline void _Py_RefcntAdd(PyObject* op, Py_ssize_t n)
|
|||
_Py_atomic_add_ssize(&op->ob_ref_shared, (n << _Py_REF_SHARED_SHIFT));
|
||||
}
|
||||
#endif
|
||||
// Although the ref count was increased by `n` (which may be greater than 1)
|
||||
// it is only a single increment (i.e. addition) operation, so only 1 refcnt
|
||||
// increment operation is counted.
|
||||
_Py_INCREF_STAT_INC();
|
||||
}
|
||||
#define _Py_RefcntAdd(op, n) _Py_RefcntAdd(_PyObject_CAST(op), n)
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,2 @@
|
|||
Fix statistics for increments of object reference counts (in particular, when
|
||||
a reference count was increased by more than 1 in a single operation).
|
||||
Loading…
Add table
Add a link
Reference in a new issue