chicken-users
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Chicken-users] How to avoid busy waiting when using tcp-accept and thr


From: Sven Hartrumpf
Subject: [Chicken-users] How to avoid busy waiting when using tcp-accept and threads?
Date: Mon, 24 Feb 2003 16:21:18 +0100 (CET)

Hi.

I have a server program that serves client requests in parallel using
chicken threads. The main structure of the server is given below.
Currently, even before the first request comes in, the server needs 100%
cpu time. The server is the only thread at that time and stays in the
first part of the loop because tcp-accept-ready? returns #f. This is
as intended, but how can I avoid this busy waiting?

(declare (uses posix))
(declare (uses srfi-1))
(declare (uses srfi-18))
(declare (uses tcp))
...
 (let ((server-socket (tcp-listen *scmclust-port))
                 (num-accepts 0))
            (debug 'server "scmclust_server started: " ) ;(iso-date->string 
(iso-date-get))
            (let iter () ; avoid busy waiting somehow
              (debug 'server "scmclust_server: loop body start")
              (cond ((not (tcp-accept-ready? server-socket))
                     (debug 'server "scmclust_server: sleep because no 
connection")
                     (thread-sleep! 10)
                     (debug 'server "scmclust_server: end of sleep")
                     (iter)))
              (let-values
                (((server-input server-output) (tcp-accept server-socket))
                 ((local-address remote-address)
                  (values "1.2.3.4" "1.2.3.4") ; set correct values because the 
following line hangs; maybe move below read-line
                  ;(tcp-addresses server-input)
                  ))
                (debug 'server "scmclust_server: accept signal received: " 
remote-address " -> " local-address)
                (set! num-accepts (+ num-accepts 1))
                (thread-start!
                  (make-thread
                    (lambda ()

; here we serve the request
                    ))
                (iter)))))


Greetings
Sven




reply via email to

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