From: Jan Wielkiewicz <tona_kosmicznego_smiecia@interia.pl>
To: Chris Vine <vine35792468@gmail.com>
Cc: guile-user@gnu.org
Subject: Re: GOOPS and fibers - need help understanding what's wrong, bug in fibers/guile?
Date: Fri, 24 Jul 2020 18:19:24 +0200 [thread overview]
Message-ID: <20200724181924.6667ef10@interia.pl> (raw)
In-Reply-To: <20200722132814.ddafae7536dc479408a6513a@gmail.com>
Hello,
Dnia 2020-07-22, o godz. 13:28:14
Chris Vine <vine35792468@gmail.com> napisał(a):
> On further reflection I am not sure if it did used to work with
> guile-2.2. I think it may be a bug in the manual after all. This
> works OK:
>
> (display (run-fibers
> (lambda ()
> (let ((channel (make-channel)))
> (spawn-fiber
> (lambda ()
> (sleep 1) ;; do some work
> (put-message channel "hello world")))
> (simple-format #t "~a~%" (get-message channel))
> "finished\n"))))
>
This one just worked, I don't know why, even without "display".
Something is buggy it seems.
> The point about:
>
> (run-fibers
> (lambda () (spawn-fiber
> (lambda ()
> (set! v "Set")
> (display "hey!\n")))))
>
> is that spawn-fiber, and so init-thunk, will return straigntaway with
> a new fiber object.
>
> So I suspect setting #:drain? to #t will resolve your problem.
#:drain solved the problem and I also managed to make my code work.
> It might be worth reporting the bug in the manual as an issue on the
> github repository (assuming the above is correct).
>
Yes, I'll report it.
Thanks for helping me!
Posting my working code, so someone wanting to mix GOOPS with fibers
will have a working example:
(define-module (blocks block)
#:use-module (fibers)
#:use-module (fibers channels)
#:use-module (oop goops)
#:use-module (ice-9 match)
#:use-module (srfi srfi-9) ;; records
#:export (<peer>
connect-peers
send-message
handle-message
main
p1
p2
get-buffer))
(define-class <peer> ()
(input #:init-form '() #:getter get-input
#:setter set-input #:init-keyword #:input)
(output #:init-form '() #:getter get-output
#:setter set-output #:init-keyword #:output)
(buffer #:init-value '() #:setter set-buffer #:getter get-buffer))
;; Only connection, no messaging started.
(define-method (connect-peers (p1 <peer>) (p2 <peer>))
(let ((p1-p2 (make-channel)) ;; p1 to p2
(p2-p1 (make-channel))) ;; p2 to p1
(set-input p1 p2-p1)
(set-output p1 p1-p2)
(set-input p2 p1-p2)
(set-output p2 p2-p1)))
(define-method (send-message (p <peer>) msg)
(spawn-fiber
(lambda ()
(put-message (get-output p) msg))))
(define-method (handle-message (p <peer>))
(spawn-fiber
(lambda ()
(let loop ()
(define msg (get-message (get-input p)))
(match (pk msg)
('ping (send-message p 'pong))
('pong (send-message p 'ping)))
(loop)))))
(define (main)
(define p1 (make <peer>))
(define p2 (make <peer>))
(connect-peers p1 p2)
(run-fibers
(lambda ()
(handle-message p1)
(handle-message p2)
(send-message p1 'ping))
#:drain? #t))
(main)
---
Jan Wielkiewicz
prev parent reply other threads:[~2020-07-24 16:19 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-07-21 23:56 GOOPS and fibers - need help understanding what's wrong, bug in fibers/guile? Jan Wielkiewicz
2020-07-22 11:54 ` Chris Vine
2020-07-22 12:28 ` Chris Vine
2020-07-24 16:19 ` Jan Wielkiewicz [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/guile/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200724181924.6667ef10@interia.pl \
--to=tona_kosmicznego_smiecia@interia.pl \
--cc=guile-user@gnu.org \
--cc=vine35792468@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).