(time agenda-time))
(define (make-async-prompt-tag)
+ "Make an async prompt tag for an agenda.
+
+Generally done automatically for the user through (make-agenda)."
(make-prompt-tag "prompt"))
(define* (make-agenda #:key
(except-port-map (make-hash-table))
(schedule (make-schedule))
(time (gettimeofday)))
+ ;; TODO: document arguments
+ "Make a fresh agenda."
(make-agenda-intern queue prompt
read-port-map write-port-map except-port-map
schedule time))
(sec time-delta-sec)
(usec time-delta-usec))
-(define* (make-time-delta sec #:optional usec)
+(define* (make-time-delta sec #:optional (usec 0))
"Make a <time-delta> of SEC seconds and USEC microseconds.
This is used primarily so the agenda can recognize RUN-REQUEST objects
which are meant "
- (make-time-delta-intern sec (or usec 0)))
+ (make-time-delta-intern sec usec))
(define tdelta make-time-delta)
segments))
-\f
-;;; Port handling
-;;; =============
-
-(define (make-port-mapping)
- (make-hash-table))
-
-(define* (port-mapping-set! port-mapping port #:optional read write except)
- "Sets port-mapping for reader / writer / exception handlers"
- (if (not (or read write except))
- (throw 'no-handlers-given "No handlers given for port" port))
- (hashq-set! port-mapping port
- `#(,read ,write ,except)))
-
-(define (port-mapping-remove! port-mapping port)
- (hashq-remove! port-mapping port))
-
-;; TODO: This is O(n), I'm pretty sure :\
-;; ... it might be worthwhile for us to have a
-;; port-mapping record that keeps a count of how many
-;; handlers (maybe via a promise?)
-(define (port-mapping-empty? port-mapping)
- "Is this port mapping empty?"
- (eq? (hash-count (const #t) port-mapping) 0))
-
-(define (port-mapping-non-empty? port-mapping)
- "Whether this port-mapping contains any elements"
- (not (port-mapping-empty? port-mapping)))
-
-
\f
;;; Request to run stuff
;;; ====================
(define %current-agenda (make-parameter #f))
(define (update-agenda-from-select! agenda)
+ "Potentially (select) on ports specified in agenda, adding items to queue"
(define (hash-keys hash)
(hash-map->list (lambda (k v) k) hash))
(define (get-wait-time)
#:key stop-condition
(get-time gettimeofday)
(handle-ports update-agenda-from-select!))
+ ;; TODO: Document fields
+ "Start up the AGENDA"
(let loop ((agenda agenda))
(let ((agenda
;; @@: Hm, maybe here would be a great place to handle