bench-ev.rkt 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. #lang racket/base
  2. (module+ main
  3. (require racket/tcp)
  4. (define PORT 8000)
  5. (define RESPONSE #"HTTP/1.1 200 OK\r\nContent-Length: 1\r\n\r\n!")
  6. (define END (bytes-length RESPONSE))
  7. (define BUFFER-SIZE 64)
  8. (define BUFFER (make-bytes BUFFER-SIZE))
  9. (define const-eof (λ (x) eof))
  10. (define EVTS null)
  11. (define l (tcp-listen PORT 10 #t #f))
  12. (define (accept-f l)
  13. (define from (car l))
  14. (define to (cadr l))
  15. (define (read-f from)
  16. (define read-k
  17. ;; XXX This drops performance from about 132k/s to 120k/s,
  18. ;; but is necessary because of crashing the benchmarks
  19. (with-handlers ([exn:fail? const-eof])
  20. (read-bytes-avail!* BUFFER from 0 BUFFER-SIZE)))
  21. (cond
  22. [(eof-object? read-k)
  23. (close-input-port from)
  24. (close-output-port to)
  25. (set! EVTS (remq e EVTS))]
  26. [else
  27. (write-bytes-avail* RESPONSE to 0 END)]))
  28. (define e
  29. (handle-evt from read-f))
  30. (set! EVTS (cons e EVTS)))
  31. (define accept-evt
  32. (handle-evt (tcp-accept-evt l) accept-f))
  33. (printf "Ready\n")
  34. (flush-output)
  35. (let loop ()
  36. (apply sync accept-evt EVTS)
  37. (loop)))