Clément Lassieur <clem...@lassieur.org> writes: > Ludovic Courtès <l...@gnu.org> writes: > >> Hello Clément, >> >> Clément Lassieur <clem...@lassieur.org> skribis: >> >>> ;; bad >>> (define (test4) >>> (run-fibers >>> (lambda () >>> (spawn-fiber >>> (lambda () >>> (let ((channel (make-channel))) >>> (call-with-new-thread >>> (lambda () >>> (put-message channel "hello world"))))))) >>> #:drain? #t)) >>> ⊣ scheme@(guile-user)> In >>> /home/clement/.guix-profile/share/guile/site/2.2/fibers/internal.scm: >>> 402:6 1 (suspend-current-fiber _) >>> In unknown file: >>> 0 (scm-error misc-error #f "~A" ("Attempt to suspend fiber >>> within continuation barrier") #f) >>> ERROR: In procedure scm-error: >>> Attempt to suspend fiber within continuation barrier >> >> I think the problem here is that the new thread inherit the dynamic >> environment of the spawning thread. Thus, ‘put-message’, called in that >> new thread, thinks it’s running within a Fiber, but it’s not. >> >> Because of that, ‘put-message’ tries to suspend itself, but it cannot: >> ‘call-with-new-thread’ is written in C, so it’s a “continuation barrier” >> (meaning that it’s a continuation that cannot be captured and resumed >> later.) >> >> So I think if you really want that, you can perhaps do something like >> (untested): >> >> (call-with-new-thread >> (lambda () >> (parameterize ((current-fiber #f)) >> (put-message channel "hello world")))) > > It works, but only with (@@ (fibers internal) current-fiber) because the > parameter isn't exported. > > Thank you Ludo!
Hi Andy, I'm adding you to this conversation to notify you about this Fibers issue. (I don't have a Github account to report the bug there.) Thanks, Clément