Issue #23834: Modify socket.sendall() to reuse sock_call() with
sock_send_impl()
This commit is contained in:
parent
31bf2d5073
commit
02f32ab47e
|
@ -3501,10 +3501,10 @@ static PyObject *
|
|||
sock_sendall(PySocketSockObject *s, PyObject *args)
|
||||
{
|
||||
char *buf;
|
||||
Py_ssize_t len, n = -1;
|
||||
int async_err = 0;
|
||||
int flags = 0, timeout;
|
||||
Py_ssize_t len, n;
|
||||
int flags = 0;
|
||||
Py_buffer pbuf;
|
||||
struct sock_send ctx;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
|
||||
return NULL;
|
||||
|
@ -3517,38 +3517,30 @@ sock_sendall(PySocketSockObject *s, PyObject *args)
|
|||
}
|
||||
|
||||
do {
|
||||
timeout = internal_select(s, 1, s->sock_timeout);
|
||||
|
||||
n = -1;
|
||||
if (!timeout) {
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
#ifdef MS_WINDOWS
|
||||
if (len > INT_MAX)
|
||||
len = INT_MAX;
|
||||
n = send(s->sock_fd, buf, (int)len, flags);
|
||||
#else
|
||||
n = send(s->sock_fd, buf, len, flags);
|
||||
#endif
|
||||
Py_END_ALLOW_THREADS
|
||||
}
|
||||
if (timeout == 1) {
|
||||
ctx.buf = buf;
|
||||
ctx.len = len;
|
||||
ctx.flags = flags;
|
||||
if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
|
||||
PyBuffer_Release(&pbuf);
|
||||
PyErr_SetString(socket_timeout, "timed out");
|
||||
return NULL;
|
||||
}
|
||||
if (n >= 0) {
|
||||
buf += n;
|
||||
len -= n;
|
||||
n = ctx.result;
|
||||
assert(n >= 0);
|
||||
|
||||
buf += n;
|
||||
len -= n;
|
||||
|
||||
/* We must run our signal handlers before looping again.
|
||||
send() can return a successful partial write when it is
|
||||
interrupted, so we can't restrict ourselves to EINTR. */
|
||||
if (PyErr_CheckSignals()) {
|
||||
PyBuffer_Release(&pbuf);
|
||||
return NULL;
|
||||
}
|
||||
} while (len > 0 && (n >= 0 || errno == EINTR) &&
|
||||
!(async_err = PyErr_CheckSignals()));
|
||||
} while (len > 0);
|
||||
PyBuffer_Release(&pbuf);
|
||||
|
||||
if (n < 0 || async_err)
|
||||
return (!async_err) ? s->errorhandler() : NULL;
|
||||
|
||||
Py_INCREF(Py_None);
|
||||
return Py_None;
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(sendall_doc,
|
||||
|
|
Loading…
Reference in New Issue