From f08e66d8c9bca26cfdcd7e57490bf5c8eb194eae Mon Sep 17 00:00:00 2001 From: Thierry FOURNIER Date: Tue, 2 Jun 2015 22:51:09 +0200 Subject: [PATCH] DOC: lua: schematics about lua socket organization This schema shows the structs and the connections between these structs for implementing the socket systems. --- doc/internals/lua_socket.fig | 122 +++++++++++++++++++++++++++++++++++ doc/internals/lua_socket.pdf | Bin 0 -> 14905 bytes 2 files changed, 122 insertions(+) create mode 100644 doc/internals/lua_socket.fig create mode 100644 doc/internals/lua_socket.pdf diff --git a/doc/internals/lua_socket.fig b/doc/internals/lua_socket.fig new file mode 100644 index 000000000..bed20e32d --- /dev/null +++ b/doc/internals/lua_socket.fig @@ -0,0 +1,122 @@ +#FIG 3.2 Produced by xfig version 3.2.5b +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +6 7020 8775 9675 9405 +4 0 0 50 -1 12 12 0.0000 4 165 2400 7020 8910 update_tcp_handler()\001 +4 0 0 50 -1 16 12 0.0000 4 195 2640 7020 9105 Called on each change on the \001 +4 0 0 50 -1 16 12 0.0000 4 195 1830 7020 9345 tcp connection state.\001 +-6 +6 7020 9675 10170 10080 +4 0 0 50 -1 12 12 0.0000 4 165 2160 7020 9810 hlua_tcp_release()\001 +4 0 0 50 -1 16 12 0.0000 4 195 3150 7020 10005 Called when the applet is destroyed.\001 +-6 +6 765 8730 3195 9450 +4 0 0 50 -1 12 12 0.0000 4 165 1560 765 8910 hlua_tcp_gc()\001 +4 0 0 50 -1 16 12 0.0000 4 195 2430 765 9105 Called just before the object\001 +4 0 0 50 -1 16 12 0.0000 4 195 840 765 9345 garbaging\001 +-6 +6 900 3555 2340 4365 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 900 3555 2340 3555 2340 4365 900 4365 900 3555 +4 0 0 50 -1 16 12 0.0000 4 180 1080 990 4005 lua_State *T\001 +4 0 0 50 -1 18 12 0.0000 4 150 990 990 3735 struct hlua\001 +4 0 0 50 -1 16 12 0.0000 4 195 1245 990 4275 stop_list *stop\001 +-6 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 10530 6750 8910 6570 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 10440 6390 13320 6390 13320 6930 10440 6930 10440 6390 +2 1 1 4 4 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 6480 2745 6480 10035 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 0 5310 2520 5310 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 0 5850 2520 5850 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 0 5580 2520 5580 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 6840 7245 4635 5310 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 6885 7110 6840 7155 6840 7335 6885 7380 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 1575 6525 10350 6210 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 2295 4230 3375 4905 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 0 5040 2520 5040 2520 7830 0 7830 0 5040 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 0 7110 2520 7110 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 0 7470 2520 7470 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 90 6120 2430 6120 2430 6975 90 6975 90 6120 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3375 4815 5850 4815 5850 5310 3375 5310 3375 4815 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 6705 6480 8910 6480 8910 8010 6705 8010 6705 6480 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 6840 7605 2430 6840 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 810 3015 2430 3015 2430 4455 810 4455 810 3015 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 6795 6750 8820 6750 8820 7920 6795 7920 6795 6750 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3060 630 4500 630 4500 1440 3060 1440 3060 630 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2970 90 4635 90 4635 1575 2970 1575 2970 90 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 10350 6120 13410 6120 13410 7020 10350 7020 10350 6120 +3 0 1 1 13 7 50 -1 -1 1.000 0 1 0 2 + 5 1 1.00 60.00 120.00 + 6885 8010 6885 8910 + 0.000 0.000 +3 0 1 1 13 7 50 -1 -1 1.000 0 1 0 3 + 5 1 1.00 60.00 120.00 + 6750 8010 6750 9675 6885 9810 + 0.000 1.000 0.000 +3 0 0 1 0 7 50 -1 -1 0.000 0 1 0 5 + 1 1 1.00 60.00 120.00 + 990 3915 540 4140 495 4365 540 4725 585 5040 + 0.000 1.000 1.000 1.000 0.000 +3 0 1 1 13 7 50 -1 -1 1.000 0 1 0 3 + 5 1 1.00 60.00 120.00 + 450 7830 450 8595 675 8914 + 0.000 1.000 0.000 +4 0 0 50 -1 18 12 0.0000 4 195 2565 10530 6570 struct stream_interface si[0]\001 +4 0 0 50 -1 16 12 0.0000 4 195 1725 10530 6840 enum obj_type *end\001 +4 0 0 50 -1 18 12 0.0000 4 150 885 90 5220 stack Lua\001 +4 0 0 50 -1 16 12 0.0000 4 195 1140 90 5490 stack entry 0\001 +4 0 0 50 -1 16 12 0.0000 4 195 1140 90 5760 stack entry 1\001 +4 0 0 50 -1 16 12 0.0000 4 195 1140 90 6030 stack entry 2\001 +4 0 0 50 -1 18 12 0.0000 4 195 1200 6795 6660 struct appctx\001 +4 0 0 50 -1 18 12 0.0000 4 195 1695 180 6300 struct hlua_socket\001 +4 0 0 50 -1 16 12 0.0000 4 150 1470 180 6570 struct session *s\001 +4 0 0 50 -1 16 12 0.0000 4 195 1140 90 7380 stack entry 3\001 +4 0 0 50 -1 16 12 0.0000 4 195 1140 90 7740 stack entry 4\001 +4 1 12 50 -1 12 9 5.6723 4 135 540 2925 4545 (list)\001 +4 0 0 50 -1 18 12 0.0000 4 195 2205 3465 4995 struct hlua_socket_com\001 +4 1 12 50 -1 12 9 5.5851 4 135 540 5265 5760 (list)\001 +4 0 0 50 -1 18 12 0.0000 4 150 1305 900 3240 struct session\001 +4 0 0 50 -1 16 12 0.0000 4 150 1440 900 3465 struct task *task\001 +4 0 0 50 -1 16 12 0.0000 4 150 1440 3465 5220 struct task *task\001 +4 0 0 50 -1 18 12 0.0000 4 150 1110 6885 6930 struct \001 +4 0 0 50 -1 16 12 0.0000 4 195 1620 6885 7425 struct hlua_tcp *wr\001 +4 0 0 50 -1 16 12 0.0000 4 195 1590 6885 7200 struct hlua_tcp *rd\001 +4 0 0 50 -1 16 12 0.0000 4 180 1845 6885 7650 struct hlua_socket *s\001 +4 0 0 50 -1 18 12 0.0000 4 195 1470 3060 270 struct hlua_task\001 +4 0 0 50 -1 16 12 0.0000 4 150 1440 3060 540 struct task *task\001 +4 0 0 50 -1 16 12 0.0000 4 180 1080 3150 1080 lua_State *T\001 +4 0 0 50 -1 18 12 0.0000 4 150 990 3150 810 struct hlua\001 +4 0 0 50 -1 16 12 0.0000 4 195 1245 3150 1350 stop_list *stop\001 +4 0 0 50 -1 18 12 0.0000 4 150 1305 10440 6300 struct session\001 diff --git a/doc/internals/lua_socket.pdf b/doc/internals/lua_socket.pdf new file mode 100644 index 0000000000000000000000000000000000000000..aca7ff152a4bae7721d17ebf1b64cc03b0c25e5a GIT binary patch literal 14905 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 literal 0 HcmV?d00001