[armedbear-devel] CLOS thread safety

David Kirkman dkirkman at ucsd.edu
Tue Apr 27 18:56:43 UTC 2010

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)
     (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?  The second snippet that just exercises
make-instance is more reliable at failing.  Do you want a stack trace?


-david k.

More information about the armedbear-devel mailing list