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"))