From: <me...@us...> - 2005-11-18 12:28:54
|
Update of /cvsroot/sbcl/sbcl/tests In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv20331/tests Modified Files: threads.impure.lisp Log Message: 0.9.6.50: stability before creativity * protect hash table operations with spinlocks on threaded builds => ** no more memory corruption due to SHRINK-VECTOR in hash table code ** no more hangs caused by a corrupted NEXT-VECTOR that is cyclic ** as a side effect hash tables are thread safe (but it's not part of the contract, do your own locking) ** slower hash tables Index: threads.impure.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/tests/threads.impure.lisp,v retrieving revision 1.35 retrieving revision 1.36 diff -u -d -r1.35 -r1.36 --- threads.impure.lisp 17 Nov 2005 12:13:38 -0000 1.35 +++ threads.impure.lisp 18 Nov 2005 12:28:40 -0000 1.36 @@ -114,11 +114,10 @@ (with-mutex (l) (with-recursive-lock (l))))) -(let ((l (make-spinlock :name "spinlock")) - (p *current-thread*)) +(let ((l (make-spinlock :name "spinlock"))) (assert (eql (spinlock-value l) 0) nil "1") (with-spinlock (l) - (assert (eql (spinlock-value l) p) nil "2")) + (assert (eql (spinlock-value l) 1) nil "2")) (assert (eql (spinlock-value l) 0) nil "3")) ;; test that SLEEP actually sleeps for at least the given time, even @@ -534,7 +533,31 @@ (format t "~&binding test done~%") +;; Try to corrupt the NEXT-VECTOR. Operations on a hash table with a +;; cyclic NEXT-VECTOR can loop endlessly in a WITHOUT-GCING form +;; causing the next gc hang SBCL. +(with-test (:name (:hash-table-thread-safety)) + (let* ((hash (make-hash-table)) + (threads (list (sb-thread:make-thread + (lambda () + (loop + ;;(princ "1") (force-output) + (setf (gethash (random 100) hash) 'h)))) + (sb-thread:make-thread + (lambda () + (loop + ;;(princ "2") (force-output) + (remhash (random 100) hash)))) + (sb-thread:make-thread + (lambda () + (loop + (sleep (random 1.0)) + (sb-ext:gc :full t))))))) + (unwind-protect + (sleep 5) + (mapc #'sb-thread:terminate-thread threads)))) +(format t "~&hash table test done~%") #| ;; a cll post from eric marsden | (defun crash () | (setq *debugger-hook* |