[Openmcl-devel] *multiprocessing-socket-io*

R.Stoye stoye at stoye.com
Thu Sep 16 21:51:32 UTC 2010


Hi,

i ask this question the third time now, so some may be bothered, but i  
never got an answer so lets start...
( see my posts from 29. Oktober 2007 and 10. März 2008)

Setting  ccl::*multiprocessing-socket-io* to nil provides some benefits
(see mail from Gary Byers from 13. Mai 2005 14:29:32 MESZ),
but it is problematic in conjunction with threads which are blocked  
during ccl:accept-connection:
If you kill a process blocked by ccl:accept-connection the socket
stays open (read: is not closed even when closed in an unwind-protect  
form)
until the next connection arrives and even after that, we have
an orphaned connection in state "CLOSE_WAIT" (seen with netstat). I
noticed the problem by using some http-server packages: Since they
kill their listening processes, none of them is able to stop and
restart the service when ccl::*multiprocessing-socket-io* is nil,
since the port is "already in use" (caused by the unclosed socket).
I got around this by modifying the "wait" clause in ccl::socket-accept  
to resemble the behavior of the T clause
(change socket  options to include #$O_NONBLOCK before calling with- 
eagain... ).
But i am shure this isn't the right way.

Here is a typical "usecase" from hunchentoot, running a  
(listening-)process with the following code:

(unwind-protect
     (progn
       (setf socket (ccl:make-socket ...))
       (loop (funcall function (ccl:accept-connection socket :wait t))))
  (when socket
    (cl:ignore-errors (close socket))))

I have little experience writing socket-code on a lower level and i  
think that we have two conflicting demands:
  a) let the thread block on this socket operation (on a system layer)
  b) be able to kill this process and close the socket
so maybe i can state a more concrete question:

Is there any way to close a socket, when its thread is blocked during  
ccl:accept-connection (really in socket-accept),
assuming  ccl::*multiprocessing-socket-io*  is nil.
Or is it possible to change the socketoptions when a connection  
arrives (make it blocking?)

Sure there is a very easy solution: let *multiprocessing-socket-io* be  
T,
but i think this isn't "The Right Thing" either.

Thanks,
Ralf Stoye




More information about the Openmcl-devel mailing list