49 lines
1.4 KiB
Racket
49 lines
1.4 KiB
Racket
#lang racket/base
|
|
;; Trivial demonstration of an os2.rkt virtual machine.
|
|
|
|
(require "os2.rkt")
|
|
(require "os2-timer.rkt")
|
|
(require racket/pretty)
|
|
|
|
(define (sleep state n k)
|
|
(define id (gensym 'sleep-id))
|
|
(transition state
|
|
(send-message (set-timer id n 'relative))
|
|
(role 'sleeper (topic-subscriber (timer-expired id (wild)))
|
|
#:state state
|
|
[(timer-expired (== id) now)
|
|
(sequence-actions state
|
|
k
|
|
(delete-role id))])))
|
|
|
|
(define (example-process delay)
|
|
(write `(sleeping for ,delay milliseconds))
|
|
(newline)
|
|
(sleep 'no-state
|
|
delay
|
|
(lambda (state)
|
|
(if (> delay 1500)
|
|
(error 'example-process "Oh noes!")
|
|
(begin (write `(awoke after ,delay milliseconds))
|
|
(newline)
|
|
(transition state (kill)))))))
|
|
|
|
(define spy
|
|
(lambda (spy-pid)
|
|
(define (hs label)
|
|
(define ((w kind) . args) (write `(,label ,kind ,@args)) (newline) values)
|
|
(handlers (w 'presence)
|
|
(w 'absence)
|
|
(w 'message)))
|
|
(transition 'spy-state
|
|
(add-role 's->p (topic-publisher (wild) #:virtual? #t) (hs 'subscriber->publisher))
|
|
(add-role 'p->s (topic-subscriber (wild) #:virtual? #t) (hs 'publisher->subscriber)))))
|
|
|
|
(ground-vm (lambda (boot-pid)
|
|
(transition 'no-state
|
|
(spawn (timer-driver 'example-timer-driver))
|
|
(spawn spy)
|
|
(spawn (lambda (pid) (example-process 1000)))
|
|
(spawn (lambda (pid) (example-process 2000)))
|
|
(kill))))
|