message delivery flow

This commit is contained in:
Evgeny Poberezkin
2020-10-19 08:43:36 +01:00
parent 7c5dc31d1a
commit ff49009be1
2 changed files with 396 additions and 0 deletions

70
design/delivery.gv Normal file
View File

@@ -0,0 +1,70 @@
digraph msgDelivery {
graph [fontname=arial]
node [fontname=arial fontsize=11 shape=box style=rounded]
edge [fontname=arial fontsize=10 arrowhead=open arrowtail=open]
subgraph clusterSUB {
label="SUB"
lookup [label="lookup\nconnId"]
notify [label="notify\nserver\n(connId,\nClient)"]
OK [label="send OK"]
lookup -> forkSub [label="Nothing"]
lookup -> tryTakeMD1 [label="Just _"]
forkSub [label="forkIO\nsubscriber"]
tryTakeMD1 [label="tryTakeM d" color=blue]
forkSub -> notify -> tryTakeMD1 -> OK
}
subgraph clusterSubscriber {
label="subscriber"
subgraph clusterMutexes {
label="TMVar's"
node [shape=circle]
a; d;
}
putMD [label="putM d" color=green style=square]
tryTakeMA [label="tryTakeM a" color=blue]
EOQ [label="send EOQ"]
MSG [label="send MSG"]
subgraph {
node [style=square]
readQ
peekQ
putMD [label="putM d" color=green]
}
putMD -> tryTakeMA
tryTakeMA -> readQ [label="Just _"]
readQ -> tryPeekQ
tryTakeMA -> tryPeekQ [label="Nothing"]
tryPeekQ -> MSG [label="Just msg"]
tryPeekQ -> EOQ [label="Nothing"]
EOQ -> peekQ
peekQ -> MSG [label="msg"]
MSG -> putMD
}
subgraph clusterACK {
label="ACK"
tryPutMA [label="tryPutM a" color=green]
tryTakeMD2 [label="tryTakeM d" color=blue]
OK1 [label="send OK"]
ERR [label="send\nERR NOMSG"]
tryTakeMD2 -> tryPutMA -> OK1 [label="Just _"]
{tryPutMA tryTakeMD2} -> ERR [label="Nothing"]
}
subgraph clusterEND {
label="END"
killSub [label="killThread\nsubscriber"]
END [label="send END"]
killSub -> END
}
subgraph clusterDEL {
label="DEL"
killSub1 [label="killThread\nsubscriber"]
delQueue [label="delete queue"]
OK2 [label="send OK"]
killSub1 -> delQueue -> OK2
}
}

326
design/delivery.svg Normal file
View File

@@ -0,0 +1,326 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.40.1 (20161225.0304)
-->
<!-- Title: msgDelivery Pages: 1 -->
<svg width="698pt" height="879pt"
viewBox="0.00 0.00 698.00 879.40" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 875.4)">
<title>msgDelivery</title>
<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-875.4 694,-875.4 694,4 -4,4"/>
<g id="clust1" class="cluster">
<title>clusterSUB</title>
<polygon fill="none" stroke="#000000" points="8,-252 8,-830.6 110,-830.6 110,-252 8,-252"/>
<text text-anchor="middle" x="59" y="-814" font-family="arial" font-size="14.00" fill="#000000">SUB</text>
</g>
<g id="clust2" class="cluster">
<title>clusterSubscriber</title>
<polygon fill="none" stroke="#000000" points="118,-8 118,-863.4 304,-863.4 304,-8 118,-8"/>
<text text-anchor="middle" x="211" y="-846.8" font-family="arial" font-size="14.00" fill="#000000">subscriber</text>
</g>
<g id="clust3" class="cluster">
<title>clusterMutexes</title>
<polygon fill="none" stroke="#000000" points="190,-753.8 190,-830.6 296,-830.6 296,-753.8 190,-753.8"/>
<text text-anchor="middle" x="243" y="-814" font-family="arial" font-size="14.00" fill="#000000">TMVar&#39;s</text>
</g>
<g id="clust5" class="cluster">
<title>clusterACK</title>
<polygon fill="none" stroke="#000000" points="312,-497.4 312,-830.6 488,-830.6 488,-497.4 312,-497.4"/>
<text text-anchor="middle" x="400" y="-814" font-family="arial" font-size="14.00" fill="#000000">ACK</text>
</g>
<g id="clust7" class="cluster">
<title>clusterEND</title>
<polygon fill="none" stroke="#000000" points="496,-631.8 496,-830.6 578,-830.6 578,-631.8 496,-631.8"/>
<text text-anchor="middle" x="537" y="-814" font-family="arial" font-size="14.00" fill="#000000">END</text>
</g>
<g id="clust8" class="cluster">
<title>clusterDEL</title>
<polygon fill="none" stroke="#000000" points="586,-497.4 586,-830.6 682,-830.6 682,-497.4 586,-497.4"/>
<text text-anchor="middle" x="634" y="-814" font-family="arial" font-size="14.00" fill="#000000">DEL</text>
</g>
<!-- lookup -->
<g id="node1" class="node">
<title>lookup</title>
<path fill="none" stroke="#000000" d="M76,-797.8C76,-797.8 46,-797.8 46,-797.8 40,-797.8 34,-791.8 34,-785.8 34,-785.8 34,-773.8 34,-773.8 34,-767.8 40,-761.8 46,-761.8 46,-761.8 76,-761.8 76,-761.8 82,-761.8 88,-767.8 88,-773.8 88,-773.8 88,-785.8 88,-785.8 88,-791.8 82,-797.8 76,-797.8"/>
<text text-anchor="middle" x="61" y="-783.1" font-family="arial" font-size="11.00" fill="#000000">lookup</text>
<text text-anchor="middle" x="61" y="-769.9" font-family="arial" font-size="11.00" fill="#000000">connId</text>
</g>
<!-- forkSub -->
<g id="node4" class="node">
<title>forkSub</title>
<path fill="none" stroke="#000000" d="M70.2249,-675.8C70.2249,-675.8 27.7751,-675.8 27.7751,-675.8 21.7751,-675.8 15.7751,-669.8 15.7751,-663.8 15.7751,-663.8 15.7751,-651.8 15.7751,-651.8 15.7751,-645.8 21.7751,-639.8 27.7751,-639.8 27.7751,-639.8 70.2249,-639.8 70.2249,-639.8 76.2249,-639.8 82.2249,-645.8 82.2249,-651.8 82.2249,-651.8 82.2249,-663.8 82.2249,-663.8 82.2249,-669.8 76.2249,-675.8 70.2249,-675.8"/>
<text text-anchor="middle" x="49" y="-661.1" font-family="arial" font-size="11.00" fill="#000000">forkIO</text>
<text text-anchor="middle" x="49" y="-647.9" font-family="arial" font-size="11.00" fill="#000000">subscriber</text>
</g>
<!-- lookup&#45;&gt;forkSub -->
<g id="edge1" class="edge">
<title>lookup&#45;&gt;forkSub</title>
<path fill="none" stroke="#000000" d="M59.2294,-761.7985C57.2619,-741.7958 54.0599,-709.2427 51.7623,-685.8831"/>
<polygon fill="#000000" stroke="#000000" points="50.7779,-675.8754 56.2353,-685.3868 51.2674,-680.8514 51.7569,-685.8274 51.7569,-685.8274 51.7569,-685.8274 51.2674,-680.8514 47.2785,-686.2679 50.7779,-675.8754 50.7779,-675.8754"/>
<text text-anchor="middle" x="72.2265" y="-715.8" font-family="arial" font-size="10.00" fill="#000000">Nothing</text>
</g>
<!-- tryTakeMD1 -->
<g id="node5" class="node">
<title>tryTakeMD1</title>
<path fill="none" stroke="#0000ff" d="M82.5022,-418C82.5022,-418 35.4978,-418 35.4978,-418 29.4978,-418 23.4978,-412 23.4978,-406 23.4978,-406 23.4978,-394 23.4978,-394 23.4978,-388 29.4978,-382 35.4978,-382 35.4978,-382 82.5022,-382 82.5022,-382 88.5022,-382 94.5022,-388 94.5022,-394 94.5022,-394 94.5022,-406 94.5022,-406 94.5022,-412 88.5022,-418 82.5022,-418"/>
<text text-anchor="middle" x="59" y="-396.7" font-family="arial" font-size="11.00" fill="#000000">tryTakeM d</text>
</g>
<!-- lookup&#45;&gt;tryTakeMD1 -->
<g id="edge2" class="edge">
<title>lookup&#45;&gt;tryTakeMD1</title>
<path fill="none" stroke="#000000" d="M74.9042,-761.5603C81.8131,-751.3431 89.4324,-738.0258 93,-724.8 94.389,-719.6507 93.0658,-718.1329 93,-712.8 92.5555,-676.7918 93.7122,-667.7087 91,-631.8 90.0215,-618.8449 88.5151,-615.7373 87.324,-602.8 82.8426,-554.125 88.0586,-541.3685 81,-493 77.7806,-470.9389 71.8794,-446.4141 66.9988,-428.0903"/>
<polygon fill="#000000" stroke="#000000" points="64.3437,-418.3439 71.314,-426.8095 65.658,-423.1681 66.9722,-427.9923 66.9722,-427.9923 66.9722,-427.9923 65.658,-423.1681 62.6305,-429.1752 64.3437,-418.3439 64.3437,-418.3439"/>
<text text-anchor="middle" x="100.338" y="-593.8" font-family="arial" font-size="10.00" fill="#000000">Just _</text>
</g>
<!-- notify -->
<g id="node2" class="node">
<title>notify</title>
<path fill="none" stroke="#000000" d="M59.7359,-553.7003C59.7359,-553.7003 28.2641,-553.7003 28.2641,-553.7003 22.2641,-553.7003 16.2641,-547.7003 16.2641,-541.7003 16.2641,-541.7003 16.2641,-505.0997 16.2641,-505.0997 16.2641,-499.0997 22.2641,-493.0997 28.2641,-493.0997 28.2641,-493.0997 59.7359,-493.0997 59.7359,-493.0997 65.7359,-493.0997 71.7359,-499.0997 71.7359,-505.0997 71.7359,-505.0997 71.7359,-541.7003 71.7359,-541.7003 71.7359,-547.7003 65.7359,-553.7003 59.7359,-553.7003"/>
<text text-anchor="middle" x="44" y="-539.9" font-family="arial" font-size="11.00" fill="#000000">notify</text>
<text text-anchor="middle" x="44" y="-526.7" font-family="arial" font-size="11.00" fill="#000000">server</text>
<text text-anchor="middle" x="44" y="-513.5" font-family="arial" font-size="11.00" fill="#000000">(connId,</text>
<text text-anchor="middle" x="44" y="-500.3" font-family="arial" font-size="11.00" fill="#000000">Client)</text>
</g>
<!-- notify&#45;&gt;tryTakeMD1 -->
<g id="edge4" class="edge">
<title>notify&#45;&gt;tryTakeMD1</title>
<path fill="none" stroke="#000000" d="M47.7079,-492.8966C50.1089,-473.1445 53.2135,-447.6039 55.5595,-428.3035"/>
<polygon fill="#000000" stroke="#000000" points="56.7756,-418.2994 60.036,-428.7694 56.1722,-423.2629 55.5688,-428.2263 55.5688,-428.2263 55.5688,-428.2263 56.1722,-423.2629 51.1017,-427.6833 56.7756,-418.2994 56.7756,-418.2994"/>
</g>
<!-- OK -->
<g id="node3" class="node">
<title>OK</title>
<path fill="none" stroke="#000000" d="M76.2948,-296C76.2948,-296 41.7052,-296 41.7052,-296 35.7052,-296 29.7052,-290 29.7052,-284 29.7052,-284 29.7052,-272 29.7052,-272 29.7052,-266 35.7052,-260 41.7052,-260 41.7052,-260 76.2948,-260 76.2948,-260 82.2948,-260 88.2948,-266 88.2948,-272 88.2948,-272 88.2948,-284 88.2948,-284 88.2948,-290 82.2948,-296 76.2948,-296"/>
<text text-anchor="middle" x="59" y="-274.7" font-family="arial" font-size="11.00" fill="#000000">send OK</text>
</g>
<!-- forkSub&#45;&gt;notify -->
<g id="edge3" class="edge">
<title>forkSub&#45;&gt;notify</title>
<path fill="none" stroke="#000000" d="M48.3257,-639.6742C47.6064,-620.341 46.4439,-589.0922 45.5051,-563.8563"/>
<polygon fill="#000000" stroke="#000000" points="45.1315,-553.8148 50.0003,-563.6405 45.3174,-558.8113 45.5034,-563.8079 45.5034,-563.8079 45.5034,-563.8079 45.3174,-558.8113 41.0065,-563.9752 45.1315,-553.8148 45.1315,-553.8148"/>
</g>
<!-- tryTakeMD1&#45;&gt;OK -->
<g id="edge5" class="edge">
<title>tryTakeMD1&#45;&gt;OK</title>
<path fill="none" stroke="#000000" d="M59,-381.9985C59,-361.9958 59,-329.4427 59,-306.0831"/>
<polygon fill="#000000" stroke="#000000" points="59,-296.0754 63.5001,-306.0753 59,-301.0754 59.0001,-306.0754 59.0001,-306.0754 59.0001,-306.0754 59,-301.0754 54.5001,-306.0754 59,-296.0754 59,-296.0754"/>
</g>
<!-- a -->
<g id="node6" class="node">
<title>a</title>
<ellipse fill="none" stroke="#000000" cx="270" cy="-779.8" rx="18" ry="18"/>
<text text-anchor="middle" x="270" y="-776.5" font-family="arial" font-size="11.00" fill="#000000">a</text>
</g>
<!-- d -->
<g id="node7" class="node">
<title>d</title>
<ellipse fill="none" stroke="#000000" cx="216" cy="-779.8" rx="18" ry="18"/>
<text text-anchor="middle" x="216" y="-776.5" font-family="arial" font-size="11.00" fill="#000000">d</text>
</g>
<!-- putMD -->
<g id="node8" class="node">
<title>putMD</title>
<polygon fill="none" stroke="#00ff00" points="180,-797.8 126,-797.8 126,-761.8 180,-761.8 180,-797.8"/>
<text text-anchor="middle" x="153" y="-776.5" font-family="arial" font-size="11.00" fill="#000000">putM d</text>
</g>
<!-- tryTakeMA -->
<g id="node9" class="node">
<title>tryTakeMA</title>
<path fill="none" stroke="#0000ff" d="M185.5022,-675.8C185.5022,-675.8 138.4978,-675.8 138.4978,-675.8 132.4978,-675.8 126.4978,-669.8 126.4978,-663.8 126.4978,-663.8 126.4978,-651.8 126.4978,-651.8 126.4978,-645.8 132.4978,-639.8 138.4978,-639.8 138.4978,-639.8 185.5022,-639.8 185.5022,-639.8 191.5022,-639.8 197.5022,-645.8 197.5022,-651.8 197.5022,-651.8 197.5022,-663.8 197.5022,-663.8 197.5022,-669.8 191.5022,-675.8 185.5022,-675.8"/>
<text text-anchor="middle" x="162" y="-654.5" font-family="arial" font-size="11.00" fill="#000000">tryTakeM a</text>
</g>
<!-- putMD&#45;&gt;tryTakeMA -->
<g id="edge6" class="edge">
<title>putMD&#45;&gt;tryTakeMA</title>
<path fill="none" stroke="#000000" d="M154.328,-761.7985C155.8036,-741.7958 158.205,-709.2427 159.9283,-685.8831"/>
<polygon fill="#000000" stroke="#000000" points="160.6666,-675.8754 164.4186,-686.1794 160.2987,-680.8618 159.9308,-685.8483 159.9308,-685.8483 159.9308,-685.8483 160.2987,-680.8618 155.443,-685.5172 160.6666,-675.8754 160.6666,-675.8754"/>
</g>
<!-- readQ -->
<g id="node12" class="node">
<title>readQ</title>
<polygon fill="none" stroke="#000000" points="182,-541.4 128,-541.4 128,-505.4 182,-505.4 182,-541.4"/>
<text text-anchor="middle" x="155" y="-520.1" font-family="arial" font-size="11.00" fill="#000000">readQ</text>
</g>
<!-- tryTakeMA&#45;&gt;readQ -->
<g id="edge7" class="edge">
<title>tryTakeMA&#45;&gt;readQ</title>
<path fill="none" stroke="#000000" d="M161.0559,-639.6742C159.8817,-617.1293 157.8636,-578.381 156.4823,-551.8595"/>
<polygon fill="#000000" stroke="#000000" points="155.9515,-541.6678 160.9656,-551.4202 156.2116,-546.6611 156.4717,-551.6543 156.4717,-551.6543 156.4717,-551.6543 156.2116,-546.6611 151.9778,-551.8884 155.9515,-541.6678 155.9515,-541.6678"/>
<text text-anchor="middle" x="172.338" y="-593.8" font-family="arial" font-size="10.00" fill="#000000">Just _</text>
</g>
<!-- tryPeekQ -->
<g id="node14" class="node">
<title>tryPeekQ</title>
<path fill="none" stroke="#000000" d="M197.8416,-418C197.8416,-418 160.1584,-418 160.1584,-418 154.1584,-418 148.1584,-412 148.1584,-406 148.1584,-406 148.1584,-394 148.1584,-394 148.1584,-388 154.1584,-382 160.1584,-382 160.1584,-382 197.8416,-382 197.8416,-382 203.8416,-382 209.8416,-388 209.8416,-394 209.8416,-394 209.8416,-406 209.8416,-406 209.8416,-412 203.8416,-418 197.8416,-418"/>
<text text-anchor="middle" x="179" y="-396.7" font-family="arial" font-size="11.00" fill="#000000">tryPeekQ</text>
</g>
<!-- tryTakeMA&#45;&gt;tryPeekQ -->
<g id="edge9" class="edge">
<title>tryTakeMA&#45;&gt;tryPeekQ</title>
<path fill="none" stroke="#000000" d="M191.9673,-639.5734C205.2817,-629.0149 218,-614.339 218,-596.8 218,-596.8 218,-596.8 218,-455.5 218,-444.7908 213.0788,-434.6867 206.7327,-426.1091"/>
<polygon fill="#000000" stroke="#000000" points="200.3257,-418.3831 210.1731,-423.2082 203.5174,-422.2319 206.7091,-426.0807 206.7091,-426.0807 206.7091,-426.0807 203.5174,-422.2319 203.2452,-428.9532 200.3257,-418.3831 200.3257,-418.3831"/>
<text text-anchor="middle" x="235.2265" y="-520.4" font-family="arial" font-size="10.00" fill="#000000">Nothing</text>
</g>
<!-- EOQ -->
<g id="node10" class="node">
<title>EOQ</title>
<path fill="none" stroke="#000000" d="M181.8522,-296C181.8522,-296 138.1478,-296 138.1478,-296 132.1478,-296 126.1478,-290 126.1478,-284 126.1478,-284 126.1478,-272 126.1478,-272 126.1478,-266 132.1478,-260 138.1478,-260 138.1478,-260 181.8522,-260 181.8522,-260 187.8522,-260 193.8522,-266 193.8522,-272 193.8522,-272 193.8522,-284 193.8522,-284 193.8522,-290 187.8522,-296 181.8522,-296"/>
<text text-anchor="middle" x="160" y="-274.7" font-family="arial" font-size="11.00" fill="#000000">send EOQ</text>
</g>
<!-- peekQ -->
<g id="node13" class="node">
<title>peekQ</title>
<polygon fill="none" stroke="#000000" points="191,-174 137,-174 137,-138 191,-138 191,-174"/>
<text text-anchor="middle" x="164" y="-152.7" font-family="arial" font-size="11.00" fill="#000000">peekQ</text>
</g>
<!-- EOQ&#45;&gt;peekQ -->
<g id="edge12" class="edge">
<title>EOQ&#45;&gt;peekQ</title>
<path fill="none" stroke="#000000" d="M160.5902,-259.9985C161.246,-239.9958 162.3134,-207.4427 163.0792,-184.0831"/>
<polygon fill="#000000" stroke="#000000" points="163.4074,-174.0754 167.5772,-184.2175 163.2435,-179.0727 163.0796,-184.07 163.0796,-184.07 163.0796,-184.07 163.2435,-179.0727 158.582,-183.9225 163.4074,-174.0754 163.4074,-174.0754"/>
</g>
<!-- MSG -->
<g id="node11" class="node">
<title>MSG</title>
<path fill="none" stroke="#000000" d="M234.9563,-52C234.9563,-52 191.0437,-52 191.0437,-52 185.0437,-52 179.0437,-46 179.0437,-40 179.0437,-40 179.0437,-28 179.0437,-28 179.0437,-22 185.0437,-16 191.0437,-16 191.0437,-16 234.9563,-16 234.9563,-16 240.9563,-16 246.9563,-22 246.9563,-28 246.9563,-28 246.9563,-40 246.9563,-40 246.9563,-46 240.9563,-52 234.9563,-52"/>
<text text-anchor="middle" x="213" y="-30.7" font-family="arial" font-size="11.00" fill="#000000">send MSG</text>
</g>
<!-- MSG&#45;&gt;putMD -->
<g id="edge14" class="edge">
<title>MSG&#45;&gt;putMD</title>
<path fill="none" stroke="#000000" d="M244.9175,-52.1265C258.8192,-62.57 272,-77.1725 272,-95 272,-718.8 272,-718.8 272,-718.8 272,-760.0664 221.6693,-733.0487 186,-753.8 184.9007,-754.4396 183.798,-755.1126 182.6975,-755.8117"/>
<polygon fill="#000000" stroke="#000000" points="174.3966,-761.5541 180.0604,-752.1641 178.5085,-758.7095 182.6205,-755.8649 182.6205,-755.8649 182.6205,-755.8649 178.5085,-758.7095 185.1807,-759.5657 174.3966,-761.5541 174.3966,-761.5541"/>
</g>
<!-- readQ&#45;&gt;tryPeekQ -->
<g id="edge8" class="edge">
<title>readQ&#45;&gt;tryPeekQ</title>
<path fill="none" stroke="#000000" d="M158.5413,-505.1919C162.4762,-484.9597 168.8801,-452.033 173.4755,-428.4054"/>
<polygon fill="#000000" stroke="#000000" points="175.4442,-418.2828 177.9522,-428.958 174.4896,-423.1908 173.535,-428.0989 173.535,-428.0989 173.535,-428.0989 174.4896,-423.1908 169.1178,-427.2397 175.4442,-418.2828 175.4442,-418.2828"/>
</g>
<!-- peekQ&#45;&gt;MSG -->
<g id="edge13" class="edge">
<title>peekQ&#45;&gt;MSG</title>
<path fill="none" stroke="#000000" d="M170.4675,-137.9881C175.3989,-124.4447 182.4543,-105.4688 189.112,-89 192.7406,-80.0241 196.8854,-70.3112 200.6924,-61.5814"/>
<polygon fill="#000000" stroke="#000000" points="204.8016,-52.2345 204.8964,-63.2 202.7893,-56.8117 200.777,-61.3889 200.777,-61.3889 200.777,-61.3889 202.7893,-56.8117 196.6575,-59.5778 204.8016,-52.2345 204.8016,-52.2345"/>
<text text-anchor="middle" x="198.444" y="-92" font-family="arial" font-size="10.00" fill="#000000">msg</text>
</g>
<!-- tryPeekQ&#45;&gt;EOQ -->
<g id="edge11" class="edge">
<title>tryPeekQ&#45;&gt;EOQ</title>
<path fill="none" stroke="#000000" d="M176.1965,-381.9985C173.0813,-361.9958 168.0116,-329.4427 164.3736,-306.0831"/>
<polygon fill="#000000" stroke="#000000" points="162.815,-296.0754 168.8003,-305.2638 163.5845,-301.0158 164.3539,-305.9563 164.3539,-305.9563 164.3539,-305.9563 163.5845,-301.0158 159.9075,-306.6488 162.815,-296.0754 162.815,-296.0754"/>
<text text-anchor="middle" x="187.2265" y="-336" font-family="arial" font-size="10.00" fill="#000000">Nothing</text>
</g>
<!-- tryPeekQ&#45;&gt;MSG -->
<g id="edge10" class="edge">
<title>tryPeekQ&#45;&gt;MSG</title>
<path fill="none" stroke="#000000" d="M195.4025,-381.9323C204.0969,-370.4837 213,-354.8827 213,-339 213,-339 213,-339 213,-95 213,-84.3104 213,-72.5672 213,-62.263"/>
<polygon fill="#000000" stroke="#000000" points="213,-52.1503 217.5001,-62.1503 213,-57.1503 213.0001,-62.1503 213.0001,-62.1503 213.0001,-62.1503 213,-57.1503 208.5001,-62.1504 213,-52.1503 213,-52.1503"/>
<text text-anchor="middle" x="233.0025" y="-214" font-family="arial" font-size="10.00" fill="#000000">Just msg</text>
</g>
<!-- tryPutMA -->
<g id="node15" class="node">
<title>tryPutMA</title>
<path fill="none" stroke="#00ff00" d="M397.5602,-675.8C397.5602,-675.8 358.4398,-675.8 358.4398,-675.8 352.4398,-675.8 346.4398,-669.8 346.4398,-663.8 346.4398,-663.8 346.4398,-651.8 346.4398,-651.8 346.4398,-645.8 352.4398,-639.8 358.4398,-639.8 358.4398,-639.8 397.5602,-639.8 397.5602,-639.8 403.5602,-639.8 409.5602,-645.8 409.5602,-651.8 409.5602,-651.8 409.5602,-663.8 409.5602,-663.8 409.5602,-669.8 403.5602,-675.8 397.5602,-675.8"/>
<text text-anchor="middle" x="378" y="-654.5" font-family="arial" font-size="11.00" fill="#000000">tryPutM a</text>
</g>
<!-- OK1 -->
<g id="node17" class="node">
<title>OK1</title>
<path fill="none" stroke="#000000" d="M366.2948,-541.4C366.2948,-541.4 331.7052,-541.4 331.7052,-541.4 325.7052,-541.4 319.7052,-535.4 319.7052,-529.4 319.7052,-529.4 319.7052,-517.4 319.7052,-517.4 319.7052,-511.4 325.7052,-505.4 331.7052,-505.4 331.7052,-505.4 366.2948,-505.4 366.2948,-505.4 372.2948,-505.4 378.2948,-511.4 378.2948,-517.4 378.2948,-517.4 378.2948,-529.4 378.2948,-529.4 378.2948,-535.4 372.2948,-541.4 366.2948,-541.4"/>
<text text-anchor="middle" x="349" y="-520.1" font-family="arial" font-size="11.00" fill="#000000">send OK</text>
</g>
<!-- tryPutMA&#45;&gt;OK1 -->
<g id="edge16" class="edge">
<title>tryPutMA&#45;&gt;OK1</title>
<path fill="none" stroke="#000000" d="M367.2958,-639.6347C361.7403,-629.2246 355.4712,-615.6993 352.324,-602.8 348.2978,-586.2978 347.3754,-567.3039 347.5027,-552.0316"/>
<polygon fill="#000000" stroke="#000000" points="347.7514,-541.6577 352.0103,-551.7628 347.6315,-546.6563 347.5116,-551.6548 347.5116,-551.6548 347.5116,-551.6548 347.6315,-546.6563 343.0129,-551.5469 347.7514,-541.6577 347.7514,-541.6577"/>
<text text-anchor="middle" x="365.338" y="-593.8" font-family="arial" font-size="10.00" fill="#000000">Just _</text>
</g>
<!-- ERR -->
<g id="node18" class="node">
<title>ERR</title>
<path fill="none" stroke="#000000" d="M467.8273,-541.4C467.8273,-541.4 408.1727,-541.4 408.1727,-541.4 402.1727,-541.4 396.1727,-535.4 396.1727,-529.4 396.1727,-529.4 396.1727,-517.4 396.1727,-517.4 396.1727,-511.4 402.1727,-505.4 408.1727,-505.4 408.1727,-505.4 467.8273,-505.4 467.8273,-505.4 473.8273,-505.4 479.8273,-511.4 479.8273,-517.4 479.8273,-517.4 479.8273,-529.4 479.8273,-529.4 479.8273,-535.4 473.8273,-541.4 467.8273,-541.4"/>
<text text-anchor="middle" x="438" y="-526.7" font-family="arial" font-size="11.00" fill="#000000">send</text>
<text text-anchor="middle" x="438" y="-513.5" font-family="arial" font-size="11.00" fill="#000000">ERR NOMSG</text>
</g>
<!-- tryPutMA&#45;&gt;ERR -->
<g id="edge17" class="edge">
<title>tryPutMA&#45;&gt;ERR</title>
<path fill="none" stroke="#000000" d="M386.0919,-639.6742C396.2908,-616.8287 413.9175,-577.3449 425.7655,-550.8052"/>
<polygon fill="#000000" stroke="#000000" points="429.8447,-541.6678 429.8773,-552.6337 427.8064,-546.2335 425.7681,-550.7992 425.7681,-550.7992 425.7681,-550.7992 427.8064,-546.2335 421.659,-548.9648 429.8447,-541.6678 429.8447,-541.6678"/>
<text text-anchor="middle" x="424.2265" y="-593.8" font-family="arial" font-size="10.00" fill="#000000">Nothing</text>
</g>
<!-- tryTakeMD2 -->
<g id="node16" class="node">
<title>tryTakeMD2</title>
<path fill="none" stroke="#0000ff" d="M434.5022,-797.8C434.5022,-797.8 387.4978,-797.8 387.4978,-797.8 381.4978,-797.8 375.4978,-791.8 375.4978,-785.8 375.4978,-785.8 375.4978,-773.8 375.4978,-773.8 375.4978,-767.8 381.4978,-761.8 387.4978,-761.8 387.4978,-761.8 434.5022,-761.8 434.5022,-761.8 440.5022,-761.8 446.5022,-767.8 446.5022,-773.8 446.5022,-773.8 446.5022,-785.8 446.5022,-785.8 446.5022,-791.8 440.5022,-797.8 434.5022,-797.8"/>
<text text-anchor="middle" x="411" y="-776.5" font-family="arial" font-size="11.00" fill="#000000">tryTakeM d</text>
</g>
<!-- tryTakeMD2&#45;&gt;tryPutMA -->
<g id="edge15" class="edge">
<title>tryTakeMD2&#45;&gt;tryPutMA</title>
<path fill="none" stroke="#000000" d="M406.1307,-761.7985C400.6958,-741.7057 391.8354,-708.9491 385.511,-685.568"/>
<polygon fill="#000000" stroke="#000000" points="382.8892,-675.8754 389.8443,-684.3535 384.1948,-680.7019 385.5004,-685.5285 385.5004,-685.5285 385.5004,-685.5285 384.1948,-680.7019 381.1565,-686.7035 382.8892,-675.8754 382.8892,-675.8754"/>
<text text-anchor="middle" x="408.338" y="-715.8" font-family="arial" font-size="10.00" fill="#000000">Just _</text>
</g>
<!-- tryTakeMD2&#45;&gt;ERR -->
<g id="edge18" class="edge">
<title>tryTakeMD2&#45;&gt;ERR</title>
<path fill="none" stroke="#000000" d="M417.0997,-761.733C427.7461,-728.3011 448.2934,-654.3927 445,-590.8 444.3317,-577.8968 442.9485,-563.6596 441.5867,-551.608"/>
<polygon fill="#000000" stroke="#000000" points="440.4141,-541.6683 446.0548,-551.0721 440.9999,-546.6338 441.5858,-551.5994 441.5858,-551.5994 441.5858,-551.5994 440.9999,-546.6338 437.1168,-552.1267 440.4141,-541.6683 440.4141,-541.6683"/>
<text text-anchor="middle" x="461.2265" y="-654.8" font-family="arial" font-size="10.00" fill="#000000">Nothing</text>
</g>
<!-- killSub -->
<g id="node19" class="node">
<title>killSub</title>
<path fill="none" stroke="#000000" d="M558.2249,-797.8C558.2249,-797.8 515.7751,-797.8 515.7751,-797.8 509.7751,-797.8 503.7751,-791.8 503.7751,-785.8 503.7751,-785.8 503.7751,-773.8 503.7751,-773.8 503.7751,-767.8 509.7751,-761.8 515.7751,-761.8 515.7751,-761.8 558.2249,-761.8 558.2249,-761.8 564.2249,-761.8 570.2249,-767.8 570.2249,-773.8 570.2249,-773.8 570.2249,-785.8 570.2249,-785.8 570.2249,-791.8 564.2249,-797.8 558.2249,-797.8"/>
<text text-anchor="middle" x="537" y="-783.1" font-family="arial" font-size="11.00" fill="#000000">killThread</text>
<text text-anchor="middle" x="537" y="-769.9" font-family="arial" font-size="11.00" fill="#000000">subscriber</text>
</g>
<!-- END -->
<g id="node20" class="node">
<title>END</title>
<path fill="none" stroke="#000000" d="M558.1194,-675.8C558.1194,-675.8 515.8806,-675.8 515.8806,-675.8 509.8806,-675.8 503.8806,-669.8 503.8806,-663.8 503.8806,-663.8 503.8806,-651.8 503.8806,-651.8 503.8806,-645.8 509.8806,-639.8 515.8806,-639.8 515.8806,-639.8 558.1194,-639.8 558.1194,-639.8 564.1194,-639.8 570.1194,-645.8 570.1194,-651.8 570.1194,-651.8 570.1194,-663.8 570.1194,-663.8 570.1194,-669.8 564.1194,-675.8 558.1194,-675.8"/>
<text text-anchor="middle" x="537" y="-654.5" font-family="arial" font-size="11.00" fill="#000000">send END</text>
</g>
<!-- killSub&#45;&gt;END -->
<g id="edge19" class="edge">
<title>killSub&#45;&gt;END</title>
<path fill="none" stroke="#000000" d="M537,-761.7985C537,-741.7958 537,-709.2427 537,-685.8831"/>
<polygon fill="#000000" stroke="#000000" points="537,-675.8754 541.5001,-685.8753 537,-680.8754 537.0001,-685.8754 537.0001,-685.8754 537.0001,-685.8754 537,-680.8754 532.5001,-685.8754 537,-675.8754 537,-675.8754"/>
</g>
<!-- killSub1 -->
<g id="node21" class="node">
<title>killSub1</title>
<path fill="none" stroke="#000000" d="M655.2249,-797.8C655.2249,-797.8 612.7751,-797.8 612.7751,-797.8 606.7751,-797.8 600.7751,-791.8 600.7751,-785.8 600.7751,-785.8 600.7751,-773.8 600.7751,-773.8 600.7751,-767.8 606.7751,-761.8 612.7751,-761.8 612.7751,-761.8 655.2249,-761.8 655.2249,-761.8 661.2249,-761.8 667.2249,-767.8 667.2249,-773.8 667.2249,-773.8 667.2249,-785.8 667.2249,-785.8 667.2249,-791.8 661.2249,-797.8 655.2249,-797.8"/>
<text text-anchor="middle" x="634" y="-783.1" font-family="arial" font-size="11.00" fill="#000000">killThread</text>
<text text-anchor="middle" x="634" y="-769.9" font-family="arial" font-size="11.00" fill="#000000">subscriber</text>
</g>
<!-- delQueue -->
<g id="node22" class="node">
<title>delQueue</title>
<path fill="none" stroke="#000000" d="M661.5899,-675.8C661.5899,-675.8 606.4101,-675.8 606.4101,-675.8 600.4101,-675.8 594.4101,-669.8 594.4101,-663.8 594.4101,-663.8 594.4101,-651.8 594.4101,-651.8 594.4101,-645.8 600.4101,-639.8 606.4101,-639.8 606.4101,-639.8 661.5899,-639.8 661.5899,-639.8 667.5899,-639.8 673.5899,-645.8 673.5899,-651.8 673.5899,-651.8 673.5899,-663.8 673.5899,-663.8 673.5899,-669.8 667.5899,-675.8 661.5899,-675.8"/>
<text text-anchor="middle" x="634" y="-654.5" font-family="arial" font-size="11.00" fill="#000000">delete queue</text>
</g>
<!-- killSub1&#45;&gt;delQueue -->
<g id="edge20" class="edge">
<title>killSub1&#45;&gt;delQueue</title>
<path fill="none" stroke="#000000" d="M634,-761.7985C634,-741.7958 634,-709.2427 634,-685.8831"/>
<polygon fill="#000000" stroke="#000000" points="634,-675.8754 638.5001,-685.8753 634,-680.8754 634.0001,-685.8754 634.0001,-685.8754 634.0001,-685.8754 634,-680.8754 629.5001,-685.8754 634,-675.8754 634,-675.8754"/>
</g>
<!-- OK2 -->
<g id="node23" class="node">
<title>OK2</title>
<path fill="none" stroke="#000000" d="M651.2948,-541.4C651.2948,-541.4 616.7052,-541.4 616.7052,-541.4 610.7052,-541.4 604.7052,-535.4 604.7052,-529.4 604.7052,-529.4 604.7052,-517.4 604.7052,-517.4 604.7052,-511.4 610.7052,-505.4 616.7052,-505.4 616.7052,-505.4 651.2948,-505.4 651.2948,-505.4 657.2948,-505.4 663.2948,-511.4 663.2948,-517.4 663.2948,-517.4 663.2948,-529.4 663.2948,-529.4 663.2948,-535.4 657.2948,-541.4 651.2948,-541.4"/>
<text text-anchor="middle" x="634" y="-520.1" font-family="arial" font-size="11.00" fill="#000000">send OK</text>
</g>
<!-- delQueue&#45;&gt;OK2 -->
<g id="edge21" class="edge">
<title>delQueue&#45;&gt;OK2</title>
<path fill="none" stroke="#000000" d="M634,-639.6742C634,-617.1293 634,-578.381 634,-551.8595"/>
<polygon fill="#000000" stroke="#000000" points="634,-541.6678 638.5001,-551.6678 634,-546.6678 634.0001,-551.6678 634.0001,-551.6678 634.0001,-551.6678 634,-546.6678 629.5001,-551.6679 634,-541.6678 634,-541.6678"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 26 KiB