Index: /branches/working-0711/ccl/level-0/l0-hash.lisp
===================================================================
--- /branches/working-0711/ccl/level-0/l0-hash.lisp	(revision 7864)
+++ /branches/working-0711/ccl/level-0/l0-hash.lisp	(revision 7865)
@@ -701,9 +701,5 @@
     (with-lock-context
       (without-interrupts
-       (setq readonly (eq #+notyet (read-lock-hash-table hash)
-                          #-notyet (if (nhash.read-only hash)
-                                     :readonly
-                                     (write-lock-hash-table hash))
-                          :readonly))
+       (setq readonly (eq (read-lock-hash-table hash) :readonly))
        (let* ((vector (nhash.vector hash)))
          (if (and (eq key (nhash.vector.cache-key vector))
@@ -729,7 +725,11 @@
                       (return))
                      ((%needs-rehashing-p hash)
+                      (%lock-gc-lock)
                       (setq gc-locked t)
-                      (%lock-gc-lock)
-                      (%rehash hash))
+                      (unless readonly
+                        (let* ((lock (nhash.exclusion-lock hash)))
+                          (when lock (%promote-rwlock lock))))
+                      (when (%needs-rehashing-p hash)
+                        (%rehash hash)))
                      (t (return)))))))
        (when gc-locked (%unlock-gc-lock))
