From 3b265787f253b84598a0453fc2ff3fa25f3d5acf Mon Sep 17 00:00:00 2001 From: Bruce Merry Date: Fri, 24 Nov 2017 16:19:45 +0200 Subject: [PATCH] Document using atexit for module destructors on PyPy (#1169) None of the three currently recommended approaches works on PyPy, due to it not garbage collecting things when you want it to. Added a note with example showing how to get interpreter shutdown callbacks using the Python atexit module. --- docs/advanced/misc.rst | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/docs/advanced/misc.rst b/docs/advanced/misc.rst index 87481ba32..5faf11f0d 100644 --- a/docs/advanced/misc.rst +++ b/docs/advanced/misc.rst @@ -216,6 +216,21 @@ avoids this issue involves weak reference with a cleanup callback: // Create a weak reference with a cleanup callback and initially leak it (void) py::weakref(m.attr("BaseClass"), cleanup_callback).release(); +.. note:: + + PyPy (at least version 5.9) does not garbage collect objects when the + interpreter exits. An alternative approach (which also works on CPython) is to use + the :py:mod:`atexit` module [#f7]_, for example: + + .. code-block:: cpp + + auto atexit = py::module::import("atexit"); + atexit.attr("register")(py::cpp_function([]() { + // perform cleanup here -- this function is called with the GIL held + })); + + .. [#f7] https://docs.python.org/3/library/atexit.html + Generating documentation using Sphinx =====================================