gh-117657: Use critical section to make _socket.socket.close thread safe (GH-120490)

This commit is contained in:
AN Long 2024-07-01 22:38:30 +08:00 committed by GitHub
parent c7991cc287
commit 8a5176772c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 41 additions and 10 deletions

View file

@ -3331,8 +3331,19 @@ sockets the address is a tuple (ifname, proto [,pkttype [,hatype [,addr]]])");
Set the file descriptor to -1 so operations tried subsequently
will surely fail. */
/*[clinic input]
@critical_section
_socket.socket.close
self as s: self(type="PySocketSockObject *")
close()
Close the socket. It cannot be used after this call.
[clinic start generated code]*/
static PyObject *
sock_close(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
_socket_socket_close_impl(PySocketSockObject *s)
/*[clinic end generated code: output=038b2418e07f6f6c input=9839a261e05bcb97]*/
{
SOCKET_T fd;
int res;
@ -3357,11 +3368,6 @@ sock_close(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
Py_RETURN_NONE;
}
PyDoc_STRVAR(sock_close_doc,
"close()\n\
\n\
Close the socket. It cannot be used after this call.");
static PyObject *
sock_detach(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
{
@ -5118,8 +5124,7 @@ static PyMethodDef sock_methods[] = {
{"bind", (PyCFunction)sock_bind, METH_O,
bind_doc},
#endif
{"close", (PyCFunction)sock_close, METH_NOARGS,
sock_close_doc},
_SOCKET_SOCKET_CLOSE_METHODDEF
#ifdef HAVE_CONNECT
{"connect", (PyCFunction)sock_connect, METH_O,
connect_doc},