emacs-devel
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]