[armedbear-devel] destroy-thread and unwind-protect
alessiostalla at gmail.com
Mon Oct 24 21:34:24 UTC 2011
On Sun, Oct 23, 2011 at 8:05 PM, James Lawrence <llmjjmll at gmail.com> wrote:
> (defun test-cleanup ()
> (let* ((cleanedp nil)
> (thread (threads:make-thread
> (lambda ()
> (unwind-protect (sleep 999)
> (setf cleanedp t))))))
> (sleep 0.5)
> (threads:destroy-thread thread)
> (sleep 0.5)
> ABCL-1.0.0 and ABCL-0.27.0 return NIL.
> Other implementations I tested all return T -- Allegro, Clozure,
> LispWorks, SBCL (changing "threads" to "bordeaux-threads").
> Of course this isn't a bug since ABCL is free to do what it wishes.
> Does ABCL wish that?
I don't think we should wish that. It's inconsistent not only with
other Lisp implementations, but with Java thread semantics as well.
The problems are two: first, that destroy-thread doesn't really
destroy the thread, it just sets a flag, so the sleep is not aborted
(when it ends, the next form is not evaluated and the thread just
terminates); second, that sleep swallows the ThreadInterrupted
exception anyway, so even if it were interrupted, the thread would
then continue normally.
I think thread-destroy should be reimplemented to call
Thread.interrupt() and that we should properly handle
InterruptedException as a Lisp condition.
More information about the armedbear-devel