10000 gh-128182: add critical section to `_ctypes.PyCData` methods (#132082) · python/cpython@f7a8bc5 · GitHub
[go: up one dir, main page]

Skip to content

Commit f7a8bc5

Browse files
gh-128182: add critical section to _ctypes.PyCData methods (#132082)
1 parent 37bc386 commit f7a8bc5

File tree

2 files changed

+99
-37
lines changed

2 files changed

+99
-37
lines changed

Modules/_ctypes/_ctypes.c

Lines changed: 34 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3007,16 +3007,17 @@ PyCData_nohash(PyObject *self)
30073007
}
30083008

30093009
/*[clinic input]
3010-
_ctypes.PyCData.__reduce__ as PyCData_reduce
3010+
@critical_section
3011+
_ctypes.PyCData.__reduce__
30113012
30123013
myself: self
30133014
cls: defining_class
30143015
/
30153016
[clinic start generated code]*/
30163017

30173018
static PyObject *
3018-
PyCData_reduce_impl(PyObject *myself, PyTypeObject *cls)
3019-
/*[clinic end generated code: output=1a025ccfdd8c935d input=34097a5226ea63c1]*/
3019+
_ctypes_PyCData___reduce___impl(PyObject *myself, PyTypeObject *cls)
3020+
/*[clinic end generated code: output=eaad97e111599294 input=6a464e1a1e2bbdbd]*/
30203021
{
30213022
CDataObject *self = _CDataObject_CAST(myself);
30223023

@@ -3037,33 +3038,33 @@ PyCData_reduce_impl(PyObject *myself, PyTypeObject *cls)
30373038
return NULL;
30383039
}
30393040
PyObject *bytes;
3040-
LOCK_PTR(self);
30413041
bytes = PyBytes_FromStringAndSize(self->b_ptr, self->b_size);
3042-
UNLOCK_PTR(self);
30433042
return Py_BuildValue("O(O(NN))", st->_unpickle, Py_TYPE(myself), dict,
30443043
bytes);
30453044
}
30463045

3046+
/*[clinic input]
3047+
@critical_section
3048+
_ctypes.PyCData.__setstate__
3049+
3050+
myself: self
3051+
dict: object(subclass_of="&PyDict_Type")
3052+
data: str(accept={str, robuffer}, zeroes=True)
3053+
/
3054+
[clinic start generated code]*/
3055+
30473056
static PyObject *
3048-
PyCData_setstate(PyObject *myself, PyObject *args)
3057+
_ctypes_PyCData___setstate___impl(PyObject *myself, PyObject *dict,
3058+
const char *data, Py_ssize_t data_length)
3059+
/*[clinic end generated code: output=8bd4c0a5b4f254bd input=124f5070258254c6]*/
30493060
{
3050-
void *data;
3051-
Py_ssize_t len;
3052-
int res;
3053-
PyObject *dict, *mydict;
30543061
CDataObject *self = _CDataObject_CAST(myself);
3055-
if (!PyArg_ParseTuple(args, "O!s#",
3056-
&PyDict_Type, &dict, &data, &len))
3057-
{
3058-
return NULL;
3062+
3063+
if (data_length > self->b_size) {
3064+
data_length = self->b_size;
30593065
}
3060-
if (len > self->b_size)
3061-
len = self->b_size;
3062-
// XXX Can we use locked_memcpy_to()?
3063-
LOCK_PTR(self);
3064-
memmove(self->b_ptr, data, len);
3065-
UNLOCK_PTR(self);
3066-
mydict = PyObject_GetAttrString(myself, "__dict__");
3066+
memmove(self->b_ptr, data, data_length);
3067+
PyObject *mydict = PyObject_GetAttrString(myself, "__dict__");
30673068
if (mydict == NULL) {
30683069
return NULL;
30693070
}
@@ -3074,26 +3075,30 @@ PyCData_setstate(PyObject *myself, PyObject *args)
30743075
Py_DECREF(mydict);
30753076
return NULL;
30763077
}
3077-
res = PyDict_Update(mydict, dict);
3078+
int res = PyDict_Update(mydict, dict);
30783079
Py_DECREF(mydict);
30793080
if (res == -1)
30803081
return NULL;
30813082
Py_RETURN_NONE;
30823083
}
30833084

3084-
/*
3085-
* default __ctypes_from_outparam__ method returns self.
3086-
*/
3085+
/*[clinic input]
3086+
_ctypes.PyCData.__ctypes_from_outparam__
3087+
3088+
default __ctypes_from_outparam__ method returns self.
3089+
[clinic start generated code]*/
3090+
30873091
static PyObject *
3088-
PyCData_from_outparam(PyObject *self, PyObject *args)
3092+
_ctypes_PyCData___ctypes_from_outparam___impl(PyObject *self)
3093+
/*[clinic end generated code: output=a7facc849097b549 input=910c5fec33e268c9]*/
30893094
{
30903095
return Py_NewRef(self);
30913096
}
30923097

30933098
static PyMethodDef PyCData_methods[] = {
3094-
{ "__ctypes_from_outparam__", PyCData_from_outparam, METH_NOARGS, },
3095-
PYCDATA_REDUCE_METHODDEF
3096-
{ "__setstate__", PyCData_setstate, METH_VARARGS, },
3099+
_CTYPES_PYCDATA___CTYPES_FROM_OUTPARAM___METHODDEF
3100+
_CTYPES_PYCDATA___SETSTATE___METHODDEF
3101+
_CTYPES_PYCDATA___REDUCE___METHODDEF
30973102
{ NULL, NULL },
30983103
};
30993104

Modules/_ctypes/clinic/_ctypes.c.h

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

0 commit comments

Comments
 (0)
0