[Python-checkins] cpython: Issue #23618: internal_connect_select() now waits also for error events

victor.stinner python-checkins at python.org
Tue Mar 31 14:11:49 CEST 2015


https://hg.python.org/cpython/rev/c027d6468667
changeset:   95324:c027d6468667
user:        Victor Stinner <victor.stinner at gmail.com>
date:        Tue Mar 31 13:56:29 2015 +0200
summary:
  Issue #23618: internal_connect_select() now waits also for error events

files:
  Modules/socketmodule.c |  21 +++++++++++++++------
  1 files changed, 15 insertions(+), 6 deletions(-)


diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -592,14 +592,15 @@
 }
 
 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 @@
     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 @@
 #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 @@
 
     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 @@
 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);
 }
 
 /*

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list