Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bpo-33592: Document the C API in PEP 567 (contextvars) #7033

Merged
merged 1 commit into from
May 22, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Doc/c-api/concrete.rst
Original file line number Diff line number Diff line change
Expand Up @@ -113,5 +113,5 @@ Other Objects
capsule.rst
gen.rst
coro.rst
contextvars.rst
datetime.rst

125 changes: 125 additions & 0 deletions Doc/c-api/contextvars.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
.. highlightlang:: c

.. _contextvarsobjects:

Context Variables Objects
-------------------------

.. versionadded:: 3.7

This section details the public C API for the :mod:`contextvars` module.

.. c:type:: PyContext

The C structure used to represent a :class:`contextvars.Context`
object.

.. c:type:: PyContextVar

The C structure used to represent a :class:`contextvars.ContextVar`
object.

.. c:type:: PyContextToken

The C structure used to represent a :class:`contextvars.Token` object.

.. c:var:: PyTypeObject PyContext_Type

The type object representing the *context* type.

.. c:var:: PyTypeObject PyContextVar_Type

The type object representing the *context variable* type.

.. c:var:: PyTypeObject PyContextToken_Type

The type object representing the *context variable token* type.


Type-check macros:

.. c:function:: int PyContext_CheckExact(PyObject *o)

Return true if *o* is of type :c:data:`PyContext_Type`. *o* must not be
*NULL*. This function always succeeds.

.. c:function:: int PyContextVar_CheckExact(PyObject *o)

Return true if *o* is of type :c:data:`PyContextVar_Type`. *o* must not be
*NULL*. This function always succeeds.

.. c:function:: int PyContextToken_CheckExact(PyObject *o)

Return true if *o* is of type :c:data:`PyContextToken_Type`.
*o* must not be *NULL*. This function always succeeds.


Context object management functions:

.. c:function:: PyContext *PyContext_New(void)

Create a new empty context object. Returns ``NULL`` if an error
has occurred.

.. c:function:: PyContext *PyContext_Copy(PyContext *ctx)

Create a shallow copy of the passed *ctx* context object.
Returns ``NULL`` if an error has occurred.

.. c:function:: PyContext *PyContext_CopyCurrent(void)

Create a shallow copy of the current thread context.
Returns ``NULL`` if an error has occurred.

.. c:function:: int PyContext_Enter(PyContext *ctx)

Set *ctx* as the current context for the current thread.
Returns ``0`` on success, and ``-1`` on error.

.. c:function:: int PyContext_Exit(PyContext *ctx)

Deactivate the *ctx* context and restore the previous context as the
current context for the current thread. Returns ``0`` on success,
and ``-1`` on error.

.. c:function:: int PyContext_ClearFreeList()

Clear the context variable free list. Return the total number of
freed items. This function always succeeds.


Context variable functions:

.. c:function:: PyContextVar *PyContextVar_New(const char *name, PyObject *def)

Create a new ``ContextVar`` object. The *name* parameter is used
for introspection and debug purposes. The *def* parameter may optionally
specify the default value for the context variable. If an error has
occurred, this function returns ``NULL``.

.. c:function:: int PyContextVar_Get(PyContextVar *var, PyObject *default_value, PyObject **value)

Get the value of a context variable. Returns ``-1`` if an error has
occurred during lookup, and ``0`` if no error occurred, whether or not
a value was found.

If the context variable was found, *value* will be a pointer to it.
If the context variable was *not* found, *value* will point to:

- *default_value*, if not ``NULL``;
- the default value of *var*, if not ``NULL``;
- ``NULL``

If the value was found, the function will create a new reference to it.

.. c:function:: PyContextToken *PyContextVar_Set(PyContextVar *var, PyObject *value)

Set the value of *var* to *value* in the current context. Returns a
pointer to a :c:type:`PyContextToken` object, or ``NULL`` if an error
has occurred.

.. c:function:: int PyContextVar_Reset(PyContextVar *var, PyContextToken *token)

Reset the state of the *var* context variable to that it was in before
:c:func:`PyContextVar_Set` that returned the *token* was called.
This function returns ``0`` on success and ``-1`` on error.
6 changes: 5 additions & 1 deletion Doc/whatsnew/3.7.rst
Original file line number Diff line number Diff line change
Expand Up @@ -515,7 +515,8 @@ New Modules
contextvars
-----------

The new :mod:`contextvars` module and a set of new C APIs introduce
The new :mod:`contextvars` module and a set of
:ref:`new C APIs <contextvarsobjects>` introduce
support for *context variables*. Context variables are conceptually
similar to thread-local variables. Unlike TLS, context variables
support asynchronous code correctly.
Expand Down Expand Up @@ -1543,6 +1544,9 @@ A new API for thread-local storage has been implemented. See
:ref:`thread-specific-storage-api` for a complete reference.
(Contributed by Masayuki Yamamoto in :issue:`25658`.)

The new :ref:`context variables <whatsnew37-pep567>` functionality
exposes a number of :ref:`new C APIs <contextvarsobjects>`.

The new :c:func:`PyImport_GetModule` function returns the previously
imported module with the given name.
(Contributed by Eric Snow in :issue:`28411`.)
Expand Down