unofficial mirror of guile-user@gnu.org 
 help / color / mirror / Atom feed
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



      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).