#define _Py_CRITICAL_SECTION_MASK 0x3
#ifdef Py_GIL_DISABLED
-# define Py_BEGIN_CRITICAL_SECTION(op) \
+# define Py_BEGIN_CRITICAL_SECTION_MUT(mutex) \
{ \
_PyCriticalSection _cs; \
- _PyCriticalSection_Begin(&_cs, &_PyObject_CAST(op)->ob_mutex)
+ _PyCriticalSection_Begin(&_cs, mutex)
+
+# define Py_BEGIN_CRITICAL_SECTION(op) \
+ Py_BEGIN_CRITICAL_SECTION_MUT(&_PyObject_CAST(op)->ob_mutex)
# define Py_END_CRITICAL_SECTION() \
_PyCriticalSection_End(&_cs); \
#else /* !Py_GIL_DISABLED */
// The critical section APIs are no-ops with the GIL.
+# define Py_BEGIN_CRITICAL_SECTION_MUT(mut)
# define Py_BEGIN_CRITICAL_SECTION(op)
# define Py_END_CRITICAL_SECTION()
# define Py_XBEGIN_CRITICAL_SECTION(op)
#include "Python.h"
+#include "pycore_critical_section.h" // Py_BEGIN_CRITICAL_SECTION_MUT()
#include "pycore_interp.h" // PyInterpreterState.warnings
#include "pycore_long.h" // _PyLong_GetZero()
#include "pycore_pyerrors.h" // _PyErr_Occurred()
static PyObject *
get_once_registry(PyInterpreterState *interp)
{
- PyObject *registry;
-
WarningsState *st = warnings_get_state(interp);
- if (st == NULL) {
- return NULL;
- }
+ assert(st != NULL);
+
+ _Py_CRITICAL_SECTION_ASSERT_MUTEX_LOCKED(&st->mutex);
- registry = GET_WARNINGS_ATTR(interp, onceregistry, 0);
+ PyObject *registry = GET_WARNINGS_ATTR(interp, onceregistry, 0);
if (registry == NULL) {
if (PyErr_Occurred())
return NULL;
static PyObject *
get_default_action(PyInterpreterState *interp)
{
- PyObject *default_action;
-
WarningsState *st = warnings_get_state(interp);
- if (st == NULL) {
- return NULL;
- }
+ assert(st != NULL);
- default_action = GET_WARNINGS_ATTR(interp, defaultaction, 0);
+ _Py_CRITICAL_SECTION_ASSERT_MUTEX_LOCKED(&st->mutex);
+
+ PyObject *default_action = GET_WARNINGS_ATTR(interp, defaultaction, 0);
if (default_action == NULL) {
if (PyErr_Occurred()) {
return NULL;
PyObject *text, Py_ssize_t lineno,
PyObject *module, PyObject **item)
{
- PyObject *action;
- Py_ssize_t i;
- PyObject *warnings_filters;
WarningsState *st = warnings_get_state(interp);
- if (st == NULL) {
- return NULL;
- }
+ assert(st != NULL);
- warnings_filters = GET_WARNINGS_ATTR(interp, filters, 0);
+ _Py_CRITICAL_SECTION_ASSERT_MUTEX_LOCKED(&st->mutex);
+
+ PyObject *warnings_filters = GET_WARNINGS_ATTR(interp, filters, 0);
if (warnings_filters == NULL) {
if (PyErr_Occurred())
return NULL;
}
/* WarningsState.filters could change while we are iterating over it. */
- for (i = 0; i < PyList_GET_SIZE(filters); i++) {
+ for (Py_ssize_t i = 0; i < PyList_GET_SIZE(filters); i++) {
PyObject *tmp_item, *action, *msg, *cat, *mod, *ln_obj;
Py_ssize_t ln;
int is_subclass, good_msg, good_mod;
Py_DECREF(tmp_item);
}
- action = get_default_action(interp);
+ PyObject *action = get_default_action(interp);
if (action != NULL) {
*item = Py_NewRef(Py_None);
return action;
&filename, &lineno, &module, ®istry))
return NULL;
+ WarningsState *st = warnings_get_state(tstate->interp);
+ assert(st != NULL);
+
+ Py_BEGIN_CRITICAL_SECTION_MUT(&st->mutex);
res = warn_explicit(tstate, category, message, filename, lineno, module, registry,
NULL, source);
+ Py_END_CRITICAL_SECTION();
Py_DECREF(filename);
Py_DECREF(registry);
Py_DECREF(module);
return NULL;
}
}
+
+ WarningsState *st = warnings_get_state(tstate->interp);
+ assert(st != NULL);
+
+ Py_BEGIN_CRITICAL_SECTION_MUT(&st->mutex);
returned = warn_explicit(tstate, category, message, filename, lineno,
mod, registry, source_line, sourceobj);
+ Py_END_CRITICAL_SECTION();
Py_XDECREF(source_line);
return returned;
}
if (tstate == NULL) {
return -1;
}
+
+ WarningsState *st = warnings_get_state(tstate->interp);
+ assert(st != NULL);
+
+ Py_BEGIN_CRITICAL_SECTION_MUT(&st->mutex);
res = warn_explicit(tstate, category, message, filename, lineno,
module, registry, NULL, NULL);
+ Py_END_CRITICAL_SECTION();
if (res == NULL)
return -1;
Py_DECREF(res);
PyObject *res;
PyThreadState *tstate = get_current_tstate();
if (tstate != NULL) {
+ WarningsState *st = warnings_get_state(tstate->interp);
+ assert(st != NULL);
+
+ Py_BEGIN_CRITICAL_SECTION_MUT(&st->mutex);
res = warn_explicit(tstate, category, message, filename, lineno,
module, registry, NULL, NULL);
+ Py_END_CRITICAL_SECTION();
Py_DECREF(message);
if (res != NULL) {
Py_DECREF(res);