thread-socket.scm 1.6 KB

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