From f6c145b4a7f6941be6bdfbc86a52449ec844c3ce Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Wed, 12 Jul 2017 11:36:20 -0400 Subject: [PATCH] Fix poor on-stop/post-stop separation. Additional fix for #23. --- racket/syndicate/actor.rkt | 4 +- .../actor/example-termination-scripts-2.rkt | 39 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 racket/syndicate/examples/actor/example-termination-scripts-2.rkt diff --git a/racket/syndicate/actor.rkt b/racket/syndicate/actor.rkt index 92f5409..809e653 100644 --- a/racket/syndicate/actor.rkt +++ b/racket/syndicate/actor.rkt @@ -411,7 +411,9 @@ (parameterize ((current-facet-id (cdr fid))) ;; run in parent context wrt terminating facet (schedule-script! (lambda () (terminate-facet! fid) - (begin/void-default script ...))))))])) + (schedule-script! + (lambda () + (begin/void-default script ...))))))))])) (define-syntax-rule (stop-current-facet) (stop-facet (current-facet-id))) diff --git a/racket/syndicate/examples/actor/example-termination-scripts-2.rkt b/racket/syndicate/examples/actor/example-termination-scripts-2.rkt new file mode 100644 index 0000000..49ccda0 --- /dev/null +++ b/racket/syndicate/examples/actor/example-termination-scripts-2.rkt @@ -0,0 +1,39 @@ +#lang syndicate/actor +;; Demonstrate handling of facet termination. + +(require racket/pretty) + +(struct milestone (facet-id message) #:prefab) +(struct presence (detail) #:prefab) + +(define (milestone! . detail) + (printf ">>> ~v ~v\n" (current-facet-id) detail) + (send! (milestone (current-facet-id) detail))) + +(spawn (field [trace-rev '()]) + (define (push! w x) (trace-rev (cons (list w x) (trace-rev)))) + (on-start + (until (asserted (observe 'E))) + (send! 'E) + (until (retracted (observe 'E))) + (flush!) + (flush!) + (flush!) + (pretty-print (reverse (trace-rev)))) + + (on (asserted (presence $p)) (push! '+ (presence p))) + (on (retracted (presence $p)) (push! '- (presence p))) + (on (message (milestone $w $d)) (push! '! (milestone w d)))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(spawn + (assert (presence 'outer)) + (on-start (milestone! 'on-start 'outer)) + (on-stop (milestone! 'on-stop 'outer)) + + (on (message 'E) + (milestone! 'on-E 'outer 'pre-stop) + (stop-facet (current-facet-id) + (milestone! 'on-E 'outer 'post-stop)) + (milestone! 'on-E 'outer 'mid-stop)))