summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2015-03-31 11:56:29 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2015-03-31 11:56:29 (GMT)
commit416f2e66ca9b50890092b409a4be4c0805b2e95a (patch)
tree3f996b4fdf3bdbf150f1b25e5493d898e4ff0286 /Modules
parente6951c6c8a24fcabbb6374d104277a9821553cf7 (diff)
downloadcpython-416f2e66ca9b50890092b409a4be4c0805b2e95a.zip
cpython-416f2e66ca9b50890092b409a4be4c0805b2e95a.tar.gz
cpython-416f2e66ca9b50890092b409a4be4c0805b2e95a.tar.bz2
Issue #23618: internal_connect_select() now waits also for error events
Diffstat (limited to 'Modules')
-rw-r--r--Modules/socketmodule.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
index 39003be..98b6636 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -592,14 +592,15 @@ internal_setblocking(PySocketSockObject *s, int block)
}
static int
-internal_select_impl(PySocketSockObject *s, int writing, _PyTime_t interval)
+internal_select_impl(PySocketSockObject *s, int writing, _PyTime_t interval,
+ int error)
{
int n;
#ifdef HAVE_POLL
struct pollfd pollfd;
_PyTime_t ms;
#else
- fd_set fds;
+ fd_set fds, efds;
struct timeval tv;
#endif
@@ -608,6 +609,9 @@ internal_select_impl(PySocketSockObject *s, int writing, _PyTime_t interval)
assert(PyGILState_Check());
#endif
+ /* Error condition is for output only */
+ assert(!(error && !writing));
+
/* Nothing to do unless we're in timeout mode (not non-blocking) */
if (s->sock_timeout <= 0)
return 0;
@@ -625,6 +629,8 @@ internal_select_impl(PySocketSockObject *s, int writing, _PyTime_t interval)
#ifdef HAVE_POLL
pollfd.fd = s->sock_fd;
pollfd.events = writing ? POLLOUT : POLLIN;
+ if (error)
+ pollfd.events |= POLLERR;
/* s->sock_timeout is in seconds, timeout in ms */
ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
@@ -638,15 +644,18 @@ internal_select_impl(PySocketSockObject *s, int writing, _PyTime_t interval)
FD_ZERO(&fds);
FD_SET(s->sock_fd, &fds);
+ FD_ZERO(&efds);
+ if (error)
+ FD_SET(s->sock_fd, &efds);
/* See if the socket is ready */
Py_BEGIN_ALLOW_THREADS;
if (writing)
n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
- NULL, &fds, NULL, &tv);
+ NULL, &fds, &efds, &tv);
else
n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
- &fds, NULL, NULL, &tv);
+ &fds, NULL, &efds, &tv);
Py_END_ALLOW_THREADS;
#endif
@@ -665,13 +674,13 @@ internal_select_impl(PySocketSockObject *s, int writing, _PyTime_t interval)
static int
internal_select(PySocketSockObject *s, int writing, _PyTime_t interval)
{
- return internal_select_impl(s, writing, interval);
+ return internal_select_impl(s, writing, interval, 0);
}
static int
internal_connect_select(PySocketSockObject *s)
{
- return internal_select(s, 1, s->sock_timeout);
+ return internal_select(s, 1, s->sock_timeout, 1);
}
/*