Add `network` to actor.rkt
This commit is contained in:
parent
debd191992
commit
bd0278297b
|
@ -1,7 +1,7 @@
|
||||||
#lang racket/base
|
#lang racket/base
|
||||||
|
|
||||||
(provide actor
|
(provide actor
|
||||||
;; network
|
network
|
||||||
;; background
|
;; background
|
||||||
state
|
state
|
||||||
|
|
||||||
|
@ -241,6 +241,20 @@
|
||||||
[(_ I ...)
|
[(_ I ...)
|
||||||
(expand-state 'actor #'(I ... (return/no-link-result!)) #'() #'() #'() #'())]))
|
(expand-state 'actor #'(I ... (return/no-link-result!)) #'() #'() #'() #'())]))
|
||||||
|
|
||||||
|
;; Spawn whole networks
|
||||||
|
(define-syntax (network stx)
|
||||||
|
(syntax-parse stx
|
||||||
|
[(_ I ...)
|
||||||
|
(expand-state 'network
|
||||||
|
#'(I
|
||||||
|
...
|
||||||
|
(do! (quit-world))
|
||||||
|
(return/no-link-result!))
|
||||||
|
#'()
|
||||||
|
#'()
|
||||||
|
#'()
|
||||||
|
#'())]))
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; Main behavior of HLL actors
|
;; Main behavior of HLL actors
|
||||||
|
|
||||||
|
@ -351,10 +365,13 @@
|
||||||
perform-pending-patch
|
perform-pending-patch
|
||||||
(lambda (s)
|
(lambda (s)
|
||||||
(define callee-id (gensym linkage-kind))
|
(define callee-id (gensym linkage-kind))
|
||||||
|
(define spawn-action (action-fn callee-id (actor-state-self-id s)))
|
||||||
(transition (if blocking?
|
(transition (if blocking?
|
||||||
(store-continuation s callee-id get-next-instr)
|
(store-continuation s callee-id get-next-instr)
|
||||||
s)
|
s)
|
||||||
(action-fn callee-id (actor-state-self-id s))))))
|
(if (eq? linkage-kind 'network)
|
||||||
|
(spawn-world spawn-action)
|
||||||
|
spawn-action)))))
|
||||||
(if blocking?
|
(if blocking?
|
||||||
next-t
|
next-t
|
||||||
(handle-actor-syscall next-t (get-next-instr (void))))]
|
(handle-actor-syscall next-t (get-next-instr (void))))]
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
|
|
||||||
(struct says (who what) #:prefab)
|
(struct says (who what) #:prefab)
|
||||||
(struct present (who) #:prefab)
|
(struct present (who) #:prefab)
|
||||||
|
(struct shutdown () #:prefab)
|
||||||
|
|
||||||
(define (spawn-session them us)
|
(define (spawn-session them us)
|
||||||
(actor (define (send-to-remote fmt . vs)
|
(actor (define (send-to-remote fmt . vs)
|
||||||
|
@ -28,14 +29,21 @@
|
||||||
|
|
||||||
(assert (advertise (tcp-channel us them _)) #:meta-level 1)
|
(assert (advertise (tcp-channel us them _)) #:meta-level 1)
|
||||||
(on (message (tcp-channel them us $bs) #:meta-level 1)
|
(on (message (tcp-channel them us $bs) #:meta-level 1)
|
||||||
(send! (says user (string-trim (bytes->string/utf-8 bs))))))))
|
(define input-string (string-trim (bytes->string/utf-8 bs)))
|
||||||
|
(if (equal? input-string "quit-world")
|
||||||
|
(send! (shutdown))
|
||||||
|
(send! (says user input-string)))))))
|
||||||
|
|
||||||
(spawn-tcp-driver)
|
(spawn-tcp-driver)
|
||||||
|
|
||||||
(spawn-world
|
(%%boot
|
||||||
(%%boot
|
(lambda ()
|
||||||
(lambda ()
|
(actor
|
||||||
(actor (define us (tcp-listener 5000))
|
|
||||||
(forever (assert (advertise (observe (tcp-channel _ us _))) #:meta-level 1)
|
(network (define us (tcp-listener 5000))
|
||||||
|
(until (message (shutdown))
|
||||||
|
(assert (advertise (observe (tcp-channel _ us _))) #:meta-level 1)
|
||||||
(on (asserted (advertise (tcp-channel $them us _)) #:meta-level 1)
|
(on (asserted (advertise (tcp-channel $them us _)) #:meta-level 1)
|
||||||
(spawn-session them us)))))))
|
(spawn-session them us))))
|
||||||
|
|
||||||
|
)))
|
||||||
|
|
Loading…
Reference in New Issue