diff --git a/syndicate/syntax.rkt b/syndicate/syntax.rkt index 88b21f3..e4c562e 100644 --- a/syndicate/syntax.rkt +++ b/syndicate/syntax.rkt @@ -434,7 +434,9 @@ (w.wrapper #:linkage [(assert inst) (stop-when (retracted (observe inst)))] #:name name.N - #:assertions [assertions.exprs ...] + #:assertions [inst + (observe (observe inst)) + assertions.exprs ...] O ...)))))])) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/syndicate/test/core/death-during-startup.rkt b/syndicate/test/core/death-during-startup.rkt new file mode 100644 index 0000000..0bbd144 --- /dev/null +++ b/syndicate/test/core/death-during-startup.rkt @@ -0,0 +1,31 @@ +#lang imperative-syndicate/test-implementation +;; An error signalled during setup of a new actor's root facet must +;; cause previous actions to be discarded, but must also cause any +;; initial-assertions, including specifically linkage assertions from +;; during/spawn, to be briefly visible. + +(test-case + [(assertion-struct request (id)) + (assertion-struct response (value)) + + (spawn (during/spawn (request $id) + (printf "starting request handler\n") + (assert (response 'the-answer)) ;; must not be visible + (printf "asserted response, shouldn't be visible\n") + (error 'aieee "oh no") + (printf "NOTREACHED\n"))) + + (spawn (stop-when (asserted (observe (request _))) + (printf "service listening\n") + (react + (assert (request 101)) + (stop-when (retracted (observe (request _))) + (printf "whole service vanished\n")) + (stop-when (retracted (observe (request 101))) + (printf "specific instance vanished\n")) + (stop-when (asserted (response $v)) + (printf "response ~v\n" v)))))] + (expected-output (list "service listening" + "starting request handler" + "asserted response, shouldn't be visible" + "specific instance vanished")))