[armedbear-devel] CLOS thread safety

Erik Huelsmann ehuels at gmail.com
Tue Apr 27 19:01:45 UTC 2010

Hi David,

On Tue, Apr 27, 2010 at 8:56 PM, David Kirkman <dkirkman at ucsd.edu> wrote:
> On Tue, Apr 27, 2010 at 11:37 AM, Erik Huelsmann <ehuels at gmail.com> wrote:
>> Yesterday, I took a little time to look at the issue you mention. You
>> said with 1 big "lock around everything" it all worked. Where did you
>> put that lock? I tried putting some locks in a number of places
>> (educated guesses), but nothing helped so far. I don't have data
>> regarding the stack trace you see when running into this issue - there
>> wasn't enough time for it.
> I redefined make-instance and slot-value.  This seems to fix things, or
> at least greatly reduce the frequency of problems.   (I'm still having an
> occasional MOP::NAME error, but I can't reproduce it).  Other than
> make-instance on slot-value, my code uses a lot of generic functions.
> (defvar *skye-clos-lock* (make-hash-table))
> (defmacro make-instance (&body body)
>  `(progn
>     (threads:with-thread-lock (*skye-clos-lock*)
>       (common-lisp:make-instance , at body))))
> (defun slot-value (&rest args)
>  (threads:with-thread-lock (*skye-clos-lock*)
>    (apply #'common-lisp:slot-value args)))
> (defun set-slot-value (c slot val)
>  (threads:with-thread-lock (*skye-clos-lock*)
>    (setf (common-lisp:slot-value c slot) val)))
> (defsetf slot-value set-slot-value)
> Can you reproduce the error?

Yes! Absolutely, I'm able to reproduce reliably (on a Core2 Duo). I
just was inserting locks *inside* make-instance.

>  The second snippet that just exercises
> make-instance is more reliable at failing.  Do you want a stack trace?

If you can get a stacktrace of the failing thread easily, yes, please!



More information about the armedbear-devel mailing list