34 lines
842 B
Text
34 lines
842 B
Text
(require 'sequences)
|
|
(require 'tasks)
|
|
|
|
;; inter-tasks message : (op-code . data)
|
|
(define (is-message? op message)
|
|
(and message (equal? op (first message))))
|
|
|
|
;; reader task
|
|
(define (reader infile )
|
|
(wait S)
|
|
(define message (semaphore-pop S))
|
|
(when (is-message? 'count message ) (writeln 'reader-> message) (task-stop-all))
|
|
|
|
(if (first infile) ;; not EOF
|
|
(set! message (cons 'write (next infile)))
|
|
(set! message (list 'reader-count-please)))
|
|
|
|
(semaphore-push S message)
|
|
(signal S)
|
|
infile)
|
|
|
|
(define (writer count)
|
|
(wait S)
|
|
(define message (semaphore-pop S))
|
|
(when (is-message? 'write message )
|
|
(writeln (rest message))
|
|
(set! count (1+ count))
|
|
(set! message (cons 'ack count)))
|
|
|
|
(when (is-message? 'reader-count-please message )
|
|
(set! message (cons 'count count)))
|
|
(semaphore-push S message)
|
|
(signal S)
|
|
count)
|