Skip to content

Commit

Permalink
pythongh-127599: Fix _Py_RefcntAdd missing calls to _Py_INCREF_STAT_I…
Browse files Browse the repository at this point in the history
…NC/_Py_INCREF_IMMORTAL_STAT_INC (pythonGH-127717)

Previously, `_Py_RefcntAdd` hasn't called
`_Py_INCREF_STAT_INC/_Py_INCREF_IMMORTAL_STAT_INC` which is incorrect.

Now it has been fixed.
(cherry picked from commit ab05beb)

Co-authored-by: Ed Nutting <[email protected]>
  • Loading branch information
EdNutting authored and miss-islington committed Dec 15, 2024
1 parent 89f4b23 commit 0f72cdb
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 0 deletions.
6 changes: 6 additions & 0 deletions Include/cpython/pystats.h
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
5 changes: 5 additions & 0 deletions Include/internal/pycore_object.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -155,6 +156,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)

Expand Down
Original file line number Diff line number Diff line change
@@ -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).

0 comments on commit 0f72cdb

Please sign in to comment.