From f3ca2b6a15a1f50043040f7dd43be367a3afb784 Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Mon, 30 Apr 2018 22:47:25 +0100 Subject: [PATCH] Repair incorrect interleaving of actions and scripts --- syndicate/dataspace.rkt | 6 ++++-- syndicate/test/core/state-machine.rkt | 27 +++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 syndicate/test/core/state-machine.rkt diff --git a/syndicate/dataspace.rkt b/syndicate/dataspace.rkt index 3d52d52..46d920f 100644 --- a/syndicate/dataspace.rkt +++ b/syndicate/dataspace.rkt @@ -367,7 +367,8 @@ [(quit) (apply-patch! ds ac (actor-cleanup-changes ac))] [(deferred-turn k) - (push-script! ac k)])))) + (push-script! ac k)]) + (run-all-pending-scripts! ds)))) (define (apply-patch! ds ac delta) (define ds-assertions (dataspace-assertions ds)) @@ -389,7 +390,8 @@ ;; TODO: figure out when a dataspace should quit itself. Given the ;; mutable nature of the implementation, maybe never? It might be ;; being held elsewhere! - (not (null? (dataspace-runnable ds)))) + (not (and (null? (dataspace-runnable ds)) + (queue-empty? (dataspace-pending-actions ds))))) (define (add-facet! where actor parent boot-proc) (when (and (not (in-script?)) where) diff --git a/syndicate/test/core/state-machine.rkt b/syndicate/test/core/state-machine.rkt new file mode 100644 index 0000000..1c2cc6c --- /dev/null +++ b/syndicate/test/core/state-machine.rkt @@ -0,0 +1,27 @@ +#lang imperative-syndicate/test-implementation + +(test-case + [(message-struct toggle ()) + (spawn* #:name 'flip-flop + (define (even) + (react (stop-when (message (toggle)) (odd)) + (on-start (printf "+even\n")) + (on-stop (printf "-even\n")))) + (define (odd) + (react (stop-when (message (toggle)) (even)) + (on-start (printf "+odd\n")) + (on-stop (printf "-odd\n")))) + (even)) + (spawn* #:name 'main + (until (asserted (observe (toggle)))) + (send! (toggle)) + (send! (toggle)) + (send! (toggle)))] + no-crashes + (expected-output "+even" + "-even" + "+odd" + "-odd" + "+even" + "-even" + "+odd"))