Loading NEWS +2 −0 Original line number Diff line number Diff line Loading @@ -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. Loading doc/internals/specials.texinfo +10 −1 Original line number Diff line number Diff line Loading @@ -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. src/compiler/alpha/cell.lisp +2 −2 Original line number Diff line number Diff line Loading @@ -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))) Loading @@ -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) Loading src/compiler/hppa/cell.lisp +2 −2 Original line number Diff line number Diff line Loading @@ -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) Loading @@ -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)) Loading src/compiler/mips/cell.lisp +2 −2 Original line number Diff line number Diff line Loading @@ -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)))) Loading @@ -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 Loading
NEWS +2 −0 Original line number Diff line number Diff line Loading @@ -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. Loading
doc/internals/specials.texinfo +10 −1 Original line number Diff line number Diff line Loading @@ -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.
src/compiler/alpha/cell.lisp +2 −2 Original line number Diff line number Diff line Loading @@ -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))) Loading @@ -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) Loading
src/compiler/hppa/cell.lisp +2 −2 Original line number Diff line number Diff line Loading @@ -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) Loading @@ -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)) Loading
src/compiler/mips/cell.lisp +2 −2 Original line number Diff line number Diff line Loading @@ -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)))) Loading @@ -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