diff --git a/os2.rkt b/os2.rkt index e93b7ad..718728e 100644 --- a/os2.rkt +++ b/os2.rkt @@ -66,17 +66,18 @@ pending-actions ;; QuasiQueue<(cons PID Action)> ) #:transparent) -(struct endpoint (id ;; EID - topic ;; Topic - handlers ;; Handlers - ) #:transparent) +;; An Endpoint is an (endpoint EID Topic Handlers), representing a +;; facet of a process responsible for playing a particular role (the +;; topic) in a conversation. +(struct endpoint (id topic handlers) #:transparent) -(struct process (id ;; PID - state - next-endpoint-id-number ;; NonnegativeInteger - endpoints ;; Set - ) #:transparent) +;; A Process is an Exists State . (process PID State +;; NonnegativeInteger Set), representing a VM process and its +;; collection of active endpoints. +(struct process (id state next-eid-number endpoints) #:transparent) +;; A Topic is a (topic Role Pattern Boolean), describing an Endpoint's +;; role in a conversation. (struct topic (role pattern virtual?) #:prefab) ;; InterruptK = State -> Transition @@ -242,7 +243,7 @@ (define (do-subscribe pid topic hs k state) (define old-process (hash-ref (vm-processes state) pid)) - (define eid-number (process-next-endpoint-id-number old-process)) + (define eid-number (process-next-eid-number old-process)) (define new-eid (list pid eid-number)) (struct-copy vm (for*/fold ([state (run-trapk state pid k new-eid)]) ([(matching-pid p) (in-hash (vm-processes state))] @@ -271,7 +272,7 @@ [processes (hash-set (vm-processes state) pid (struct-copy process old-process - [next-endpoint-id-number (+ eid-number 1)] + [next-eid-number (+ eid-number 1)] [endpoints (set-add (process-endpoints old-process) new-eid)]))] @@ -332,8 +333,7 @@ (define (run-trapk state pid trap-k . args) (if trap-k (let ((failure-proc (lambda (e) (lambda (process-state) - (transition process-state - (kill #f e)))))) + (transition process-state (kill #f e)))))) (run-ready state pid (apply send-to-user failure-proc trap-k args))) state)) @@ -344,29 +344,26 @@ (define (run-ready state pid interrupt-k) (define old-process (hash-ref (vm-processes state) pid)) - (match-define (transition new-process-state actions) + (define old-state (process-state old-process)) + (match-define (transition new-state actions) (maybe-transition->transition - (send-to-user (lambda (e) (transition (process-state old-process) (kill #f e))) - interrupt-k - (process-state old-process)))) + (send-to-user (lambda (e) (transition old-state (kill #f e))) interrupt-k old-state))) (struct-copy vm (enqueue-actions state pid actions) [processes (hash-set (vm-processes state) pid (struct-copy process old-process - [state new-process-state]))])) + [state new-state]))])) (define (do-spawn spawning-pid thunk k state) (match-define (transition initial-state initial-actions) (send-to-user (lambda (e) (transition #f (kill #f e))) thunk)) (define new-pid (vm-next-process-id state)) - (run-trapk (struct-copy vm (enqueue-actions state new-pid initial-actions) - [processes (hash-set (vm-processes state) new-pid (process new-pid - initial-state - 0 - (set)))] - [next-process-id (+ new-pid 1)]) - spawning-pid - k - new-pid)) + (define spawned-state + (struct-copy vm (enqueue-actions state new-pid initial-actions) + [processes (hash-set (vm-processes state) + new-pid + (process new-pid initial-state 0 (set)))] + [next-process-id (+ new-pid 1)])) + (run-trapk spawned-state spawning-pid k new-pid)) (define (do-kill pid-to-kill reason state) (cond @@ -384,10 +381,8 @@ [pending-actions (append (reverse (for/list ([a (flatten actions)]) (cons pid a))) (vm-pending-actions state))])) -(define (wrap-trapk pid trapk) - (lambda args - (lambda (state) - (apply run-trapk state pid trapk args)))) +(define (((wrap-trapk pid trapk) . args) state) + (apply run-trapk state pid trapk args)) (define (transform-meta-action pid preaction) (match preaction