[gambit-list] I/O puzzle...

Alex Queiroz asandroq at gmail.com
Tue Jun 9 22:24:46 EDT 2009


Hallo,

On Thu, Oct 30, 2008 at 6:18 PM, Marc Feeley<feeley at iro.umontreal.ca> wrote:
> Puzzle... what's the bug in the following code?  See end of message for
> answer.
>
> (define http-server-start!
>  (lambda (hs stop?)
>    (let ((server-port
>           (open-tcp-server
>            (list port-number: (server-port-number hs)
>                  backlog: 128
>                  reuse-address: #t
>                  server-address: '#u8(127 0 0 1) ; on localhost interface
> only
>                  char-encoding: 'ISO-8859-1))))
>      (input-port-timeout-set! server-port 3)
>      (accept-connections hs server-port stop?))))
>
> (define accept-connections
>  (lambda (hs server-port stop?)
>    (let loop ()
>      (let ((connection
>             (read server-port)))
>        (if (eof-object? connection)
>            (if (stop?)
>                (close-input-port server-port)
>                (loop))
>            (begin
>              (if (server-threaded? hs)
>                  (let ((dummy-port (open-dummy)))
>                    (parameterize ((current-input-port dummy-port)
>                                   (current-output-port dummy-port))
>                      (thread-start!
>                       (make-thread
>                        (lambda ()
>                          (serve-connection hs connection))))))
>                  (serve-connection hs connection))
>              (loop)))))))
>
> .
> .
> .
> .
> .
> .
> .
> .
>
> Answer: the (input-port-timeout-set! server-port 3) is at the wrong place.
>  It sets a timeout ***3 seconds in the future***.  So after 3 seconds have
> passed all calls to read in accept-connections will not block (and lead to a
> tight, CPU intensive loop).  The correct approach is to put the call to
> (input-port-timeout-set! server-port 3) just before the call to read.
>
> Puzzle #2: why did Gambit chose to define timeouts that are not relative to
> the moment that an I/O function is called?
>

I know this is ancient, but I missed the question when I first
received the email. Well, why? :)

Cheers,
-- 
-alex
http://www.ventonegro.org/



More information about the Gambit-list mailing list