summaryrefslogtreecommitdiffstats
path: root/Include
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
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')
-rw-r--r--Include/cpython/object.h1
-rw-r--r--Include/internal/pycore_object.h23
-rw-r--r--Include/object.h25
3 files changed, 42 insertions, 7 deletions
diff --git a/Include/cpython/object.h b/Include/cpython/object.h
index 3f26f24..7b687d3 100644
--- a/Include/cpython/object.h
+++ b/Include/cpython/object.h
@@ -3,6 +3,7 @@
#endif
PyAPI_FUNC(void) _Py_NewReference(PyObject *op);
+PyAPI_FUNC(void) _Py_NewReferenceNoTotal(PyObject *op);
#ifdef Py_TRACE_REFS
/* Py_TRACE_REFS is such major surgery that we call external routines. */
diff --git a/Include/internal/pycore_object.h b/Include/internal/pycore_object.h
index 8796dfe..e15685f 100644
--- a/Include/internal/pycore_object.h
+++ b/Include/internal/pycore_object.h
@@ -37,11 +37,23 @@ PyAPI_FUNC(void) _Py_NO_RETURN _Py_FatalRefcountErrorFunc(
#define _Py_FatalRefcountError(message) \
_Py_FatalRefcountErrorFunc(__func__, (message))
+
+#ifdef Py_REF_DEBUG
+/* The symbol is only exposed in the API for the sake of extensions
+ built against the pre-3.12 stable ABI. */
+PyAPI_DATA(Py_ssize_t) _Py_RefTotal;
+
+extern void _Py_AddRefTotal(Py_ssize_t);
+extern void _Py_IncRefTotal(void);
+extern void _Py_DecRefTotal(void);
+# define _Py_DEC_REFTOTAL() _Py_RefTotal--
+#endif
+
// Increment reference count by n
static inline void _Py_RefcntAdd(PyObject* op, Py_ssize_t n)
{
#ifdef Py_REF_DEBUG
- _Py_RefTotal += n;
+ _Py_AddRefTotal(n);
#endif
op->ob_refcnt += n;
}
@@ -52,7 +64,7 @@ _Py_DECREF_SPECIALIZED(PyObject *op, const destructor destruct)
{
_Py_DECREF_STAT_INC();
#ifdef Py_REF_DEBUG
- _Py_RefTotal--;
+ _Py_DEC_REFTOTAL();
#endif
if (--op->ob_refcnt != 0) {
assert(op->ob_refcnt > 0);
@@ -70,7 +82,7 @@ _Py_DECREF_NO_DEALLOC(PyObject *op)
{
_Py_DECREF_STAT_INC();
#ifdef Py_REF_DEBUG
- _Py_RefTotal--;
+ _Py_DEC_REFTOTAL();
#endif
op->ob_refcnt--;
#ifdef Py_DEBUG
@@ -80,6 +92,11 @@ _Py_DECREF_NO_DEALLOC(PyObject *op)
#endif
}
+#ifdef Py_REF_DEBUG
+# undef _Py_DEC_REFTOTAL
+#endif
+
+
PyAPI_FUNC(int) _PyType_CheckConsistency(PyTypeObject *type);
PyAPI_FUNC(int) _PyDict_CheckConsistency(PyObject *mp, int check_content);
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.