This repository contains a machine-executable implementation of parts of the operational semantics of Chocola, using PLT Redex.
It consists of the following files:
clj-base.rktdefines Lb, the "base" language (based on Clojure)futures.rktdefines Lf, extending the base language with support for futures (as in Clojure)actors.rktdefines La, extending the base language with support for actorstx-atomic.rktdefines Lt, extending Lf with support for transactions (as in Clojure). Transactions execute in a single step, so they are trivially serializable.tx-interleaved.rktdefines another Lt, extending La with support for transactions. Transactions execute in multiple steps, so they can be interleaved.tx-futs.rktdefines Ltf, extending Lt with support for transactional futuresmap.rkt: helper functions for mapsset.rkt: helper functions for sets
Each of the files also contains test cases. (The tests that have been commented out take a long time to execute but should succeed.)
For instance, tx-futs.rkt contains the following test case (named example-tx-futs-3):
(let [(r_0 (ref 0))
(f_0 (fork
(atomic
(let [(x (fork (ref-set r_0 (+ (deref r_0) 1))))
(y (fork (ref-set r_0 (+ (deref r_0) 2))))]
(do (join x) ; => r_0 = original + 1
(join y) ; => r_0 = original + 2
(deref r_0)))))) ; => returns original + 2
(f_1 (fork
(atomic
(let [(x (fork (ref-set r_0 (+ (deref r_0) 3))))
(y (fork (ref-set r_0 (+ (deref r_0) 4))))]
(do (join x) ; => r_0 = original + 3
(join y) ; => r_0 = original + 4
(deref r_0))))))] ; => returns original + 4
(+ (join f_0) (join f_1)))
There are two possible outcomes of this program:
(term [[(f_0 8) (f_new1 6) (f_new 2)]
[(r_new 6) (r_new 5) (r_new 2) (r_new 1) (r_new 0)]])
(term [[(f_0 10) (f_new1 4) (f_new 6)]
[(r_new 6) (r_new 5) (r_new 4) (r_new 3) (r_new 0)]])
These correspond to the two possible serializations: the first corresponds to transaction 1 executing first (end result is 8), the second to transaction 2 executing first (end result is 10).
These results can be visualized using:
(traces ->tf example-tx-futs-3)
This is shown in the image in example-tx-futs-3.pdf. You can see how different interleavings lead to different intermediate states, but they collapse into two final states, corresponding to the two possible serializations.