Skip to content

Commit e650b49

Browse files
Use the @critical_section decorator in BytesIO
The pickling support and __sizeof__() of BytesIO no longer need separate "lock held" functions.
1 parent de988ef commit e650b49

2 files changed

Lines changed: 60 additions & 82 deletions

File tree

Modules/_io/bytesio.c

Lines changed: 43 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -945,60 +945,55 @@ _io_BytesIO_close_impl(bytesio *self)
945945
function to use the efficient instance representation of PEP 307.
946946
*/
947947

948-
static PyObject *
949-
bytesio_getstate_lock_held(PyObject *op)
950-
{
951-
_Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(op);
952-
953-
bytesio *self = bytesio_CAST(op);
954-
PyObject *initvalue = _io_BytesIO_getvalue_impl(self);
955-
PyObject *dict;
956-
PyObject *state;
957-
958-
if (initvalue == NULL)
959-
return NULL;
960-
if (self->dict == NULL) {
961-
dict = Py_NewRef(Py_None);
962-
}
963-
else {
964-
dict = PyDict_Copy(self->dict);
965-
if (dict == NULL) {
966-
Py_DECREF(initvalue);
967-
return NULL;
968-
}
969-
}
970-
971-
state = Py_BuildValue("(OnN)", initvalue, self->pos, dict);
972-
Py_DECREF(initvalue);
973-
return state;
974-
}
975948

976949
/*[clinic input]
950+
@critical_section
977951
_io.BytesIO.__getstate__
978952
[clinic start generated code]*/
979953

980954
static PyObject *
981955
_io_BytesIO___getstate___impl(bytesio *self)
982-
/*[clinic end generated code: output=4a776270c8443b85 input=6e3cd9132f0cacdd]*/
956+
/*[clinic end generated code: output=4a776270c8443b85 input=f41e5bc9731475c4]*/
983957
{
984-
PyObject *op = (PyObject *)self;
985-
PyObject *ret;
986-
Py_BEGIN_CRITICAL_SECTION(op);
987-
ret = bytesio_getstate_lock_held(op);
988-
Py_END_CRITICAL_SECTION();
989-
return ret;
958+
PyObject *initvalue = _io_BytesIO_getvalue_impl(self);
959+
PyObject *dict;
960+
PyObject *state;
961+
962+
if (initvalue == NULL)
963+
return NULL;
964+
if (self->dict == NULL) {
965+
dict = Py_NewRef(Py_None);
966+
}
967+
else {
968+
dict = PyDict_Copy(self->dict);
969+
if (dict == NULL) {
970+
Py_DECREF(initvalue);
971+
return NULL;
972+
}
973+
}
974+
975+
state = Py_BuildValue("(OnN)", initvalue, self->pos, dict);
976+
Py_DECREF(initvalue);
977+
return state;
990978
}
991979

980+
981+
/*[clinic input]
982+
@critical_section
983+
_io.BytesIO.__setstate__
984+
985+
state: object
986+
/
987+
[clinic start generated code]*/
988+
992989
static PyObject *
993-
bytesio_setstate_lock_held(PyObject *op, PyObject *state)
990+
_io_BytesIO___setstate___impl(bytesio *self, PyObject *state)
991+
/*[clinic end generated code: output=3605abdec171bb98 input=82a189599ba75083]*/
994992
{
995-
_Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(op);
996-
997993
PyObject *result;
998994
PyObject *position_obj;
999995
PyObject *dict;
1000996
Py_ssize_t pos;
1001-
bytesio *self = bytesio_CAST(op);
1002997

1003998
assert(state != NULL);
1004999

@@ -1069,25 +1064,6 @@ bytesio_setstate_lock_held(PyObject *op, PyObject *state)
10691064
Py_RETURN_NONE;
10701065
}
10711066

1072-
/*[clinic input]
1073-
_io.BytesIO.__setstate__
1074-
1075-
state: object
1076-
/
1077-
[clinic start generated code]*/
1078-
1079-
static PyObject *
1080-
_io_BytesIO___setstate___impl(bytesio *self, PyObject *state)
1081-
/*[clinic end generated code: output=3605abdec171bb98 input=7d4339f5be0039ba]*/
1082-
{
1083-
PyObject *op = (PyObject *)self;
1084-
PyObject *ret;
1085-
Py_BEGIN_CRITICAL_SECTION(op);
1086-
ret = bytesio_setstate_lock_held(op, state);
1087-
Py_END_CRITICAL_SECTION();
1088-
return ret;
1089-
}
1090-
10911067
static void
10921068
bytesio_dealloc(PyObject *op)
10931069
{
@@ -1168,12 +1144,18 @@ _io_BytesIO___init___impl(bytesio *self, PyObject *initvalue)
11681144
return 0;
11691145
}
11701146

1147+
1148+
/*[clinic input]
1149+
@critical_section
1150+
_io.BytesIO.__sizeof__
1151+
1152+
Size of object in memory, in bytes.
1153+
[clinic start generated code]*/
1154+
11711155
static PyObject *
1172-
bytesio_sizeof_lock_held(PyObject *op)
1156+
_io_BytesIO___sizeof___impl(bytesio *self)
1157+
/*[clinic end generated code: output=f61b601bd055c4de input=6f01c36e6ff64c17]*/
11731158
{
1174-
_Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(op);
1175-
1176-
bytesio *self = bytesio_CAST(op);
11771159
size_t res = _PyObject_SIZE(Py_TYPE(self));
11781160
if (self->buf && !SHARED_BUF(self)) {
11791161
size_t s = _PySys_GetSizeOf(self->buf);
@@ -1185,24 +1167,6 @@ bytesio_sizeof_lock_held(PyObject *op)
11851167
return PyLong_FromSize_t(res);
11861168
}
11871169

1188-
/*[clinic input]
1189-
_io.BytesIO.__sizeof__
1190-
1191-
Size of object in memory, in bytes.
1192-
[clinic start generated code]*/
1193-
1194-
static PyObject *
1195-
_io_BytesIO___sizeof___impl(bytesio *self)
1196-
/*[clinic end generated code: output=f61b601bd055c4de input=097b24a2755a7b0b]*/
1197-
{
1198-
PyObject *op = (PyObject *)self;
1199-
PyObject *ret;
1200-
Py_BEGIN_CRITICAL_SECTION(op);
1201-
ret = bytesio_sizeof_lock_held(op);
1202-
Py_END_CRITICAL_SECTION();
1203-
return ret;
1204-
}
1205-
12061170
static int
12071171
bytesio_traverse(PyObject *op, visitproc visit, void *arg)
12081172
{

Modules/_io/clinic/bytesio.c.h

Lines changed: 17 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)