summaryrefslogtreecommitdiffstats
path: root/Include/object.h
diff options
context:
space:
mode:
authorEric Snow <ericsnowcurrently@gmail.com>2023-03-08 19:03:50 (GMT)
committerGitHub <noreply@github.com>2023-03-08 19:03:50 (GMT)
commitcbb0aa71d040022db61390380b8aebc7c04f3275 (patch)
tree9ff9e2f3141fbd5bdc2446144955722a7d63afa9 /Include/object.h
parent11a2c6ce516b24b2435cb627742a6c4df92d411c (diff)
downloadcpython-cbb0aa71d040022db61390380b8aebc7c04f3275.zip
cpython-cbb0aa71d040022db61390380b8aebc7c04f3275.tar.gz
cpython-cbb0aa71d040022db61390380b8aebc7c04f3275.tar.bz2
gh-102304: Consolidate Direct Usage of _Py_RefTotal (gh-102514)
This simplifies further changes to _Py_RefTotal (e.g. make it atomic or move it to PyInterpreterState). https://github.com/python/cpython/issues/102304
Diffstat (limited to 'Include/object.h')
-rw-r--r--Include/object.h25
1 files changed, 21 insertions, 4 deletions
diff --git a/Include/object.h b/Include/object.h
index 3774f12..844b9c4 100644
--- a/Include/object.h
+++ b/Include/object.h
@@ -490,7 +490,21 @@ you can count such references to the type object.)
*/
#ifdef Py_REF_DEBUG
-PyAPI_DATA(Py_ssize_t) _Py_RefTotal;
+# if defined(Py_LIMITED_API) && Py_LIMITED_API+0 < 0x030A0000
+extern Py_ssize_t _Py_RefTotal;
+# define _Py_INC_REFTOTAL() _Py_RefTotal++
+# define _Py_DEC_REFTOTAL() _Py_RefTotal--
+# elif defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
+extern void _Py_IncRefTotal(void);
+extern void _Py_DecRefTotal(void);
+# define _Py_INC_REFTOTAL() _Py_IncRefTotal()
+# define _Py_DEC_REFTOTAL() _Py_DecRefTotal()
+# elif !defined(Py_LIMITED_API) || Py_LIMITED_API+0 > 0x030C0000
+extern void _Py_IncRefTotal_DO_NOT_USE_THIS(void);
+extern void _Py_DecRefTotal_DO_NOT_USE_THIS(void);
+# define _Py_INC_REFTOTAL() _Py_IncRefTotal_DO_NOT_USE_THIS()
+# define _Py_DEC_REFTOTAL() _Py_DecRefTotal_DO_NOT_USE_THIS()
+# endif
PyAPI_FUNC(void) _Py_NegativeRefcount(const char *filename, int lineno,
PyObject *op);
#endif /* Py_REF_DEBUG */
@@ -519,8 +533,8 @@ static inline void Py_INCREF(PyObject *op)
// Non-limited C API and limited C API for Python 3.9 and older access
// directly PyObject.ob_refcnt.
#ifdef Py_REF_DEBUG
- _Py_RefTotal++;
-#endif
+ _Py_INC_REFTOTAL();
+#endif // Py_REF_DEBUG
op->ob_refcnt++;
#endif
}
@@ -539,7 +553,7 @@ static inline void Py_DECREF(PyObject *op) {
static inline void Py_DECREF(const char *filename, int lineno, PyObject *op)
{
_Py_DECREF_STAT_INC();
- _Py_RefTotal--;
+ _Py_DEC_REFTOTAL();
if (--op->ob_refcnt != 0) {
if (op->ob_refcnt < 0) {
_Py_NegativeRefcount(filename, lineno, op);
@@ -564,6 +578,9 @@ static inline void Py_DECREF(PyObject *op)
#define Py_DECREF(op) Py_DECREF(_PyObject_CAST(op))
#endif
+#undef _Py_INC_REFTOTAL
+#undef _Py_DEC_REFTOTAL
+
/* Safely decref `op` and set `op` to NULL, especially useful in tp_clear
* and tp_dealloc implementations.