Fix responsibility-handoff for TCP listener.

Similar problems likely still exist elsewhere that the LLL
demand-matcher is used.
This commit is contained in:
Tony Garnock-Jones 2017-08-22 16:53:57 -04:00
parent 930e4270b4
commit 2a0197b711
9 changed files with 300 additions and 5 deletions

View File

@ -43,6 +43,7 @@
retract
sub
unsub
patch->initial-assertions
(rename-out [make-quit quit])
make-actor
@ -145,6 +146,11 @@
(define (unsub pattern)
(patch trie-empty (pattern->trie '<unsub> (observe pattern))))
(define (patch->initial-assertions p)
(when (not (trie-empty? (patch-removed p)))
(error 'patch->initial-assertions "Non-empty removed set in initial assertion patch: ~v" p))
(patch-added p))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (general-transition? v)

View File

@ -94,13 +94,16 @@
(define control-ch (make-channel))
(thread (lambda () (tcp-listener-thread control-ch listener server-addr)))
(actor #:name (list 'drivers/tcp:listen port)
#:assertions*
(patch->initial-assertions
(patch-seq
(sub (advertise (observe (tcp-channel ? server-addr ?)))) ;; monitor peer
(pub (advertise (tcp-channel ? server-addr ?))) ;; declare we might make connections
(sub (inbound (tcp-accepted ? server-addr ? ?))) ;; events from driver thread
))
tcp-listener-behavior
(listener-state control-ch server-addr)
(patch-seq
(sub (advertise (observe (tcp-channel ? server-addr ?)))) ;; monitor peer
(pub (advertise (tcp-channel ? server-addr ?))) ;; declare we might make connections
(sub (inbound (tcp-accepted ? server-addr ? ?))) ;; events from driver thread
)))
(void)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Outbound Connection

View File

@ -0,0 +1,76 @@
(#f #f name-summary ((() . "'ground")))
(#f #s(spacetime (meta) 0) actions-produced 1)
(#f #s(spacetime (0) 1) spawn "drivers/tcp:dm:listener")
(#s(spacetime (0) 1) #s(spacetime (0) 2) actions-produced 1)
(#f #s(spacetime (1) 3) spawn "drivers/tcp:dm:connect")
(#s(spacetime (1) 3) #s(spacetime (1) 4) actions-produced 1)
(#f #s(spacetime (2) 5) spawn "connection-acceptor")
(#s(spacetime (2) 5) #s(spacetime (2) 6) actions-produced 1)
(#f #s(spacetime (3) 7) spawn "configuration-provider")
(#s(spacetime (3) 7) #s(spacetime (3) 8) actions-produced 1)
(#s(spacetime (meta) 0) #s(spacetime () 9) action-interpreted patch "- ::: nothing\n+ <s:observe/1 <s:outbound/1 ★ {#t}\n+ <s:observe/1 <s:observe/1 <s:inbound/1 ★ {#t}\n")
(#s(spacetime (1) 10) #s(spacetime (1) 11) turn-begin)
(#s(spacetime (1) 11) #s(spacetime (1) 12) turn-end)
(#s(spacetime (3) 13) #s(spacetime (3) 14) turn-begin)
(#s(spacetime (3) 14) #s(spacetime (3) 15) turn-end)
(#s(spacetime (2) 16) #s(spacetime (2) 17) turn-begin)
(#s(spacetime (2) 17) #s(spacetime (2) 18) turn-end)
(#s(spacetime (0) 19) #s(spacetime (0) 20) turn-begin)
(#s(spacetime (0) 20) #s(spacetime (0) 21) turn-end)
(#f #s(spacetime () 22) turn-end)
(#s(spacetime () 24) #s(spacetime () 25) turn-begin)
(#s(spacetime (0) 2) #s(spacetime () 26) action-interpreted patch "- ::: nothing\n+ <s:observe/1 <s:advertise/1 <s:observe/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 ★ ★ {#t}\n+ <s:observe/1 <s:advertise/1 <s:advertise/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 ★ ★ {#t}\n+ <s:advertise/1 <s:advertise/1 <s:advertise/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 ★ ★ {#t}\n")
(#s(spacetime (1) 4) #s(spacetime () 27) action-interpreted patch "- ::: nothing\n+ <s:observe/1 <s:observe/1 <s:tcp-channel/3 <s:tcp-handle/1 ★ <s:tcp-address/2 ★ ★ ★ {#t}\n+ <s:observe/1 <s:advertise/1 <s:tcp-channel/3 <s:tcp-handle/1 ★ <s:tcp-address/2 ★ ★ ★ {#t}\n+ <s:advertise/1 <s:observe/1 <s:tcp-channel/3 <s:tcp-handle/1 ★ <s:tcp-address/2 ★ ★ ★ {#t}\n")
(#s(spacetime (2) 6) #s(spacetime () 28) action-interpreted patch "- ::: nothing\n+ <s:observe/1 <s:listen-port/1 ★ {#t}\n+ <s:observe/1 <s:advertise/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 6000 ★ {#t}\n+ <s:advertise/1 <s:observe/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 6000 ★ {#t}\n")
(#s(spacetime () 28) #s(spacetime (0) 29) event patch "- ::: nothing\n+ <s:advertise/1 <s:observe/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 6000 ★ {2}\n" #s(spacetime (2) 6) ((2)))
(#s(spacetime (0) 29) #s(spacetime (0) 30) turn-begin)
(#s(spacetime (0) 30) #s(spacetime (0) 31) turn-end)
(#s(spacetime (0) 31) #s(spacetime (0) 32) actions-produced 1)
(#s(spacetime (3) 8) #s(spacetime () 33) action-interpreted patch "- ::: nothing\n+ <s:listen-port/1 5999 {#t}\n")
(#s(spacetime () 33) #s(spacetime (2) 34) event patch "- ::: nothing\n+ <s:listen-port/1 5999 {3}\n" #s(spacetime (3) 8) ((3)))
(#s(spacetime (2) 34) #s(spacetime (2) 35) turn-begin)
(#s(spacetime (2) 35) #s(spacetime (2) 36) turn-end)
(#s(spacetime (2) 36) #s(spacetime (2) 37) actions-produced 1)
(#s(spacetime (2) 38) #s(spacetime (2) 39) turn-begin)
(#s(spacetime (2) 39) #s(spacetime (2) 40) turn-end)
(#s(spacetime (0) 41) #s(spacetime (0) 42) turn-begin)
(#s(spacetime (0) 42) #s(spacetime (0) 43) turn-end)
(#s(spacetime () 25) #s(spacetime () 44) turn-end)
(#s(spacetime () 46) #s(spacetime () 47) turn-begin)
(#s(spacetime (0) 32) #s(spacetime (4) 48) spawn "(drivers/tcp:listen 6000)")
(#s(spacetime (4) 48) #s(spacetime (4) 49) actions-produced 1)
(#s(spacetime (2) 37) #s(spacetime () 50) action-interpreted patch "- <s:observe/1 <s:advertise/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 6000 ★ {#t}\n- <s:advertise/1 <s:observe/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 6000 ★ {#t}\n+ <s:observe/1 <s:advertise/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 5999 ★ {#t}\n+ <s:advertise/1 <s:observe/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 5999 ★ {#t}\n")
(#s(spacetime () 50) #s(spacetime (0) 51) event patch "- <s:advertise/1 <s:observe/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 6000 ★ {2}\n+ <s:advertise/1 <s:observe/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 5999 ★ {2}\n" #s(spacetime (2) 37) ((2)))
(#s(spacetime (0) 51) #s(spacetime (0) 52) turn-begin)
(#s(spacetime (0) 52) #s(spacetime (0) 53) turn-end)
(#s(spacetime (0) 53) #s(spacetime (0) 54) actions-produced 1)
(#s(spacetime (0) 55) #s(spacetime (0) 56) turn-begin)
(#s(spacetime (0) 56) #s(spacetime (0) 57) turn-end)
(#s(spacetime (4) 58) #s(spacetime (4) 59) turn-begin)
(#s(spacetime (4) 59) #s(spacetime (4) 60) turn-end)
(#s(spacetime () 47) #s(spacetime () 61) turn-end)
(#s(spacetime () 63) #s(spacetime () 64) turn-begin)
(#s(spacetime (4) 49) #s(spacetime () 65) action-interpreted patch "- ::: nothing\n+ <s:observe/1 <s:inbound/1 <s:tcp-accepted/4 ★ <s:tcp-listener/1 6000 ★ ★ {#t}\n+ <s:observe/1 <s:advertise/1 <s:observe/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 6000 ★ {#t}\n+ <s:advertise/1 <s:advertise/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 6000 ★ {#t}\n")
(#s(spacetime () 65) #s(spacetime (0) 66) event patch "- ::: nothing\n+ <s:advertise/1 <s:advertise/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 6000 ★ {4}\n" #s(spacetime (4) 49) ((4)))
(#s(spacetime (0) 66) #s(spacetime (0) 67) turn-begin)
(#s(spacetime (0) 67) #s(spacetime (0) 68) turn-end)
(#s(spacetime (0) 54) #s(spacetime (5) 70) spawn "(drivers/tcp:listen 5999)")
(#s(spacetime (5) 70) #s(spacetime (5) 71) actions-produced 1)
(#s(spacetime (5) 72) #s(spacetime (5) 73) turn-begin)
(#s(spacetime (5) 73) #s(spacetime (5) 74) turn-end)
(#s(spacetime (0) 75) #s(spacetime (0) 76) turn-begin)
(#s(spacetime (0) 76) #s(spacetime (0) 77) turn-end)
(#s(spacetime () 64) #s(spacetime () 78) turn-end)
(#s(spacetime () 80) #s(spacetime () 81) turn-begin)
(#s(spacetime (5) 71) #s(spacetime () 82) action-interpreted patch "- ::: nothing\n+ <s:observe/1 <s:inbound/1 <s:tcp-accepted/4 ★ <s:tcp-listener/1 5999 ★ ★ {#t}\n+ <s:observe/1 <s:advertise/1 <s:observe/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 5999 ★ {#t}\n+ <s:advertise/1 <s:advertise/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 5999 ★ {#t}\n")
(#s(spacetime () 82) #s(spacetime (0) 83) event patch "- ::: nothing\n+ <s:advertise/1 <s:advertise/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 5999 ★ {5}\n" #s(spacetime (5) 71) ((5)))
(#s(spacetime (0) 83) #s(spacetime (0) 84) turn-begin)
(#s(spacetime (0) 84) #s(spacetime (0) 85) turn-end)
(#s(spacetime () 82) #s(spacetime (5) 87) event patch "- ::: nothing\n+ <s:advertise/1 <s:observe/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 5999 ★ {2}\n" #s(spacetime (5) 71) ((2)))
(#s(spacetime (5) 87) #s(spacetime (5) 88) turn-begin)
(#s(spacetime (5) 88) #s(spacetime (5) 89) turn-end)
(#s(spacetime (0) 90) #s(spacetime (0) 91) turn-begin)
(#s(spacetime (0) 91) #s(spacetime (0) 92) turn-end)
(#s(spacetime () 81) #s(spacetime () 93) turn-end)
(#s(spacetime () 95) #s(spacetime () 96) turn-begin)
(#s(spacetime () 96) #s(spacetime () 97) turn-end)

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 KiB

View File

@ -0,0 +1,91 @@
(#f #f name-summary ((() . "'ground")))
(#f #s(spacetime (meta) 0) actions-produced 1)
(#f #s(spacetime (0) 1) spawn "drivers/tcp:dm:listener")
(#s(spacetime (0) 1) #s(spacetime (0) 2) actions-produced 1)
(#f #s(spacetime (1) 3) spawn "drivers/tcp:dm:connect")
(#s(spacetime (1) 3) #s(spacetime (1) 4) actions-produced 1)
(#f #s(spacetime (2) 5) spawn "connection-acceptor")
(#s(spacetime (2) 5) #s(spacetime (2) 6) actions-produced 1)
(#f #s(spacetime (3) 7) spawn "configuration-provider")
(#s(spacetime (3) 7) #s(spacetime (3) 8) actions-produced 1)
(#s(spacetime (meta) 0) #s(spacetime () 9) action-interpreted patch "- ::: nothing\n+ <s:observe/1 <s:outbound/1 ★ {#t}\n+ <s:observe/1 <s:observe/1 <s:inbound/1 ★ {#t}\n")
(#s(spacetime (1) 10) #s(spacetime (1) 11) turn-begin)
(#s(spacetime (1) 11) #s(spacetime (1) 12) turn-end)
(#s(spacetime (3) 13) #s(spacetime (3) 14) turn-begin)
(#s(spacetime (3) 14) #s(spacetime (3) 15) turn-end)
(#s(spacetime (2) 16) #s(spacetime (2) 17) turn-begin)
(#s(spacetime (2) 17) #s(spacetime (2) 18) turn-end)
(#s(spacetime (0) 19) #s(spacetime (0) 20) turn-begin)
(#s(spacetime (0) 20) #s(spacetime (0) 21) turn-end)
(#f #s(spacetime () 22) turn-end)
(#s(spacetime () 24) #s(spacetime () 25) turn-begin)
(#s(spacetime (0) 2) #s(spacetime () 26) action-interpreted patch "- ::: nothing\n+ <s:observe/1 <s:advertise/1 <s:observe/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 ★ ★ {#t}\n+ <s:observe/1 <s:advertise/1 <s:advertise/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 ★ ★ {#t}\n+ <s:advertise/1 <s:advertise/1 <s:advertise/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 ★ ★ {#t}\n")
(#s(spacetime (1) 4) #s(spacetime () 27) action-interpreted patch "- ::: nothing\n+ <s:observe/1 <s:observe/1 <s:tcp-channel/3 <s:tcp-handle/1 ★ <s:tcp-address/2 ★ ★ ★ {#t}\n+ <s:observe/1 <s:advertise/1 <s:tcp-channel/3 <s:tcp-handle/1 ★ <s:tcp-address/2 ★ ★ ★ {#t}\n+ <s:advertise/1 <s:observe/1 <s:tcp-channel/3 <s:tcp-handle/1 ★ <s:tcp-address/2 ★ ★ ★ {#t}\n")
(#s(spacetime (2) 6) #s(spacetime () 28) action-interpreted patch "- ::: nothing\n+ <s:observe/1 <s:listen-port/1 ★ {#t}\n+ <s:observe/1 <s:advertise/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 6000 ★ {#t}\n+ <s:advertise/1 <s:observe/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 6000 ★ {#t}\n")
(#s(spacetime () 28) #s(spacetime (0) 29) event patch "- ::: nothing\n+ <s:advertise/1 <s:observe/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 6000 ★ {2}\n" #s(spacetime (2) 6) ((2)))
(#s(spacetime (0) 29) #s(spacetime (0) 30) turn-begin)
(#s(spacetime (0) 30) #s(spacetime (0) 31) turn-end)
(#s(spacetime (0) 31) #s(spacetime (0) 32) actions-produced 1)
(#s(spacetime (3) 8) #s(spacetime () 33) action-interpreted patch "- ::: nothing\n+ <s:listen-port/1 5999 {#t}\n")
(#s(spacetime () 33) #s(spacetime (2) 34) event patch "- ::: nothing\n+ <s:listen-port/1 5999 {3}\n" #s(spacetime (3) 8) ((3)))
(#s(spacetime (2) 34) #s(spacetime (2) 35) turn-begin)
(#s(spacetime (2) 35) #s(spacetime (2) 36) turn-end)
(#s(spacetime (2) 36) #s(spacetime (2) 37) actions-produced 1)
(#s(spacetime (2) 38) #s(spacetime (2) 39) turn-begin)
(#s(spacetime (2) 39) #s(spacetime (2) 40) turn-end)
(#s(spacetime (0) 41) #s(spacetime (0) 42) turn-begin)
(#s(spacetime (0) 42) #s(spacetime (0) 43) turn-end)
(#s(spacetime () 25) #s(spacetime () 44) turn-end)
(#s(spacetime () 46) #s(spacetime () 47) turn-begin)
(#s(spacetime (0) 32) #s(spacetime (4) 48) spawn "(drivers/tcp:listen 6000)")
(#s(spacetime (4) 48) #s(spacetime (4) 49) actions-produced 1)
(#s(spacetime (4) 48) #s(spacetime (4) 50) actions-produced 1)
(#s(spacetime (4) 49) #s(spacetime () 51) action-interpreted patch "- ::: nothing\n+ <s:observe/1 <s:advertise/1 <s:observe/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 6000 ★ {#t}\n")
(#s(spacetime () 51) #s(spacetime (4) 52) event patch "- ::: nothing\n+ <s:advertise/1 <s:observe/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 6000 ★ {2}\n" #s(spacetime (4) 49) ((2)))
(#s(spacetime (4) 52) #s(spacetime (4) 53) turn-begin)
(#s(spacetime (4) 53) #s(spacetime (4) 54) turn-end)
(#s(spacetime (2) 37) #s(spacetime () 55) action-interpreted patch "- <s:observe/1 <s:advertise/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 6000 ★ {#t}\n- <s:advertise/1 <s:observe/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 6000 ★ {#t}\n+ <s:observe/1 <s:advertise/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 5999 ★ {#t}\n+ <s:advertise/1 <s:observe/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 5999 ★ {#t}\n")
(#s(spacetime () 55) #s(spacetime (0) 56) event patch "- <s:advertise/1 <s:observe/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 6000 ★ {2}\n+ <s:advertise/1 <s:observe/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 5999 ★ {2}\n" #s(spacetime (2) 37) ((2)))
(#s(spacetime (0) 56) #s(spacetime (0) 57) turn-begin)
(#s(spacetime (0) 57) #s(spacetime (0) 58) turn-end)
(#s(spacetime (0) 58) #s(spacetime (0) 59) actions-produced 1)
(#s(spacetime () 55) #s(spacetime (4) 60) event patch "- <s:advertise/1 <s:observe/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 6000 ★ {2}\n+ ::: nothing\n" #s(spacetime (2) 37) ((2)))
(#s(spacetime (4) 60) #s(spacetime (4) 61) turn-begin)
(#s(spacetime (4) 61) #s(spacetime (4) 62) turn-end)
(#s(spacetime (4) 62) #s(spacetime (4) 63) exit "#f")
(#s(spacetime (4) 62) #s(spacetime (4) 64) actions-produced 1)
(#s(spacetime (0) 65) #s(spacetime (0) 66) turn-begin)
(#s(spacetime (0) 66) #s(spacetime (0) 67) turn-end)
(#s(spacetime () 47) #s(spacetime () 68) turn-end)
(#s(spacetime () 70) #s(spacetime () 71) turn-begin)
(#s(spacetime (4) 50) #s(spacetime () 72) action-interpreted patch "- ::: nothing\n+ <s:observe/1 <s:inbound/1 <s:tcp-accepted/4 ★ <s:tcp-listener/1 6000 ★ ★ {#t}\n+ <s:advertise/1 <s:advertise/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 6000 ★ {#t}\n")
(#s(spacetime () 72) #s(spacetime (0) 73) event patch "- ::: nothing\n+ <s:advertise/1 <s:advertise/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 6000 ★ {4}\n" #s(spacetime (4) 50) ((4)))
(#s(spacetime (0) 73) #s(spacetime (0) 74) turn-begin)
(#s(spacetime (0) 74) #s(spacetime (0) 75) turn-end)
(#s(spacetime (0) 59) #s(spacetime (5) 77) spawn "(drivers/tcp:listen 5999)")
(#s(spacetime (5) 77) #s(spacetime (5) 78) actions-produced 1)
(#s(spacetime (5) 77) #s(spacetime (5) 79) actions-produced 1)
(#s(spacetime (5) 78) #s(spacetime () 80) action-interpreted patch "- ::: nothing\n+ <s:observe/1 <s:advertise/1 <s:observe/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 5999 ★ {#t}\n")
(#s(spacetime () 80) #s(spacetime (5) 81) event patch "- ::: nothing\n+ <s:advertise/1 <s:observe/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 5999 ★ {2}\n" #s(spacetime (5) 78) ((2)))
(#s(spacetime (5) 81) #s(spacetime (5) 82) turn-begin)
(#s(spacetime (5) 82) #s(spacetime (5) 83) turn-end)
(#s(spacetime (4) 64) #s(spacetime () 84) action-interpreted patch "- <s:observe/1 <s:inbound/1 <s:tcp-accepted/4 ★ <s:tcp-listener/1 6000 ★ ★ {#t}\n- <s:observe/1 <s:advertise/1 <s:observe/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 6000 ★ {#t}\n- <s:advertise/1 <s:advertise/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 6000 ★ {#t}\n+ ::: nothing\n")
(#s(spacetime () 84) #s(spacetime (0) 85) event patch "- <s:advertise/1 <s:advertise/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 6000 ★ {4}\n+ ::: nothing\n" #s(spacetime (4) 64) ((4)))
(#s(spacetime (0) 85) #s(spacetime (0) 86) turn-begin)
(#s(spacetime (0) 86) #s(spacetime (0) 87) turn-end)
(#s(spacetime (4) 64) #s(spacetime () 89) quit)
(#s(spacetime (5) 90) #s(spacetime (5) 91) turn-begin)
(#s(spacetime (5) 91) #s(spacetime (5) 92) turn-end)
(#s(spacetime (0) 93) #s(spacetime (0) 94) turn-begin)
(#s(spacetime (0) 94) #s(spacetime (0) 95) turn-end)
(#s(spacetime () 71) #s(spacetime () 96) turn-end)
(#s(spacetime () 98) #s(spacetime () 99) turn-begin)
(#s(spacetime (5) 79) #s(spacetime () 100) action-interpreted patch "- ::: nothing\n+ <s:observe/1 <s:inbound/1 <s:tcp-accepted/4 ★ <s:tcp-listener/1 5999 ★ ★ {#t}\n+ <s:advertise/1 <s:advertise/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 5999 ★ {#t}\n")
(#s(spacetime () 100) #s(spacetime (0) 101) event patch "- ::: nothing\n+ <s:advertise/1 <s:advertise/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 5999 ★ {5}\n" #s(spacetime (5) 79) ((5)))
(#s(spacetime (0) 101) #s(spacetime (0) 102) turn-begin)
(#s(spacetime (0) 102) #s(spacetime (0) 103) turn-end)
(#s(spacetime (0) 105) #s(spacetime (0) 106) turn-begin)
(#s(spacetime (0) 106) #s(spacetime (0) 107) turn-end)
(#s(spacetime () 99) #s(spacetime () 108) turn-end)
(#s(spacetime () 110) #s(spacetime () 111) turn-begin)
(#s(spacetime () 111) #s(spacetime () 112) turn-end)

Binary file not shown.

After

Width:  |  Height:  |  Size: 259 KiB

View File

@ -0,0 +1,83 @@
(#f #f name-summary ((() . "'ground")))
(#f #s(spacetime (meta) 0) actions-produced 1)
(#f #s(spacetime (0) 1) spawn "drivers/tcp:dm:listener")
(#s(spacetime (0) 1) #s(spacetime (0) 2) actions-produced 1)
(#f #s(spacetime (1) 3) spawn "drivers/tcp:dm:connect")
(#s(spacetime (1) 3) #s(spacetime (1) 4) actions-produced 1)
(#f #s(spacetime (2) 5) spawn "connection-acceptor")
(#s(spacetime (2) 5) #s(spacetime (2) 6) actions-produced 1)
(#f #s(spacetime (3) 7) spawn "configuration-provider")
(#s(spacetime (3) 7) #s(spacetime (3) 8) actions-produced 1)
(#s(spacetime (meta) 0) #s(spacetime () 9) action-interpreted patch "- ::: nothing\n+ <s:observe/1 <s:outbound/1 ★ {#t}\n+ <s:observe/1 <s:observe/1 <s:inbound/1 ★ {#t}\n")
(#s(spacetime (1) 10) #s(spacetime (1) 11) turn-begin)
(#s(spacetime (1) 11) #s(spacetime (1) 12) turn-end)
(#s(spacetime (3) 13) #s(spacetime (3) 14) turn-begin)
(#s(spacetime (3) 14) #s(spacetime (3) 15) turn-end)
(#s(spacetime (2) 16) #s(spacetime (2) 17) turn-begin)
(#s(spacetime (2) 17) #s(spacetime (2) 18) turn-end)
(#s(spacetime (0) 19) #s(spacetime (0) 20) turn-begin)
(#s(spacetime (0) 20) #s(spacetime (0) 21) turn-end)
(#f #s(spacetime () 22) turn-end)
(#s(spacetime () 24) #s(spacetime () 25) turn-begin)
(#s(spacetime (0) 2) #s(spacetime () 26) action-interpreted patch "- ::: nothing\n+ <s:observe/1 <s:advertise/1 <s:observe/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 ★ ★ {#t}\n+ <s:observe/1 <s:advertise/1 <s:advertise/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 ★ ★ {#t}\n+ <s:advertise/1 <s:advertise/1 <s:advertise/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 ★ ★ {#t}\n")
(#s(spacetime (1) 4) #s(spacetime () 27) action-interpreted patch "- ::: nothing\n+ <s:observe/1 <s:observe/1 <s:tcp-channel/3 <s:tcp-handle/1 ★ <s:tcp-address/2 ★ ★ ★ {#t}\n+ <s:observe/1 <s:advertise/1 <s:tcp-channel/3 <s:tcp-handle/1 ★ <s:tcp-address/2 ★ ★ ★ {#t}\n+ <s:advertise/1 <s:observe/1 <s:tcp-channel/3 <s:tcp-handle/1 ★ <s:tcp-address/2 ★ ★ ★ {#t}\n")
(#s(spacetime (2) 6) #s(spacetime () 28) action-interpreted patch "- ::: nothing\n+ <s:observe/1 <s:listen-port/1 ★ {#t}\n+ <s:observe/1 <s:advertise/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 6000 ★ {#t}\n+ <s:advertise/1 <s:observe/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 6000 ★ {#t}\n")
(#s(spacetime () 28) #s(spacetime (0) 29) event patch "- ::: nothing\n+ <s:advertise/1 <s:observe/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 6000 ★ {2}\n" #s(spacetime (2) 6) ((2)))
(#s(spacetime (0) 29) #s(spacetime (0) 30) turn-begin)
(#s(spacetime (0) 30) #s(spacetime (0) 31) turn-end)
(#s(spacetime (0) 31) #s(spacetime (0) 32) actions-produced 1)
(#s(spacetime (3) 8) #s(spacetime () 33) action-interpreted patch "- ::: nothing\n+ <s:listen-port/1 5999 {#t}\n")
(#s(spacetime () 33) #s(spacetime (2) 34) event patch "- ::: nothing\n+ <s:listen-port/1 5999 {3}\n" #s(spacetime (3) 8) ((3)))
(#s(spacetime (2) 34) #s(spacetime (2) 35) turn-begin)
(#s(spacetime (2) 35) #s(spacetime (2) 36) turn-end)
(#s(spacetime (2) 36) #s(spacetime (2) 37) actions-produced 1)
(#s(spacetime (2) 38) #s(spacetime (2) 39) turn-begin)
(#s(spacetime (2) 39) #s(spacetime (2) 40) turn-end)
(#s(spacetime (0) 41) #s(spacetime (0) 42) turn-begin)
(#s(spacetime (0) 42) #s(spacetime (0) 43) turn-end)
(#s(spacetime () 25) #s(spacetime () 44) turn-end)
(#s(spacetime () 46) #s(spacetime () 47) turn-begin)
(#s(spacetime (0) 32) #s(spacetime (4) 48) spawn "(drivers/tcp:listen 6000)")
(#s(spacetime (4) 48) #s(spacetime (4) 49) actions-produced 1)
(#s(spacetime (4) 49) #s(spacetime () 51) action-interpreted patch "- ::: nothing\n+ <s:observe/1 <s:inbound/1 <s:tcp-accepted/4 ★ <s:tcp-listener/1 6000 ★ ★ {#t}\n+ <s:observe/1 <s:advertise/1 <s:observe/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 6000 ★ {#t}\n+ <s:advertise/1 <s:advertise/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 6000 ★ {#t}\n")
(#s(spacetime () 51) #s(spacetime (0) 52) event patch "- ::: nothing\n+ <s:advertise/1 <s:advertise/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 6000 ★ {4}\n" #s(spacetime (4) 49) ((4)))
(#s(spacetime (0) 52) #s(spacetime (0) 53) turn-begin)
(#s(spacetime (0) 53) #s(spacetime (0) 54) turn-end)
(#s(spacetime () 51) #s(spacetime (4) 56) event patch "- ::: nothing\n+ <s:advertise/1 <s:observe/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 6000 ★ {2}\n" #s(spacetime (4) 49) ((2)))
(#s(spacetime (4) 56) #s(spacetime (4) 57) turn-begin)
(#s(spacetime (4) 57) #s(spacetime (4) 58) turn-end)
(#s(spacetime (2) 37) #s(spacetime () 59) action-interpreted patch "- <s:observe/1 <s:advertise/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 6000 ★ {#t}\n- <s:advertise/1 <s:observe/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 6000 ★ {#t}\n+ <s:observe/1 <s:advertise/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 5999 ★ {#t}\n+ <s:advertise/1 <s:observe/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 5999 ★ {#t}\n")
(#s(spacetime () 59) #s(spacetime (0) 60) event patch "- <s:advertise/1 <s:observe/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 6000 ★ {2}\n+ <s:advertise/1 <s:observe/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 5999 ★ {2}\n" #s(spacetime (2) 37) ((2)))
(#s(spacetime (0) 60) #s(spacetime (0) 61) turn-begin)
(#s(spacetime (0) 61) #s(spacetime (0) 62) turn-end)
(#s(spacetime (0) 62) #s(spacetime (0) 63) actions-produced 1)
(#s(spacetime () 59) #s(spacetime (4) 64) event patch "- <s:advertise/1 <s:observe/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 6000 ★ {2}\n+ ::: nothing\n" #s(spacetime (2) 37) ((2)))
(#s(spacetime (4) 64) #s(spacetime (4) 65) turn-begin)
(#s(spacetime (4) 65) #s(spacetime (4) 66) turn-end)
(#s(spacetime (4) 66) #s(spacetime (4) 67) exit "#f")
(#s(spacetime (4) 66) #s(spacetime (4) 68) actions-produced 1)
(#s(spacetime (0) 69) #s(spacetime (0) 70) turn-begin)
(#s(spacetime (0) 70) #s(spacetime (0) 71) turn-end)
(#s(spacetime () 47) #s(spacetime () 72) turn-end)
(#s(spacetime () 74) #s(spacetime () 75) turn-begin)
(#s(spacetime (0) 63) #s(spacetime (5) 76) spawn "(drivers/tcp:listen 5999)")
(#s(spacetime (5) 76) #s(spacetime (5) 77) actions-produced 1)
(#s(spacetime (5) 77) #s(spacetime () 79) action-interpreted patch "- ::: nothing\n+ <s:observe/1 <s:inbound/1 <s:tcp-accepted/4 ★ <s:tcp-listener/1 5999 ★ ★ {#t}\n+ <s:observe/1 <s:advertise/1 <s:observe/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 5999 ★ {#t}\n+ <s:advertise/1 <s:advertise/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 5999 ★ {#t}\n")
(#s(spacetime () 79) #s(spacetime (0) 80) event patch "- ::: nothing\n+ <s:advertise/1 <s:advertise/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 5999 ★ {5}\n" #s(spacetime (5) 77) ((5)))
(#s(spacetime (0) 80) #s(spacetime (0) 81) turn-begin)
(#s(spacetime (0) 81) #s(spacetime (0) 82) turn-end)
(#s(spacetime () 79) #s(spacetime (5) 84) event patch "- ::: nothing\n+ <s:advertise/1 <s:observe/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 5999 ★ {2}\n" #s(spacetime (5) 77) ((2)))
(#s(spacetime (5) 84) #s(spacetime (5) 85) turn-begin)
(#s(spacetime (5) 85) #s(spacetime (5) 86) turn-end)
(#s(spacetime (4) 68) #s(spacetime () 87) action-interpreted patch "- <s:observe/1 <s:inbound/1 <s:tcp-accepted/4 ★ <s:tcp-listener/1 6000 ★ ★ {#t}\n- <s:observe/1 <s:advertise/1 <s:observe/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 6000 ★ {#t}\n- <s:advertise/1 <s:advertise/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 6000 ★ {#t}\n+ ::: nothing\n")
(#s(spacetime () 87) #s(spacetime (0) 88) event patch "- <s:advertise/1 <s:advertise/1 <s:tcp-channel/3 ★ <s:tcp-listener/1 6000 ★ {4}\n+ ::: nothing\n" #s(spacetime (4) 68) ((4)))
(#s(spacetime (0) 88) #s(spacetime (0) 89) turn-begin)
(#s(spacetime (0) 89) #s(spacetime (0) 90) turn-end)
(#s(spacetime (4) 68) #s(spacetime () 92) quit)
(#s(spacetime (5) 93) #s(spacetime (5) 94) turn-begin)
(#s(spacetime (5) 94) #s(spacetime (5) 95) turn-end)
(#s(spacetime (0) 96) #s(spacetime (0) 97) turn-begin)
(#s(spacetime (0) 97) #s(spacetime (0) 98) turn-end)
(#s(spacetime () 75) #s(spacetime () 99) turn-end)
(#s(spacetime () 101) #s(spacetime () 102) turn-begin)
(#s(spacetime () 102) #s(spacetime () 103) turn-end)

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 KiB

View File

@ -0,0 +1,36 @@
#lang syndicate/actor
;; Example showing an interesting design flaw (?) (bug?) in the
;; old-school LLL demand-matcher when demand changes too quickly. The
;; port 6000 server is started, but by the time it starts monitoring
;; demand for its services, the demand is already gone, replaced with
;; demand for port 5999. This causes connections to be accepted on
;; port 6000 going nowhere.
;;
;; One fix is to use #:assertions to give the TCP listener actor some
;; initial interests, thus transferring responsibility atomically.
;; Another is to modify the demand-matcher to do something like
;; `during/spawn` is doing, using an auxiliary protocol to centralise
;; tracking of demand and supply at the demand-matcher rather than
;; delegating it to the services.
(require syndicate/protocol/advertise)
(require/activate syndicate/drivers/tcp)
(struct listen-port (number) #:prefab) ;; assertion
(define default-port 6000)
(spawn #:name 'connection-acceptor
(define/query-value port default-port (listen-port $v) v)
(assert (advertise (observe (tcp-channel _ (tcp-listener (port)) _))))
(during (advertise (tcp-channel $c (tcp-listener (port)) _))
(let ((accepted-port (port))) ;; capture field value at time of connect
(assert (advertise (tcp-channel (tcp-listener accepted-port) c _)))
(on-start
(printf "Accepted connection from ~v on port ~a\n" c accepted-port)
(send! (tcp-channel (tcp-listener accepted-port) c #"Hello!\n")))
(on-stop
(printf "Closed connection ~v on port ~a\n" c accepted-port)))))
(spawn #:name 'configuration-provider
(assert (listen-port 5999)))