summaryrefslogtreecommitdiffstats
path: root/Python/_warnings.c
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@redhat.com>2019-04-26 03:49:26 (GMT)
committerGitHub <noreply@github.com>2019-04-26 03:49:26 (GMT)
commit87d23a041d9efb743c5680ac23305ddddf300e51 (patch)
treef029bae963de4672d511759bd88e84d3a64544eb /Python/_warnings.c
parent99e69d44f499625786a2e6461a954adcd0037d69 (diff)
downloadcpython-87d23a041d9efb743c5680ac23305ddddf300e51.zip
cpython-87d23a041d9efb743c5680ac23305ddddf300e51.tar.gz
cpython-87d23a041d9efb743c5680ac23305ddddf300e51.tar.bz2
bpo-36724: Add _PyWarnings_Fini() (#12963)
Py_FinalizeEx() now clears _PyRuntime.warnings variables and _PyRuntime.exitfuncs. Changes: * Add _PyWarnings_Fini(): called by Py_FinalizeEx() * call_ll_exitfuncs() now clears _PyRuntime.exitfuncs while iterating on it (on backward order).
Diffstat (limited to 'Python/_warnings.c')
-rw-r--r--Python/_warnings.c43
1 files changed, 27 insertions, 16 deletions
diff --git a/Python/_warnings.c b/Python/_warnings.c
index 33b4615..388b299 100644
--- a/Python/_warnings.c
+++ b/Python/_warnings.c
@@ -1259,35 +1259,46 @@ _PyWarnings_Init(void)
if (m == NULL)
return NULL;
- if (_PyRuntime.warnings.filters == NULL) {
- _PyRuntime.warnings.filters = init_filters();
- if (_PyRuntime.warnings.filters == NULL)
+ struct _warnings_runtime_state *state = &_PyRuntime.warnings;
+ if (state->filters == NULL) {
+ state->filters = init_filters();
+ if (state->filters == NULL)
return NULL;
}
- Py_INCREF(_PyRuntime.warnings.filters);
- if (PyModule_AddObject(m, "filters", _PyRuntime.warnings.filters) < 0)
+ Py_INCREF(state->filters);
+ if (PyModule_AddObject(m, "filters", state->filters) < 0)
return NULL;
- if (_PyRuntime.warnings.once_registry == NULL) {
- _PyRuntime.warnings.once_registry = PyDict_New();
- if (_PyRuntime.warnings.once_registry == NULL)
+ if (state->once_registry == NULL) {
+ state->once_registry = PyDict_New();
+ if (state->once_registry == NULL)
return NULL;
}
- Py_INCREF(_PyRuntime.warnings.once_registry);
+ Py_INCREF(state->once_registry);
if (PyModule_AddObject(m, "_onceregistry",
- _PyRuntime.warnings.once_registry) < 0)
+ state->once_registry) < 0)
return NULL;
- if (_PyRuntime.warnings.default_action == NULL) {
- _PyRuntime.warnings.default_action = PyUnicode_FromString("default");
- if (_PyRuntime.warnings.default_action == NULL)
+ if (state->default_action == NULL) {
+ state->default_action = PyUnicode_FromString("default");
+ if (state->default_action == NULL)
return NULL;
}
- Py_INCREF(_PyRuntime.warnings.default_action);
+ Py_INCREF(state->default_action);
if (PyModule_AddObject(m, "_defaultaction",
- _PyRuntime.warnings.default_action) < 0)
+ state->default_action) < 0)
return NULL;
- _PyRuntime.warnings.filters_version = 0;
+ state->filters_version = 0;
return m;
}
+
+
+void
+_PyWarnings_Fini(_PyRuntimeState *runtime)
+{
+ struct _warnings_runtime_state *state = &runtime->warnings;
+ Py_CLEAR(state->filters);
+ Py_CLEAR(state->once_registry);
+ Py_CLEAR(state->default_action);
+}