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 0000000000..bed20e32d2 --- /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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 bFaezX%M*b@pLGlfKTH4uU}u+AmjnDCm>q|F literal 0 Hc-jL100001 -- 2.47.3