]> code.delx.au - gnu-emacs/commitdiff
Fix asynchrounous GnuTLS socket handling on some versions of the GnuTLS library.
authorLars Magne Ingebrigtsen <larsi@gnus.org>
Mon, 21 Nov 2011 18:21:42 +0000 (19:21 +0100)
committerLars Magne Ingebrigtsen <larsi@gnus.org>
Mon, 21 Nov 2011 18:21:42 +0000 (19:21 +0100)
Some versions of the GnuTLS library doesn't respons to poll reliably.
Work around this by checking all GnuTLS sockets explicitly from the
idle loop.

src/ChangeLog
src/process.c

index ef9aa4a907f08796cfb4d5d5c0573fa608dfb193..45e8eb1025da664e25f170da03d3e5e47cdc3491 100644 (file)
@@ -1,3 +1,8 @@
+2011-11-21  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * process.c (wait_reading_process_output): Fix asynchrounous
+       GnuTLS socket handling on some versions of the GnuTLS library.
+
 2011-11-21  Jan Djärv  <jan.h.d@swipnet.se>
 
        * xterm.c (x_clear_frame): Reinstate the XClearWindow call.
index bea9e72019b46c6577d135174eb30ccee95e0780..02eb1122a078eeea4e80e6f22a36d279b893439a 100644 (file)
@@ -4620,15 +4620,39 @@ wait_reading_process_output (int time_limit, int microsecs, int read_kbd,
              some data in the TCP buffers so that select works, but
              with custom pull/push functions we need to check if some
              data is available in the buffers manually.  */
-          if (nfds == 0 &&
-              wait_proc && wait_proc->gnutls_p /* Check for valid process.  */
-              /* Do we have pending data?  */
-              && emacs_gnutls_record_check_pending (wait_proc->gnutls_state) > 0)
-          {
-              nfds = 1;
-              /* Set to Available.  */
-              FD_SET (wait_proc->infd, &Available);
-          }
+          if (nfds == 0)
+           {
+             if (! wait_proc)
+               {
+                 /* We're not waiting on a specific process, so loop
+                    through all the channels and check for data. */
+                 struct Lisp_Process *proc;
+                 for (channel = 0; channel < MAXDESC; ++channel)
+                   {
+                     if (! NILP (chan_process[channel]) &&
+                         (proc = XPROCESS (chan_process[channel])) != NULL &&
+                         proc->gnutls_p &&
+                         proc->infd &&
+                         emacs_gnutls_record_check_pending (proc->gnutls_state) > 0)
+                       {
+                         nfds++;
+                         FD_SET (proc->infd, &Available);
+                       }
+                   }
+               }
+             else
+               {
+                 /* Check this specific channel. */
+                 if (wait_proc->gnutls_p && /* Check for valid process.  */
+                     /* Do we have pending data?  */
+                     emacs_gnutls_record_check_pending (wait_proc->gnutls_state) > 0)
+                   {
+                     nfds = 1;
+                     /* Set to Available.  */
+                     FD_SET (wait_proc->infd, &Available);
+                   }
+               }
+           }
 #endif
        }