mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
gh-128384: Use a context variable for warnings.catch_warnings (gh-130010)
Make `warnings.catch_warnings()` use a context variable for holding the warning filtering state if the `sys.flags.context_aware_warnings` flag is set to true. This makes using the context manager thread-safe in multi-threaded programs. Add the `sys.flags.thread_inherit_context` flag. If true, starting a new thread with `threading.Thread` will use a copy of the context from the caller of `Thread.start()`. Both these flags are set to true by default for the free-threaded build and false for the default build. Move the Python implementation of warnings.py into _py_warnings.py. Make _contextvars a builtin module. Co-authored-by: Kumar Aditya <kumaraditya@python.org>
This commit is contained in:
parent
e5237541a0
commit
d687900f98
41 changed files with 1851 additions and 960 deletions
68
Python/_contextvars.c
Normal file
68
Python/_contextvars.c
Normal file
|
@ -0,0 +1,68 @@
|
|||
#include "Python.h"
|
||||
|
||||
#include "clinic/_contextvars.c.h"
|
||||
|
||||
/*[clinic input]
|
||||
module _contextvars
|
||||
[clinic start generated code]*/
|
||||
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=a0955718c8b8cea6]*/
|
||||
|
||||
|
||||
/*[clinic input]
|
||||
_contextvars.copy_context
|
||||
[clinic start generated code]*/
|
||||
|
||||
static PyObject *
|
||||
_contextvars_copy_context_impl(PyObject *module)
|
||||
/*[clinic end generated code: output=1fcd5da7225c4fa9 input=89bb9ae485888440]*/
|
||||
{
|
||||
return PyContext_CopyCurrent();
|
||||
}
|
||||
|
||||
|
||||
PyDoc_STRVAR(module_doc, "Context Variables");
|
||||
|
||||
static PyMethodDef _contextvars_methods[] = {
|
||||
_CONTEXTVARS_COPY_CONTEXT_METHODDEF
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
static int
|
||||
_contextvars_exec(PyObject *m)
|
||||
{
|
||||
if (PyModule_AddType(m, &PyContext_Type) < 0) {
|
||||
return -1;
|
||||
}
|
||||
if (PyModule_AddType(m, &PyContextVar_Type) < 0) {
|
||||
return -1;
|
||||
}
|
||||
if (PyModule_AddType(m, &PyContextToken_Type) < 0) {
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct PyModuleDef_Slot _contextvars_slots[] = {
|
||||
{Py_mod_exec, _contextvars_exec},
|
||||
{Py_mod_multiple_interpreters, Py_MOD_PER_INTERPRETER_GIL_SUPPORTED},
|
||||
{Py_mod_gil, Py_MOD_GIL_NOT_USED},
|
||||
{0, NULL}
|
||||
};
|
||||
|
||||
static struct PyModuleDef _contextvarsmodule = {
|
||||
PyModuleDef_HEAD_INIT, /* m_base */
|
||||
"_contextvars", /* m_name */
|
||||
module_doc, /* m_doc */
|
||||
0, /* m_size */
|
||||
_contextvars_methods, /* m_methods */
|
||||
_contextvars_slots, /* m_slots */
|
||||
NULL, /* m_traverse */
|
||||
NULL, /* m_clear */
|
||||
NULL, /* m_free */
|
||||
};
|
||||
|
||||
PyMODINIT_FUNC
|
||||
PyInit__contextvars(void)
|
||||
{
|
||||
return PyModuleDef_Init(&_contextvarsmodule);
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue