1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- #!/usr/bin/env guile
- # -*- scheme -*-
- !#
- (use-modules (ice-9 match)
- (fibers)
- (fibers channels))
- (define (make-chain link-count make-head make-link make-tail)
- (let lp ((link-count link-count) (ch (make-head)))
- (if (zero? link-count)
- (make-tail ch)
- (lp (1- link-count) (make-link ch)))))
- (define (test link-count message-count)
- (get-message
- (make-chain
- link-count
- (lambda ()
- (let ((out (make-channel)))
- (spawn-fiber (lambda ()
- (let lp ((n 0))
- (put-message out n)
- (lp (1+ n))))
- #:parallel? #t)
- out))
- (lambda (in)
- (let ((out (make-channel)))
- (spawn-fiber (lambda ()
- (let lp ()
- (put-message out (get-message in))
- (lp)))
- #:parallel? #t)
- out))
- (lambda (in)
- (let ((out (make-channel)))
- (spawn-fiber (lambda ()
- (let lp ()
- (if (< (get-message in) message-count)
- (lp)
- (put-message out 'done))))
- #:parallel? #t)
- out)))))
- (define (main args)
- (match args
- ((_ link-count message-count)
- (let ((link-count (string->number link-count))
- (message-count (string->number message-count)))
- (run-fibers (lambda () (test link-count message-count)))))))
- (when (batch-mode?) (main (program-arguments)))
|