Fix asynchrounous GnuTLS socket handling on some versions of the GnuTLS library.

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.
parent e7cfd277
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.
......
......@@ -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
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment