Skip to content

Commit

Permalink
bpo-39778: Add clarification about tp_traverse and ownership (GH-18754)
Browse files Browse the repository at this point in the history
Automerge-Triggered-By: @pablogsal
(cherry picked from commit 6df421f)

Co-authored-by: Pablo Galindo <Pablogsal@gmail.com>
  • Loading branch information
miss-islington and pablogsal committed Mar 3, 2020
1 parent 394dc0d commit 1827fc3
Showing 1 changed file with 13 additions and 1 deletion.
14 changes: 13 additions & 1 deletion Doc/c-api/typeobj.rst
Expand Up @@ -1218,7 +1218,7 @@ and :c:type:`PyType_Type` effectively act as defaults.)
The :c:member:`~PyTypeObject.tp_traverse` pointer is used by the garbage collector to detect
reference cycles. A typical implementation of a :c:member:`~PyTypeObject.tp_traverse` function
simply calls :c:func:`Py_VISIT` on each of the instance's members that are Python
objects. For example, this is function :c:func:`local_traverse` from the
objects that the instance owns. For example, this is function :c:func:`local_traverse` from the
:mod:`_thread` extension module::

static int
Expand All @@ -1238,6 +1238,18 @@ and :c:type:`PyType_Type` effectively act as defaults.)
debugging aid you may want to visit it anyway just so the :mod:`gc` module's
:func:`~gc.get_referents` function will include it.

.. warning::
When implementing :c:member:`~PyTypeObject.tp_traverse`, only the members
that the instance *owns* (by having strong references to them) must be
visited. For instance, if an object supports weak references via the
:c:member:`~PyTypeObject.tp_weaklist` slot, the pointer supporting
the linked list (what *tp_weaklist* points to) must **not** be
visited as the instance does not directly own the weak references to itself
(the weakreference list is there to support the weak reference machinery,
but the instance has no strong reference to the elements inside it, as they
are allowed to be removed even if the instance is still alive).


Note that :c:func:`Py_VISIT` requires the *visit* and *arg* parameters to
:c:func:`local_traverse` to have these specific names; don't name them just
anything.
Expand Down

0 comments on commit 1827fc3

Please sign in to comment.