[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