summaryrefslogtreecommitdiffstats
path: root/Doc/c-api/refcounting.rst
diff options
context:
space:
mode:
Diffstat (limited to 'Doc/c-api/refcounting.rst')
-rw-r--r--Doc/c-api/refcounting.rst74
1 files changed, 74 insertions, 0 deletions
diff --git a/Doc/c-api/refcounting.rst b/Doc/c-api/refcounting.rst
new file mode 100644
index 0000000..9dc357f
--- /dev/null
+++ b/Doc/c-api/refcounting.rst
@@ -0,0 +1,74 @@
+.. highlightlang:: c
+
+
+.. _countingrefs:
+
+******************
+Reference Counting
+******************
+
+The macros in this section are used for managing reference counts of Python
+objects.
+
+
+.. cfunction:: void Py_INCREF(PyObject *o)
+
+ Increment the reference count for object *o*. The object must not be *NULL*; if
+ you aren't sure that it isn't *NULL*, use :cfunc:`Py_XINCREF`.
+
+
+.. cfunction:: void Py_XINCREF(PyObject *o)
+
+ Increment the reference count for object *o*. The object may be *NULL*, in
+ which case the macro has no effect.
+
+
+.. cfunction:: void Py_DECREF(PyObject *o)
+
+ Decrement the reference count for object *o*. The object must not be *NULL*; if
+ you aren't sure that it isn't *NULL*, use :cfunc:`Py_XDECREF`. If the reference
+ count reaches zero, the object's type's deallocation function (which must not be
+ *NULL*) is invoked.
+
+ .. warning::
+
+ The deallocation function can cause arbitrary Python code to be invoked (e.g.
+ when a class instance with a :meth:`__del__` method is deallocated). While
+ exceptions in such code are not propagated, the executed code has free access to
+ all Python global variables. This means that any object that is reachable from
+ a global variable should be in a consistent state before :cfunc:`Py_DECREF` is
+ invoked. For example, code to delete an object from a list should copy a
+ reference to the deleted object in a temporary variable, update the list data
+ structure, and then call :cfunc:`Py_DECREF` for the temporary variable.
+
+
+.. cfunction:: void Py_XDECREF(PyObject *o)
+
+ Decrement the reference count for object *o*. The object may be *NULL*, in
+ which case the macro has no effect; otherwise the effect is the same as for
+ :cfunc:`Py_DECREF`, and the same warning applies.
+
+
+.. cfunction:: void Py_CLEAR(PyObject *o)
+
+ Decrement the reference count for object *o*. The object may be *NULL*, in
+ which case the macro has no effect; otherwise the effect is the same as for
+ :cfunc:`Py_DECREF`, except that the argument is also set to *NULL*. The warning
+ for :cfunc:`Py_DECREF` does not apply with respect to the object passed because
+ the macro carefully uses a temporary variable and sets the argument to *NULL*
+ before decrementing its reference count.
+
+ It is a good idea to use this macro whenever decrementing the value of a
+ variable that might be traversed during garbage collection.
+
+ .. versionadded:: 2.4
+
+The following functions are for runtime dynamic embedding of Python:
+``Py_IncRef(PyObject \*o)``, `Py_DecRef(PyObject \*o)``. They are
+simply exported function versions of :cfunc:`Py_XINCREF` and
+:cfunc:`Py_XDECREF`, respectively.
+
+The following functions or macros are only for use within the interpreter core:
+:cfunc:`_Py_Dealloc`, :cfunc:`_Py_ForgetReference`, :cfunc:`_Py_NewReference`,
+as well as the global variable :cdata:`_Py_RefTotal`.
+