mirror of
https://github.com/python/cpython.git
synced 2025-11-02 03:01:58 +00:00
gh-111965: Using critical sections to make `io.StringIO` thread safe. (gh-112116)
This commit is contained in:
parent
a6d25de375
commit
77d9f1e6d9
2 changed files with 194 additions and 30 deletions
120
Modules/_io/clinic/stringio.c.h
generated
120
Modules/_io/clinic/stringio.c.h
generated
|
|
@ -7,6 +7,7 @@ preserve
|
|||
# include "pycore_runtime.h" // _Py_ID()
|
||||
#endif
|
||||
#include "pycore_abstract.h" // _Py_convert_optional_to_ssize_t()
|
||||
#include "pycore_critical_section.h"// Py_BEGIN_CRITICAL_SECTION()
|
||||
#include "pycore_modsupport.h" // _PyArg_CheckPositional()
|
||||
|
||||
PyDoc_STRVAR(_io_StringIO_getvalue__doc__,
|
||||
|
|
@ -24,7 +25,13 @@ _io_StringIO_getvalue_impl(stringio *self);
|
|||
static PyObject *
|
||||
_io_StringIO_getvalue(stringio *self, PyObject *Py_UNUSED(ignored))
|
||||
{
|
||||
return _io_StringIO_getvalue_impl(self);
|
||||
PyObject *return_value = NULL;
|
||||
|
||||
Py_BEGIN_CRITICAL_SECTION(self);
|
||||
return_value = _io_StringIO_getvalue_impl(self);
|
||||
Py_END_CRITICAL_SECTION();
|
||||
|
||||
return return_value;
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(_io_StringIO_tell__doc__,
|
||||
|
|
@ -42,7 +49,13 @@ _io_StringIO_tell_impl(stringio *self);
|
|||
static PyObject *
|
||||
_io_StringIO_tell(stringio *self, PyObject *Py_UNUSED(ignored))
|
||||
{
|
||||
return _io_StringIO_tell_impl(self);
|
||||
PyObject *return_value = NULL;
|
||||
|
||||
Py_BEGIN_CRITICAL_SECTION(self);
|
||||
return_value = _io_StringIO_tell_impl(self);
|
||||
Py_END_CRITICAL_SECTION();
|
||||
|
||||
return return_value;
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(_io_StringIO_read__doc__,
|
||||
|
|
@ -76,7 +89,9 @@ _io_StringIO_read(stringio *self, PyObject *const *args, Py_ssize_t nargs)
|
|||
goto exit;
|
||||
}
|
||||
skip_optional:
|
||||
Py_BEGIN_CRITICAL_SECTION(self);
|
||||
return_value = _io_StringIO_read_impl(self, size);
|
||||
Py_END_CRITICAL_SECTION();
|
||||
|
||||
exit:
|
||||
return return_value;
|
||||
|
|
@ -112,7 +127,9 @@ _io_StringIO_readline(stringio *self, PyObject *const *args, Py_ssize_t nargs)
|
|||
goto exit;
|
||||
}
|
||||
skip_optional:
|
||||
Py_BEGIN_CRITICAL_SECTION(self);
|
||||
return_value = _io_StringIO_readline_impl(self, size);
|
||||
Py_END_CRITICAL_SECTION();
|
||||
|
||||
exit:
|
||||
return return_value;
|
||||
|
|
@ -150,7 +167,9 @@ _io_StringIO_truncate(stringio *self, PyObject *const *args, Py_ssize_t nargs)
|
|||
goto exit;
|
||||
}
|
||||
skip_optional:
|
||||
Py_BEGIN_CRITICAL_SECTION(self);
|
||||
return_value = _io_StringIO_truncate_impl(self, size);
|
||||
Py_END_CRITICAL_SECTION();
|
||||
|
||||
exit:
|
||||
return return_value;
|
||||
|
|
@ -204,7 +223,9 @@ _io_StringIO_seek(stringio *self, PyObject *const *args, Py_ssize_t nargs)
|
|||
goto exit;
|
||||
}
|
||||
skip_optional:
|
||||
Py_BEGIN_CRITICAL_SECTION(self);
|
||||
return_value = _io_StringIO_seek_impl(self, pos, whence);
|
||||
Py_END_CRITICAL_SECTION();
|
||||
|
||||
exit:
|
||||
return return_value;
|
||||
|
|
@ -222,6 +243,21 @@ PyDoc_STRVAR(_io_StringIO_write__doc__,
|
|||
#define _IO_STRINGIO_WRITE_METHODDEF \
|
||||
{"write", (PyCFunction)_io_StringIO_write, METH_O, _io_StringIO_write__doc__},
|
||||
|
||||
static PyObject *
|
||||
_io_StringIO_write_impl(stringio *self, PyObject *obj);
|
||||
|
||||
static PyObject *
|
||||
_io_StringIO_write(stringio *self, PyObject *obj)
|
||||
{
|
||||
PyObject *return_value = NULL;
|
||||
|
||||
Py_BEGIN_CRITICAL_SECTION(self);
|
||||
return_value = _io_StringIO_write_impl(self, obj);
|
||||
Py_END_CRITICAL_SECTION();
|
||||
|
||||
return return_value;
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(_io_StringIO_close__doc__,
|
||||
"close($self, /)\n"
|
||||
"--\n"
|
||||
|
|
@ -242,7 +278,13 @@ _io_StringIO_close_impl(stringio *self);
|
|||
static PyObject *
|
||||
_io_StringIO_close(stringio *self, PyObject *Py_UNUSED(ignored))
|
||||
{
|
||||
return _io_StringIO_close_impl(self);
|
||||
PyObject *return_value = NULL;
|
||||
|
||||
Py_BEGIN_CRITICAL_SECTION(self);
|
||||
return_value = _io_StringIO_close_impl(self);
|
||||
Py_END_CRITICAL_SECTION();
|
||||
|
||||
return return_value;
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(_io_StringIO___init____doc__,
|
||||
|
|
@ -330,7 +372,13 @@ _io_StringIO_readable_impl(stringio *self);
|
|||
static PyObject *
|
||||
_io_StringIO_readable(stringio *self, PyObject *Py_UNUSED(ignored))
|
||||
{
|
||||
return _io_StringIO_readable_impl(self);
|
||||
PyObject *return_value = NULL;
|
||||
|
||||
Py_BEGIN_CRITICAL_SECTION(self);
|
||||
return_value = _io_StringIO_readable_impl(self);
|
||||
Py_END_CRITICAL_SECTION();
|
||||
|
||||
return return_value;
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(_io_StringIO_writable__doc__,
|
||||
|
|
@ -348,7 +396,13 @@ _io_StringIO_writable_impl(stringio *self);
|
|||
static PyObject *
|
||||
_io_StringIO_writable(stringio *self, PyObject *Py_UNUSED(ignored))
|
||||
{
|
||||
return _io_StringIO_writable_impl(self);
|
||||
PyObject *return_value = NULL;
|
||||
|
||||
Py_BEGIN_CRITICAL_SECTION(self);
|
||||
return_value = _io_StringIO_writable_impl(self);
|
||||
Py_END_CRITICAL_SECTION();
|
||||
|
||||
return return_value;
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(_io_StringIO_seekable__doc__,
|
||||
|
|
@ -366,6 +420,58 @@ _io_StringIO_seekable_impl(stringio *self);
|
|||
static PyObject *
|
||||
_io_StringIO_seekable(stringio *self, PyObject *Py_UNUSED(ignored))
|
||||
{
|
||||
return _io_StringIO_seekable_impl(self);
|
||||
PyObject *return_value = NULL;
|
||||
|
||||
Py_BEGIN_CRITICAL_SECTION(self);
|
||||
return_value = _io_StringIO_seekable_impl(self);
|
||||
Py_END_CRITICAL_SECTION();
|
||||
|
||||
return return_value;
|
||||
}
|
||||
/*[clinic end generated code: output=f56aa7f8a271acf6 input=a9049054013a1b77]*/
|
||||
|
||||
PyDoc_STRVAR(_io_StringIO___getstate____doc__,
|
||||
"__getstate__($self, /)\n"
|
||||
"--\n"
|
||||
"\n");
|
||||
|
||||
#define _IO_STRINGIO___GETSTATE___METHODDEF \
|
||||
{"__getstate__", (PyCFunction)_io_StringIO___getstate__, METH_NOARGS, _io_StringIO___getstate____doc__},
|
||||
|
||||
static PyObject *
|
||||
_io_StringIO___getstate___impl(stringio *self);
|
||||
|
||||
static PyObject *
|
||||
_io_StringIO___getstate__(stringio *self, PyObject *Py_UNUSED(ignored))
|
||||
{
|
||||
PyObject *return_value = NULL;
|
||||
|
||||
Py_BEGIN_CRITICAL_SECTION(self);
|
||||
return_value = _io_StringIO___getstate___impl(self);
|
||||
Py_END_CRITICAL_SECTION();
|
||||
|
||||
return return_value;
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(_io_StringIO___setstate____doc__,
|
||||
"__setstate__($self, state, /)\n"
|
||||
"--\n"
|
||||
"\n");
|
||||
|
||||
#define _IO_STRINGIO___SETSTATE___METHODDEF \
|
||||
{"__setstate__", (PyCFunction)_io_StringIO___setstate__, METH_O, _io_StringIO___setstate____doc__},
|
||||
|
||||
static PyObject *
|
||||
_io_StringIO___setstate___impl(stringio *self, PyObject *state);
|
||||
|
||||
static PyObject *
|
||||
_io_StringIO___setstate__(stringio *self, PyObject *state)
|
||||
{
|
||||
PyObject *return_value = NULL;
|
||||
|
||||
Py_BEGIN_CRITICAL_SECTION(self);
|
||||
return_value = _io_StringIO___setstate___impl(self, state);
|
||||
Py_END_CRITICAL_SECTION();
|
||||
|
||||
return return_value;
|
||||
}
|
||||
/*[clinic end generated code: output=5c8d67f4408a1e6e input=a9049054013a1b77]*/
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue