2016-07-10 16:33:16 +00:00
|
|
|
#lang syndicate/actor
|
2016-02-29 14:43:25 +00:00
|
|
|
;; Toy file system, based on the example in the ESOP2016 submission.
|
2016-04-01 23:53:46 +00:00
|
|
|
;; syndicate/actor implementation, without subconversation.
|
2016-02-29 14:43:25 +00:00
|
|
|
|
2016-07-31 16:17:12 +00:00
|
|
|
(require/activate "fs-shell.rkt")
|
|
|
|
(require/activate "fs-protocol.rkt")
|
2016-02-29 14:43:25 +00:00
|
|
|
(require racket/set)
|
|
|
|
|
2017-02-15 23:18:19 +00:00
|
|
|
(spawn (field [files (hash)] [monitored (set)])
|
2016-08-24 16:35:38 +00:00
|
|
|
(on (asserted (observe (file $name _)))
|
|
|
|
(printf "At least one reader exists for ~v\n" name)
|
|
|
|
(assert! (file name (hash-ref (files) name #f)))
|
|
|
|
(monitored (set-add (monitored) name)))
|
|
|
|
(on (retracted (observe (file $name _)))
|
|
|
|
(printf "No remaining readers exist for ~v\n" name)
|
|
|
|
(retract! (file name (hash-ref (files) name #f)))
|
|
|
|
(monitored (set-remove (monitored) name)))
|
|
|
|
(on (message (save (file $name $content)))
|
|
|
|
(when (set-member? (monitored) name)
|
|
|
|
(retract! (file name (hash-ref (files) name #f)))
|
|
|
|
(assert! (file name content)))
|
|
|
|
(files (hash-set (files) name content)))
|
|
|
|
(on (message (delete $name))
|
|
|
|
(when (set-member? (monitored) name)
|
|
|
|
(retract! (file name (hash-ref (files) name #f)))
|
|
|
|
(assert! (file name #f)))
|
|
|
|
(files (hash-remove (files) name))))
|