From 5181e0fce0e1a8e46f5c80adb9fbf94baf1a224b Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Thu, 15 Dec 2011 16:21:07 -0500 Subject: [PATCH] Pull out event-handling stub, to show where future hooks will go --- simple-udp-service.rkt | 40 +++++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/simple-udp-service.rkt b/simple-udp-service.rkt index 55ac8e9..e776386 100644 --- a/simple-udp-service.rkt +++ b/simple-udp-service.rkt @@ -4,6 +4,7 @@ (require racket/match) (require racket/udp) +(require (only-in srfi/1 append-reverse)) (require "dump-bytes.rkt") (provide (struct-out udp-packet) @@ -53,9 +54,9 @@ (values '() state))) event-handlers)) - (define (dispatch-events events old-state) + (define (dispatch-events events next-events-rev old-state) (if (null? events) - (read-and-dispatch old-state) + (check-for-io (reverse next-events-rev) old-state) (let ((classified-packet (car events))) (define-values (new-events new-state) (let search ((handlers event-handlers)) @@ -63,20 +64,29 @@ [(null? handlers) (default-handler classified-packet old-state)] [((caar handlers) classified-packet) ((cdar handlers) classified-packet old-state)] [else (search (cdr handlers))]))) - (dispatch-events (append (cdr events) new-events) new-state)))) + (dispatch-events (cdr events) + (append-reverse new-events next-events-rev) + new-state)))) - (define (read-and-dispatch old-state) + (define (check-for-io pending-events old-state) (define buffer (make-bytes packet-size-limit)) - (define-values (packet-length source-hostname source-port) - (udp-receive! s buffer)) - (define packet (subbytes buffer 0 packet-length)) + (define new-events + (sync (handle-evt (udp-receive!-evt s buffer) + (match-lambda + [(list packet-length source-hostname source-port) + (define packet (subbytes buffer 0 packet-length)) + (printf ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>~n~v~n" packet) + (dump-bytes! buffer packet-length) + (flush-output) - (printf ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>~n~v~n" packet) - (dump-bytes! buffer packet-length) - (flush-output) + (define packet-and-source + (udp-packet packet source-hostname source-port)) + (define classified-packet (packet-classifier packet-and-source)) + (list classified-packet)])) + (if (null? pending-events) + never-evt ;; Nothing waiting to be done, don't wake up until sth external arrives + (handle-evt (system-idle-evt) + (lambda (dummy) '()))))) + (dispatch-events (append new-events pending-events) '() old-state)) - (define packet-and-source (udp-packet packet source-hostname source-port)) - (define classified-packet (packet-classifier packet-and-source)) - (dispatch-events (list classified-packet) old-state)) - - (read-and-dispatch initial-state)) + (check-for-io '() initial-state))