[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