[Openmcl-devel] process-input-wait question

Erik Pearson erik at adaptations.com
Thu Jul 13 00:03:29 PDT 2006


I've been looking at the implementation code for process-input-wait  
and fd-input-available, and was  wondering if Gary or anyone could  
address a couple of questions?

First, why does the underlying "select()" call in fd-input-available  
utilizes the exception argument (errfds in the lisp, but exceptfds in  
the man page for select).  The purpose of exceptfds is to detect, on  
sockets (for which I'm using this), the availability of out-of-band  
data. The naming of the lisp variable "errfds" might lead one to  
believe that the authors at some point believed it was an "exception"  
as in "error" rather than "exception"  as in "interesting" or  
"different" as it seems to mean in this context.

Other than this not being documented -- is the inclusion of the  
exceptfds test desirable? I don't know if the openmcl code makes room  
for oob shenanigans, which I don't really understand. I don't think  
that oob is part of the http spec as far as my present application,  
so I'd rather be able to ignore it completely.

I've modified the code a bit to return whether this condition has  
been detected when process-input-wait returns, and sometimes it is  
and sometimes it isn't (this is on a connection from a web browser to  
a lisp web server). I'm not sure I have the desire to figure out why.

Another process-input-wait question has to do with the initial call  
to fd-input-available with a ticks argument of 0, and the subsequent  
calling of fd-input-available with the timeout ticks, the testing of  
ticks, etc. This looks like a little bit of polling -- but isn't  
select with the timeout value supposed to work as expected -- to  
return as soon as the selected file descriptors are available, or the  
time has passed, and isn't that just what we want? Perhaps this is to  
work around some bugs, or fine points in select logic that I don't  
understand?

defun process-input-wait (fd &optional ticks)
   "Wait until input is available on a given file-descriptor."
   (let* ((wait-end (if ticks (+ (get-tick-count) ticks))))
     (loop
        (when (fd-input-available-p fd 0)
	 (return t))
        (let* ((now (if ticks (get-tick-count))))
	 (if (and wait-end (>= now wait-end))
	     (return))
	 (fd-input-available-p fd (if ticks (- wait-end now)))))))


  Is there any reason that this won't work?

(defun process-input-wait (fd &optional ticks)
   "Wait until input is available on a given file-descriptor."
   (fd-input-available-p fd ticks))

Thanks,
Erik.



More information about the Openmcl-devel mailing list