Commit 26bbfd93 authored by Gabor Melis's avatar Gabor Melis
Browse files

0.9.17.10: async unwind for specials

  * in UNBIND zero the symbol before the value
  * in UNBIND-TO-HERE zero the value even if the symbol is zero
parent b314231c
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -8,6 +8,8 @@ changes in sbcl-0.9.18 (1.0.beta?) relative to sbcl-0.9.16:
  * bug fix: remove a race condition in the setting of
    funcallable-instance functions, this should make threaded CLOS
    code more stable against memory faults.
  * bug fix: corruption of specials when unbinding is interrupted by an
    asynchronous unwind (reported by Hannu Koivisto)
  * improvement: the debugger will now also display local variables that
    are only used once, for code compiled with a DEBUG optimization quality
    of 2 or higher.
+10 −1
Original line number Diff line number Diff line
@@ -52,4 +52,13 @@ garbage pointer.

Furthermore, @code{BIND} must always write the value to the binding
stack first and the symbol second because the symbol being non-zero
means validity to @code{UNBIND-TO-HERE}.
means validity to @code{UNBIND-TO-HERE}. For similar reasons
@code{UNBIND} also zeroes the symbol first. But if it is interrupted
by a signal that does an async unwind then @code{UNBIND-TO-HERE} can
be triggered when the symbol is zeroed but the value is not. In this
case @code{UNBIND-TO-HERE} must zero out the value to avoid leaving
garbage around that may wreck the ship on the next @code{BIND}.

In other words, the invariant is that the binding stack above bsp only
contains zeros. This makes @code{BIND} safe in face of gc triggered at
any point during its execution.
+2 −2
Original line number Diff line number Diff line
@@ -179,8 +179,8 @@
    (loadw value bsp-tn (- binding-value-slot binding-size))
    (#!+gengc storew-and-remember-slot #!-gengc storew
             value symbol symbol-value-slot other-pointer-lowtag)
    (storew zero-tn bsp-tn (- binding-value-slot binding-size))
    (storew zero-tn bsp-tn (- binding-symbol-slot binding-size))
    (storew zero-tn bsp-tn (- binding-value-slot binding-size))
    (inst subq bsp-tn (* 2 n-word-bytes) bsp-tn)))


@@ -203,10 +203,10 @@
      (inst beq symbol skip)
      (#!+gengc storew-and-remember-slot #!-gengc storew
               value symbol symbol-value-slot other-pointer-lowtag)
      (storew zero-tn bsp-tn (- binding-value-slot binding-size))
      (storew zero-tn bsp-tn (- binding-symbol-slot binding-size))

      (emit-label skip)
      (storew zero-tn bsp-tn (- binding-value-slot binding-size))
      (inst subq bsp-tn (* 2 n-word-bytes) bsp-tn)
      (inst cmpeq where bsp-tn temp)
      (inst beq temp loop)
+2 −2
Original line number Diff line number Diff line
@@ -167,8 +167,8 @@
    (loadw symbol bsp-tn (- binding-symbol-slot binding-size))
    (loadw value bsp-tn (- binding-value-slot binding-size))
    (storew value symbol symbol-value-slot other-pointer-lowtag)
    (storew zero-tn bsp-tn (- binding-value-slot binding-size))
    (storew zero-tn bsp-tn (- binding-symbol-slot binding-size))
    (storew zero-tn bsp-tn (- binding-value-slot binding-size))
    (inst addi (- (* binding-size n-word-bytes)) bsp-tn bsp-tn)))

(define-vop (unbind-to-here)
@@ -182,10 +182,10 @@
    (inst comb := symbol zero-tn skip)
    (loadw value bsp-tn (- binding-value-slot binding-size))
    (storew value symbol symbol-value-slot other-pointer-lowtag)
    (storew zero-tn bsp-tn (- binding-value-slot binding-size))
    (storew zero-tn bsp-tn (- binding-symbol-slot binding-size))

    SKIP
    (storew zero-tn bsp-tn (- binding-value-slot binding-size))
    (inst addi (* -2 n-word-bytes) bsp-tn bsp-tn)
    (inst comb :<> where bsp-tn loop :nullify t)
    (loadw symbol bsp-tn (- binding-symbol-slot binding-size))
+2 −2
Original line number Diff line number Diff line
@@ -184,8 +184,8 @@
    (loadw symbol bsp-tn (- binding-symbol-slot binding-size))
    (loadw value bsp-tn (- binding-value-slot binding-size))
    (storew value symbol symbol-value-slot other-pointer-lowtag)
    (storew zero-tn bsp-tn (- binding-value-slot binding-size))
    (storew zero-tn bsp-tn (- binding-symbol-slot binding-size))
    (storew zero-tn bsp-tn (- binding-value-slot binding-size))
    (inst addu bsp-tn bsp-tn (* -2 n-word-bytes))))


@@ -206,10 +206,10 @@
      (inst beq symbol zero-tn skip)
      (loadw value bsp-tn (- binding-value-slot binding-size))
      (storew value symbol symbol-value-slot other-pointer-lowtag)
      (storew zero-tn bsp-tn (- binding-value-slot binding-size))
      (storew zero-tn bsp-tn (- binding-symbol-slot binding-size))

      (emit-label skip)
      (storew zero-tn bsp-tn (- binding-value-slot binding-size))
      (inst addu bsp-tn bsp-tn (* -2 n-word-bytes))
      (inst bne where bsp-tn loop)
      (inst nop)
Loading