thread-socket.scm 1.6 KB

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