guile-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: GOOPS and fibers - need help understanding what's wrong, bug in fibe


From: Jan Wielkiewicz
Subject: Re: GOOPS and fibers - need help understanding what's wrong, bug in fibers/guile?
Date: Fri, 24 Jul 2020 18:19:24 +0200

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 via email to

[Prev in Thread] Current Thread [Next in Thread]