gh-146636: Add Free-threaded Stable ABI migration guide#150580
gh-146636: Add Free-threaded Stable ABI migration guide#150580encukou wants to merge 22 commits into
Conversation
This document provides detailed instructions on how to use the Free Threading Stable ABI in CPython, including guidelines for module initialization, API usage, and thread safety considerations.
Clarified access restrictions on PyObject members and recommended functions for type and reference count manipulation.
Clarified that direct access to PyObject members is prohibited.
Updated documentation to clarify the identification of free-threaded limited API builds in C, including changes to macros and initialization methods.
Updated the documentation to clarify the use of the stable ABI and GIL management in Python extensions, including changes to member access and initialization methods.
Removed sections on API guidelines, critical sections, and thread safety from the documentation.
Documentation build overview
|
| ======= | ||
|
|
||
| Note that when you build an extension compatible with multiple versions of | ||
| CPython, you should always *test* it witch each version it supports (for |
There was a problem hiding this comment.
| CPython, you should always *test* it witch each version it supports (for | |
| CPython, you should always *test* it with each version it supports (for |
|
Thanks, this looks great! I'll probably use the tables in my EuroPython talk. I'm hopeful that we'll be able to ship abi3t support in the next releases of PyO3 and Maturin (see PyO3/pyo3#5807 and PyO3/maturin#3113). I am also planning to add a section to the free-threaded guide about building abi3t extensions, including practicalities like dealing with bindings generators and the NumPy C API. When that is ready, maybe we can just link there for all the ecosystem-wide details that don't belong in the CPython docs? |
| +-----------------+-------------------+------------------+ | ||
| | 3.16 | ``cpython-316`` | ``cpython-316t`` | | ||
| +-----------------+-------------------+------------------+ | ||
| | Future versions | (etc.) | (etc.) | |
There was a problem hiding this comment.
| | Future versions | (etc.) | (etc.) | | |
| | Future versions | ``cpython-X`` | ``cpython-Xt`` | |
I suggest this to avoid the Latin abbreviation, which per the devguide we discourage.
| +-----------------+ +------------------+ | ||
| | 3.16 | | ``cpython-316t`` | | ||
| +-----------------+ +------------------+ | ||
| | Future versions | | (etc.) | |
There was a problem hiding this comment.
| | Future versions | | (etc.) | | |
| | Future versions | | ``cpython-Xt`` | |
Ditto.
| resulting extension manually as well. | ||
| This is covered in :ref:`abi3t-migration-tagging` below. | ||
|
|
||
| This guide will ask you to do a series of changes. |
There was a problem hiding this comment.
| This guide will ask you to do a series of changes. | |
| This guide will ask you to make a series of changes. |
| Unless you've done this step already, your extension module defines a | ||
| :ref:`module initialization function <extension-pyinit>` | ||
| named :samp:`PyInit_{<module_name>}`. | ||
| You will need to port it to :ref:`module export hook <extension-export-hook>`, |
There was a problem hiding this comment.
| You will need to port it to :ref:`module export hook <extension-export-hook>`, | |
| You will need to port it to a :ref:`module export hook <extension-export-hook>`, |
|
|
||
| If there is some code before the ``return``, move it to | ||
| a :c:macro:`Py_mod_create` or :c:macro:`Py_mod_exec` slot function. | ||
| See :ref:`PyInit documentation <extension-pyinit>` for related information. |
There was a problem hiding this comment.
| See :ref:`PyInit documentation <extension-pyinit>` for related information. | |
| See the :ref:`PyInit documentation <extension-pyinit>` for related information. |
| Leave out any fields that were missing (excexpt the new :c:macro:`Py_mod_abi`), | ||
| and substitute your own values. | ||
|
|
||
| See :c:type:`PySlot` and :c:ref:`export hook <extension-export-hook>` |
There was a problem hiding this comment.
| See :c:type:`PySlot` and :c:ref:`export hook <extension-export-hook>` | |
| See the :c:type:`PySlot` and :c:ref:`export hook <extension-export-hook>` |
| - :c:func:`PyType_GetModuleByDef` | ||
|
|
||
| Check your code for these. | ||
| If you do not use them, you skip the rest of this section. |
There was a problem hiding this comment.
| If you do not use them, you skip the rest of this section. | |
| If you do not use them, you can skip this section. |
| if (PyModule_GetToken(module, &token) < 0) { | ||
| /* handle error */ |
There was a problem hiding this comment.
| if (PyModule_GetToken(module, &token) < 0) { | |
| /* handle error */ | |
| if (PyModule_GetToken(module, &token) < 0) { | |
| /* handle error */ |
Hmm, the devguide actually doesn’t specify PEP 7/8 for code examples.
| changes extensions may need. | ||
|
|
||
| If you find a problem that other extension authors might run into, | ||
| consider submitting an issue (or pull request) for this guide. |
There was a problem hiding this comment.
Maybe add a link to https://docs.python.org/3/bugs.html?
Uh oh!
There was an error while loading. Please reload this page.