More concision.
This commit is contained in:
parent
6c66e632f4
commit
b16d723450
58
os.rkt
58
os.rkt
|
@ -160,8 +160,15 @@
|
|||
(define (run-vm state)
|
||||
(let* ((state (requeue-pollers state))
|
||||
(state (run-runnables state))
|
||||
(state (dispatch-messages state)))
|
||||
(trap-to-metalevel state)))
|
||||
(state (dispatch-messages state))
|
||||
(meta-messages (queue->list (vm-pending-meta-messages state)))
|
||||
(meta-handlers (append-map extract-downward-meta-message-handlers (vm-suspensions state)))
|
||||
(poller-k (and (should-poll? state) run-vm)) ;; only block if there's nothing left to do
|
||||
(state (struct-copy vm state [pending-meta-messages (make-queue)])))
|
||||
(kernel-mode-transition (subscription state poller-k meta-handlers '())
|
||||
meta-messages
|
||||
'()
|
||||
'())))
|
||||
|
||||
(define (requeue-pollers state)
|
||||
(foldl (lambda (susp state)
|
||||
|
@ -183,6 +190,22 @@
|
|||
(struct-copy vm state [pending-messages (make-queue)])
|
||||
(queue->list (vm-pending-messages state))))
|
||||
|
||||
(define (extract-downward-meta-message-handlers susp)
|
||||
(for/list ([(hid mmh) (in-hash (suspension-meta-message-handlers susp))])
|
||||
(message-handler (message-handler-pattern mmh) (dispatch-meta-message hid))))
|
||||
|
||||
(define (extract-upward-meta-message-handlers susp)
|
||||
(for/list ([(hid mmh) (in-hash (suspension-meta-message-handlers susp))])
|
||||
(message-handler hid (message-handler-k mmh))))
|
||||
|
||||
(define (((dispatch-meta-message hid) message) state)
|
||||
(run-vm
|
||||
(foldl (match-suspension message
|
||||
(lambda (handler-hid message) (equal? hid handler-hid))
|
||||
extract-upward-meta-message-handlers)
|
||||
(struct-copy vm state [suspensions '()])
|
||||
(vm-suspensions state))))
|
||||
|
||||
;; KernelModeTransition VM -> VM
|
||||
(define (perform-transition transition state)
|
||||
(match transition
|
||||
|
@ -251,37 +274,6 @@
|
|||
(not (queue-empty? (vm-pending-messages state)))
|
||||
(ormap suspension-polling? (vm-suspensions state))))
|
||||
|
||||
(define (trap-to-metalevel state)
|
||||
(define meta-messages (queue->list (vm-pending-meta-messages state)))
|
||||
(define meta-handlers (append-map extract-downward-meta-message-handlers
|
||||
(vm-suspensions state)))
|
||||
(define final-state (struct-copy vm state [pending-meta-messages (make-queue)]))
|
||||
(kernel-mode-transition (subscription final-state
|
||||
(and (should-poll? final-state)
|
||||
;; only block if there's nothing left to do
|
||||
run-vm)
|
||||
meta-handlers
|
||||
'())
|
||||
meta-messages
|
||||
'()
|
||||
'()))
|
||||
|
||||
(define (extract-downward-meta-message-handlers susp)
|
||||
(for/list ([(hid mmh) (in-hash (suspension-meta-message-handlers susp))])
|
||||
(message-handler (message-handler-pattern mmh) (dispatch-meta-message hid))))
|
||||
|
||||
(define (extract-upward-meta-message-handlers susp)
|
||||
(for/list ([(hid mmh) (in-hash (suspension-meta-message-handlers susp))])
|
||||
(message-handler hid (message-handler-k mmh))))
|
||||
|
||||
(define (((dispatch-meta-message hid) message) state)
|
||||
(run-vm
|
||||
(foldl (match-suspension message
|
||||
(lambda (handler-hid message) (equal? hid handler-hid))
|
||||
extract-upward-meta-message-handlers)
|
||||
(struct-copy vm state [suspensions '()])
|
||||
(vm-suspensions state))))
|
||||
|
||||
;;---------------------------------------------------------------------------
|
||||
|
||||
(define (nested-vm-inert? sub)
|
||||
|
|
Loading…
Reference in New Issue