[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)
`(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? The second snippet that just exercises
make-instance is more reliable at failing. Do you want a stack trace?
Cheers,
-david k.
More information about the armedbear-devel
mailing list