[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Calling 'select' from emacs_gnutls_pull
From: |
Claudio Bley |
Subject: |
Re: Calling 'select' from emacs_gnutls_pull |
Date: |
Fri, 22 Feb 2013 12:15:36 +0100 |
User-agent: |
Wanderlust/2.15.9 (Almost Unreal) SEMI/1.14.6 (Maruoka) FLIM/1.14.9 (Gojō) APEL/10.8 Emacs/24.1.50 (i386-mingw-nt6.1.7601) MULE/6.0 (HANACHIRUSATO) |
Hi.
At Sat, 16 Feb 2013 18:52:23 +0200,
Eli Zaretskii wrote:
>
> > From: Ted Zlatanov <address@hidden>
> > Date: Sat, 16 Feb 2013 10:55:45 -0500
> >
> > ...and there are comments accumulated over the years in that
> > neighborhood. Claudio Bley contributed much of the original code here,
> > including the piece you're referring to. The history is at
> >
> > http://comments.gmane.org/gmane.emacs.devel/136816
>
> I've (re-)read that thread, but didn't find any rationale for calling
> 'select'. Claudio, could you perhaps chime in?
That was quite some time ago and, I'm afraid, my memory fails me at
that.
Looking at the code, I cannot see a strong reason calling select
inside of emacs_gnutls_pull... Maybe it was indeed because of
performance reasons, but more likely some kind of left-over from
chasing a red herring while trying to figure out why it didn't work
sometimes.
However, applying the obvious patch:
--- >8 ---
--- src/w32.c Thu Feb 21 14:35:43 2013
+++ ../build/src/w32.c Fri Feb 22 08:32:35 2013
@@ -7837,27 +7837,9 @@
err = errno;
+ /* Translate the WSAEWOULDBLOCK alias EWOULDBLOCK to EAGAIN. */
if (err == EWOULDBLOCK)
- {
- /* Set a small timeout. */
- timeout = make_emacs_time (1, 0);
- FD_ZERO (&fdset);
- FD_SET ((int)fd, &fdset);
-
- /* Use select with the timeout to poll the selector. */
- sc = select (fd + 1, &fdset, (SELECT_TYPE *)0, (SELECT_TYPE *)0,
- &timeout, NULL);
-
- if (sc > 0)
- continue; /* Try again. */
-
- /* Translate the WSAEWOULDBLOCK alias EWOULDBLOCK to EAGAIN.
- Also accept select return 0 as an indicator to EAGAIN. */
- if (sc == 0 || errno == EWOULDBLOCK)
- err = EAGAIN;
- else
- err = errno; /* Other errors are just passed on. */
- }
+ err = EAGAIN;
emacs_gnutls_transport_set_errno (process->gnutls_state, err);
--- >8 ---
and made a few tests using POP3 and IMAP connections over TLS and
HTTPS connections. Works good.
I also prepared a small test driver, downloading a file 33 MiByte in
size from a remote host (over VPN):
,----[ test_tls.el ]
| (require 'gnutls)
|
| (when (gnutls-available-p)
| (url-retrieve-synchronously "https://192.168.0.1/artifactory-2.4.1.zip"))
|
| (kill-emacs)
`----
Here are some numbers running emacs with "-Q --load test_tls.el" a few
times. Note, that using "--batch -Q --script test_tls.el" uses 100%
CPU and exits with an out of memory error (I assume because the GC
is never run since there is no event loop nor threads involved).
Average for with-select key over 3 runs
Version Number: Windows NT 5.1 (Build 2600)
Exit Time: 1:00 am, Monday, January 1 1601
Elapsed Time: 0:00:35.208
Process Time: 0:00:05.822
System Calls: 659366
Context Switches: 138074
Page Faults: 61507
Bytes Read: 80719977
Bytes Written: 320584
Bytes Other: 908395
Average for without-select key over 3 runs
Version Number: Windows NT 5.1 (Build 2600)
Exit Time: 1:00 am, Monday, January 1 1601
Elapsed Time: 0:00:33.796
Process Time: 0:00:06.166
System Calls: 857893
Context Switches: 140154
Page Faults: 69061
Bytes Read: 99353998
Bytes Written: 2017152
Bytes Other: 1175082
--
Claudio
--
Claudio