summaryrefslogtreecommitdiff
path: root/Cython/Includes/cpython/contextvars.pxd
diff options
context:
space:
mode:
Diffstat (limited to 'Cython/Includes/cpython/contextvars.pxd')
-rw-r--r--Cython/Includes/cpython/contextvars.pxd140
1 files changed, 140 insertions, 0 deletions
diff --git a/Cython/Includes/cpython/contextvars.pxd b/Cython/Includes/cpython/contextvars.pxd
new file mode 100644
index 000000000..aa8002664
--- /dev/null
+++ b/Cython/Includes/cpython/contextvars.pxd
@@ -0,0 +1,140 @@
+from cpython.object cimport PyObject
+from cpython.ref cimport Py_XDECREF
+
+cdef extern from "Python.h":
+ # Defining PyContextVar_Get() below to always return the default value for Py<3.7 and PyPy<7.3.6
+ # to make the inline functions sort-of work.
+ """
+ #if (PY_VERSION_HEX < 0x030700b1 || (CYTHON_COMPILING_IN_PYPY && PYPY_VERSION_NUM < 0x07030600)) && !defined(PyContextVar_Get)
+ #define PyContextVar_Get(var, d, v) \
+ ((d) ? \
+ ((void)(var), Py_INCREF(d), (v)[0] = (d), 0) : \
+ ((v)[0] = NULL, 0) \
+ )
+ #endif
+ """
+
+ ############################################################################
+ # Context Variables Objects
+ ############################################################################
+
+ # PyContext
+ # The C structure used to represent a `contextvars.Context` object.
+
+ # PyContextVar
+ # The C structure used to represent a `contextvars.ContextVar` object.
+
+ # PyContextToken
+ # The C structure used to represent a `contextvars.Token` object.
+
+ # PyTypeObject PyContext_Type
+ # Type object representing the `contextvars.Context` type.
+
+ # PyTypeObject PyContextVar_Type
+ # Type object representing the `contextvars.ContextVar` type.
+
+ # PyTypeObject PyContextToken_Type
+ # Type object representing the `contextvars.Token` type.
+
+ bint PyContext_CheckExact(object obj)
+ # Return `true` if `obj` is of type `PyContext_Type`.
+ # `obj` must not be NULL. This function always succeeds.
+
+ bint PyContextVar_CheckExact(object obj)
+ # Return `true` if `obj` is of type `PyContextVar_Type`.
+ # `obj` must not be NULL. This function always succeeds.
+
+ bint PyContextToken_CheckExact(object obj)
+ # Return `true` if `obj` is of type `PyContextToken_Type`.
+ # `obj` must not be NULL. This function always succeeds.
+
+ object PyContext_New()
+ # Return value: New reference.
+ # Create a new empty context object.
+ # Returns NULL if an error has occurred.
+
+ object PyContext_Copy(object ctx)
+ # Return value: New reference.
+ # Create a shallow copy of the passed `ctx` context object.
+ # Returns NULL if an error has occurred.
+
+ object PyContext_CopyCurrent()
+ # Return value: New reference.
+ # Create a shallow copy of the current thread context.
+ # Returns NULL if an error has occurred.
+
+ int PyContext_Enter(object ctx) except -1
+ # Set `ctx` as the current context for the current thread.
+ # Returns 0 on success, and -1 on error.
+
+ int PyContext_Exit(object ctx) except -1
+ # 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.
+
+ object PyContextVar_New(const char* name, PyObject* default_value)
+ # Return value: New reference.
+ # Create a new ContextVar object. The `name` parameter is used
+ # for introspection and debug purposes. The `default_value` parameter
+ # may optionally specify the default value for the context variable.
+ # If an error has occurred, this function returns NULL.
+
+ object PyContextVar_New_with_default "PyContextVar_New" (const char* name, object default_value)
+ # A different declaration of PyContextVar_New that requires a default value
+ # to be passed on call.
+
+ int PyContextVar_Get(object var, PyObject* default_value, PyObject** value) except -1
+ # 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
+ int PyContextVar_Get_with_default "PyContextVar_Get" (object var, object default_value, PyObject** value) except -1
+ # A different declaration of PyContextVar_Get that requires a default value
+ # to be passed on call.
+
+ object PyContextVar_Set(object var, object value)
+ # Return value: New reference.
+ # Set the value of `var` to `value` in the current context.
+ # Returns a token object for this value change, or NULL if an error has occurred.
+
+ int PyContextVar_Reset(object var, object token) except -1
+ # Reset the state of the `var` context variable to that it was in
+ # before `PyContextVar_Set()` that returned `token` was called.
+ # This function returns 0 on success and -1 on error.
+
+
+cdef inline object get_value(var, default_value=None):
+ """Return a new reference to the value of the context variable,
+ or the default value of the context variable,
+ or None if no such value or default was found.
+ """
+ cdef PyObject *value = NULL
+ PyContextVar_Get(var, NULL, &value)
+ if value is NULL:
+ # context variable does not have a default
+ pyvalue = default_value
+ else:
+ # value or default value of context variable
+ pyvalue = <object>value
+ Py_XDECREF(value) # PyContextVar_Get() returned an owned reference as 'PyObject*'
+ return pyvalue
+
+
+cdef inline object get_value_no_default(var, default_value=None):
+ """Return a new reference to the value of the context variable,
+ or the provided default value if no such value was found.
+
+ Ignores the default value of the context variable, if any.
+ """
+ cdef PyObject *value = NULL
+ PyContextVar_Get(var, <PyObject*>default_value, &value)
+ # value of context variable or 'default_value'
+ pyvalue = <object>value
+ Py_XDECREF(value) # PyContextVar_Get() returned an owned reference as 'PyObject*'
+ return pyvalue