X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=loopy.scm;h=01c0b52110d1615648242b9672259479bf7ef350;hb=1b92ec2ba2bcb0aed0e519c558cd2d0a848d8701;hp=ca133b9f79d525825d31d6f90381fa0741683f83;hpb=739417f2cfac537bf7d581d86971f8abbc939f11;p=8sync.git diff --git a/loopy.scm b/loopy.scm index ca133b9..01c0b52 100644 --- a/loopy.scm +++ b/loopy.scm @@ -39,6 +39,11 @@ make-run-request run-request? run-request-proc run-request-when + + make-port-request port-request? + port-request-port + port-request-read port-request-write port-request-except + run-it wrap run run-at run-delay %current-agenda @@ -327,7 +332,7 @@ Will produce (0 . 0) instead of a negative number, if needed." ;;; Request to run stuff ;;; ==================== -(define-immutable-record-type +(define-record-type (make-run-request proc when) run-request? (proc run-request-proc) @@ -359,6 +364,23 @@ Will produce (0 . 0) instead of a negative number, if needed." (make-run-request (wrap body ...) (tdelta delay-time))) +;; A request to set up a port with at least one of read, write, except +;; handling processes + +(define-record-type + (make-port-request-intern port read write except) + port-request? + (port port-request-port) + (read port-request-read) + (write port-request-write) + (except port-request-except)) + +(define* (make-port-request port #:key read write except) + (if (not (or read write except)) + (throw 'no-port-handler-given "No port handler given.\n")) + (make-port-request-intern port read write except)) + + ;;; Asynchronous escape to run things ;;; ================================= @@ -512,6 +534,17 @@ name! (There are 8sync aliases if you prefer that name.)" (update-agenda) agenda)) +(define (agenda-handle-port-request! agenda port-request) + "Update an agenda for a port-request" + (define (handle-selector request-selector port-map-selector) + (if (request-selector port-request) + (hash-set! (port-map-selector agenda) + (port-request-port port-request) + (request-selector port-request)))) + (handle-selector port-request-read agenda-read-port-map) + (handle-selector port-request-write agenda-write-port-map) + (handle-selector port-request-except agenda-except-port-map)) + (define* (start-agenda agenda #:key stop-condition @@ -579,19 +612,21 @@ based on the results" (schedule-at! request-time (run-request-proc run-request))) (#f (enq! next-queue (run-request-proc run-request)))))))) + (define (handle-individual result) + (match result + ((? run-request? new-proc) + (enqueue new-proc)) + ((? port-request? port-request) + (agenda-handle-port-request! agenda port-request)) + ;; do nothing + (_ #f))) ;; @@: We might support delay-wrapped procedures here (match proc-result ;; TODO: replace procedure with something that indicates ;; intent to run. Use a (run foo) procedure - ((? run-request? new-proc) - (enqueue new-proc)) - (((? run-request? new-procs) ...) - (for-each - (lambda (new-proc) - (enqueue new-proc)) - new-procs)) - ;; do nothing - (_ #f)))) + ((results ...) + (for-each handle-individual results)) + (one-result (handle-individual one-result))))) ;; TODO: Alternately, we could return the next-queue ;; along with changes to be added to the schedule here? ;; Return new agenda, with next queue set