1.0.33.11: fix detection of tls exhaustion
[sbcl.git] / src / assembly / x86-64 / alloc.lisp
index 2c113b0..80d5406 100644 (file)
@@ -94,7 +94,8 @@
                (emit-label get-tls-index-lock)
                (inst mov target 1)
                (zeroize rax-tn)
-               (inst cmpxchg (make-ea-for-symbol-value *tls-index-lock*) target :lock)
+               (inst cmpxchg (make-ea-for-symbol-value *tls-index-lock*)
+                     target :lock)
                (inst jmp :ne get-tls-index-lock)
                ;; The symbol is now in OTHER.
                (inst pop other)
                (inst jmp :ne release-tls-index-lock)
                ;; Allocate a new tls-index.
                (load-symbol-value target *free-tls-index*)
-               (let ((error (generate-error-code nil 'tls-exhausted-error)))
+               (let ((not-error (gen-label))
+                     (error (generate-error-code nil 'tls-exhausted-error)))
                  (inst cmp target (fixnumize tls-size))
-                 (inst jmp :ge error))
+                 (inst jmp :l not-error)
+                 (%clear-pseudo-atomic)
+                 (inst jmp error)
+                 (emit-label not-error))
                (inst add (make-ea-for-symbol-value *free-tls-index*)
                      (fixnumize 1))
                (storew target other symbol-tls-index-slot other-pointer-lowtag)