1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
|
; Part of Scheme 48 1.9. See file COPYING for notices and license.
; Authors: Richard Kelsey, Jonathan Rees
; Code to check the interaction between threads and sockets.
(define (run-server)
(with-multitasking server))
(define (server)
(call-with-values socket-server
(lambda (port-number accept)
(display "Port number is ") (write port-number) (newline)
(let loop ()
(call-with-values accept
(lambda (i-port o-port)
(spawn (service i-port o-port))
(loop)))))))
(define (service i-port o-port)
(lambda ()
(let loop ((total 0))
(let ((next (read i-port)))
(cond ((eof-object? next)
(close-input-port i-port)
(close-output-port o-port))
(else
(let ((total (+ total next)))
(write total o-port)
(newline o-port)
(loop total))))))))
(define (run-users machine port-number . data)
(with-multitasking
(lambda ()
(do ((i 0 (+ i 1))
(d data (cdr d)))
((null? d))
(let ((l (car d)))
(spawn (lambda ()
(user (make-name i) (car l) (cadr l) machine port-number))))))))
(define (make-name i)
(list->string (list (string-ref "ABCDEFGHIJKLMNOPQRSTUVWXYZ" i))))
(define (user id count delay machine port-number)
(call-with-values
(lambda ()
(socket-client machine port-number))
(lambda (i-port o-port)
(let loop ((count count))
(cond ((= 0 count)
(close-input-port i-port)
(close-output-port o-port))
(else
(write 1 o-port)
(newline o-port)
(for-each display (list id " got " (read i-port)))
(newline)
(sleep delay)
(loop (- count 1))))))))
|