bug#76200: `with-parameters*' seems to create a continuation barrier

"W. Kosior" via "Bug reports for GUILE, GNU's Ubiquitous Extension Language" <[email protected]> Tue, 11 Feb 2025 11:59:36 +0100
Newsgroups gmane.lisp.guile.bugs
Message-ID <[email protected]>
Hello,

I've been experimenting with guile-fibers.  I noticed that
`with-parameters*' procedure included as an "extra" in Guile's srfi-39
creates a continuation barrier.  From the documentation it is not clear
that it does so.

Consider this sample program (which I ran with Guile 3.0.9 and Fibers
1.0.0, as they are defined in Guix
2fda889ac992977af7b4cd96d09f737d834e0b2d):

--8<---------------cut here---------------start------------->8---
(use-modules (fibers)
             (fibers channels)
             (srfi srfi-18)
             ((srfi srfi-39) #:select (with-parameters*)))

(define %my-channel
  (make-channel))

(define %my-param
  (make-parameter #f))

(define %my-thread
  (make-thread (lambda ()
                 (run-fibers (lambda ()
                               (with-parameters* (list %my-param) '(hello)
                                 (lambda ()
                                   (put-message %my-channel (%my-param))
                                   'ok)))))))

(thread-start! %my-thread)

(format #t "message: ~a~%" (get-message %my-channel))

(thread-join! %my-thread)
--8<---------------cut here---------------end--------------->8---

It prints:

> Uncaught exception in task:
> In fibers.scm:
>    186:20  6 (_)
>    145:21  5 (_)
> In unknown file:
>            4 (with-fluids* (#<fluid 7f192cf70d70>) (hello) #<procedure 100903e0 at <…>)
> In current input:
>     17:35  3 (_)
> In fibers/operations.scm:
>    154:10  2 (perform-operation _)
> In fibers/scheduler.scm:
>     357:6  1 (suspend-current-task _)
> In ice-9/boot-9.scm:
>   1685:16  0 (raise-exception _ #:continuable? _)
> ice-9/boot-9.scm:1685:16: In procedure raise-exception:
> Attempt to suspend fiber within continuation barrier

But if I use `parameterize' rather than `with-parameters*', no errors
occur.  Here's an example of a working program:

--8<---------------cut here---------------start------------->8---
(use-modules (fibers)
             (fibers channels)
             (srfi srfi-18))

(define %my-channel
  (make-channel))

(define %my-param
  (make-parameter #f))

(define %my-thread
  (make-thread (lambda ()
                 (run-fibers (lambda ()
                               (parameterize ((%my-param 'hello))
                                 (put-message %my-channel (%my-param))
                                 'ok))))))

(thread-start! %my-thread)

(format #t "message: ~a~%" (get-message %my-channel))

(thread-join! %my-thread)
--8<---------------cut here---------------end--------------->8---

It prints:

> message: hello

Is it a bug that `with-parameters*' doesn't work equivalently?  Or am I
reading the info pages wrong?

Best :)
Wojtek

--
W. Kosior

website: https://koszko.org/koszko.html
fediverse: https://friendica.me/profile/koszko/profile
PGP fingerprint: E972 7060 E3C5 637C 8A4F  4B42 4BC5 221C 5A79 FD1A
signature.asc (application/pgp-signature, 228 B)
-----BEGIN PGP SIGNATURE-----

iHUEARYIAB0WIQTpcnBg48VjfIpPS0JLxSIcWnn9GgUCZ6stmAAKCRBLxSIcWnn9
GtrzAQCIual5Cp+uNk1W18wI45WncPVmxb6S666AAoil63+ERQEA5Uxmdfg1lW/o
VYUHrim/FzcyXzkuZYyIzwCtT3LOwgE=
=484+
-----END PGP SIGNATURE-----