[hunchentoot-devel] Server sporadically hanging

Edi Weitz edi at agharta.de
Wed Feb 20 22:42:18 UTC 2008


On Wed, 20 Feb 2008 09:16:58 -0800, Jeff Cunningham <jeffrey at cunningham.net> wrote:

> That one went over my head. Does it mean that if I put a function
> like this:
>
> (defun cancel-all-threads ()
>   (mapcar (lambda (thread)
>         (sb-thread:interrupt-thread thread
>                             (lambda ()
>                             (throw 'hunchentoot::handler-done
>                               ""))))
>         (sb-thread:list-all-threads)))
>
> into, say, request.lisp (in hunchentoot), that it would find the
> tag?

Why don't you try it out yourself?

  CL-USER> (defun endless ()
             (format #.*standard-output*
                     "Interrupted by someone throwing ~S.~%"
                     (catch 'foo
                       (loop (sleep 1)))))
  ENDLESS
  CL-USER> (defun stop ()
             (throw 'foo 42))
  STOP
  CL-USER> (sb-thread:make-thread 'endless)
  #<SB-THREAD:THREAD {AEB0E11}>
  CL-USER> (sb-thread:interrupt-thread * 'stop)
  Interrupted by someone throwing 42.

But as I already said the catch tag has to be established for this to
work.  Look at the code, specifically at server.lisp, and you'll see
that you can't simply throw HANDLER-DONE at any time during the
lifetime of a Hunchentoot thread.  Or simply read the docs where it
says that you can throw this tag "during the lifetime of a handler."



More information about the Tbnl-devel mailing list