bug#59021: Unbounded heap growth when combining dynamic states & delimited continuation

Ludovic Courtès <[email protected]>
Newsgroups gmane.lisp.guile.bugs
Message-ID <[email protected]>
(This is a followup to <https://github.com/wingo/fibers/issues/65>,
itself a followup to <https://issues.guix.gnu.org/58631>.)

Consider this code:

--8<---------------cut here---------------start------------->8---
;; https://issues.guix.gnu.org/58631
;; https://github.com/wingo/fibers/issues/65

(define loss
  (make-vector 1000000))

(let ((tag (make-prompt-tag "my prompt")))
  (define handler
    (lambda (k i)
      (when (zero? (modulo i 2000000))
        (pk 'heap-size (assoc-ref (gc-stats) 'heap-size)))

      (call-with-prompt tag
        (lambda ()
          (k (modulo (+ 1 i) 10000000)))
        handler)))

  (call-with-prompt tag
    (let ((state (current-dynamic-state)))
      (lambda ()
        ;; (define (with-dynamic-state state thunk)
        ;;   (let ((previous #f))
        ;;     (dynamic-wind
        ;;       (lambda () (set! previous (set-current-dynamic-state state)))
        ;;       thunk
        ;;       (lambda () (set-current-dynamic-state previous)))))
        (with-dynamic-state state
                            (lambda ()
                              (let loop ((i 0))
                                (loop (abort-to-prompt tag i)))))))
    handler))
--8<---------------cut here---------------end--------------->8---

On Guile 3.0.8, this program exhibits seemingly unbounded heap growth.
Uncommenting the local ‘with-dynamic-state’ definition fixes the
problem.

Ludo’.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.