From 2da788e7558f28d44b96f5d43b4e3d625d694f14 Mon Sep 17 00:00:00 2001 From: Thierry FOURNIER Date: Mon, 11 Sep 2017 18:37:23 +0200 Subject: [PATCH] MEDIUM: xref/lua: Use xref for referencing cosocket relation between stream and lua This relation will ensure that each was informed about death of another one. --- doc/internals/lua_socket.fig | 183 ++++++++++++++--------------- doc/internals/lua_socket.pdf | Bin 14905 -> 14969 bytes include/types/applet.h | 3 +- include/types/hlua.h | 4 +- src/hlua.c | 215 ++++++++++++++++++++++++++--------- 5 files changed, 252 insertions(+), 153 deletions(-) diff --git a/doc/internals/lua_socket.fig b/doc/internals/lua_socket.fig index bed20e32d..2ecb0f841 100644 --- a/doc/internals/lua_socket.fig +++ b/doc/internals/lua_socket.fig @@ -7,116 +7,107 @@ A4 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 +6 1125 2745 2565 3555 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 + 1125 2745 2565 2745 2565 3555 1125 3555 1125 2745 +4 0 0 50 -1 16 12 0.0000 4 180 1080 1215 3195 lua_State *T\001 +4 0 0 50 -1 18 12 0.0000 4 150 990 1215 2925 struct hlua\001 +4 0 0 50 -1 16 12 0.0000 4 195 1245 1215 3465 stop_list *stop\001 -6 +6 7560 4365 10620 5265 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 7650 4635 10530 4635 10530 5175 7650 5175 7650 4635 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 7560 4365 10620 4365 10620 5265 7560 5265 7560 4365 +4 0 0 50 -1 18 12 0.0000 4 195 2565 7740 4815 struct stream_interface si[0]\001 +4 0 0 50 -1 16 12 0.0000 4 195 1725 7740 5085 enum obj_type *end\001 +4 0 0 50 -1 18 12 0.0000 4 150 1215 7650 4545 struct stream\001 +-6 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 225 4500 2745 4500 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 225 5040 2745 5040 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 225 4770 2745 4770 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 + 1935 5715 7740 6705 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 + 2520 3420 3600 4095 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 225 4230 2745 4230 2745 7020 225 7020 225 4230 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 225 6300 2745 6300 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 225 6660 2745 6660 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1035 2205 2655 2205 2655 3645 1035 3645 1035 2205 +2 1 1 4 4 7 500 -1 -1 4.000 0 0 -1 0 0 2 + 4860 1935 4860 9225 +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 + 7695 6435 5760 4410 +2 2 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 5 + 3600 3915 6075 3915 6075 4410 3600 4410 3600 3915 +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 + 9450 5040 9225 5670 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 + 7740 6300 7695 6345 7695 6525 7740 6570 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 7560 5670 9765 5670 9765 7200 7560 7200 7560 5670 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 7650 5940 9675 5940 9675 7110 7650 7110 7650 5940 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 315 5310 2655 5310 2655 6165 315 6165 315 5310 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 + 7830 6840 2565 5580 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 + 7740 6705 9540 6705 9540 6930 7740 6930 7740 6705 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 + 405 5580 2565 5580 2565 5805 405 5805 405 5580 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 + 1215 3105 765 3330 720 3555 765 3915 810 4230 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 + 675 7020 675 7785 900 8104 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 +3 0 1 1 13 7 50 -1 -1 1.000 0 1 0 2 + 5 1 1.00 60.00 120.00 + 7740 7200 7740 8100 + 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 + 7605 7200 7605 8865 7740 9000 + 0.000 1.000 0.000 +4 0 0 50 -1 18 12 0.0000 4 150 885 315 4410 stack Lua\001 +4 0 0 50 -1 16 12 0.0000 4 195 1140 315 4680 stack entry 0\001 +4 0 0 50 -1 16 12 0.0000 4 195 1140 315 4950 stack entry 1\001 +4 0 0 50 -1 16 12 0.0000 4 195 1140 315 5220 stack entry 2\001 +4 0 0 50 -1 18 12 0.0000 4 195 1695 405 5490 struct hlua_socket\001 +4 0 0 50 -1 16 12 0.0000 4 195 1140 315 6570 stack entry 3\001 +4 0 0 50 -1 16 12 0.0000 4 195 1140 315 6930 stack entry 4\001 +4 1 12 50 -1 12 9 5.6723 4 135 540 3150 3735 (list)\001 +4 0 0 50 -1 18 12 0.0000 4 150 1305 1125 2430 struct session\001 +4 0 0 50 -1 16 12 0.0000 4 150 1440 1125 2655 struct task *task\001 +4 0 0 50 -1 12 12 0.0000 4 165 1560 990 8100 hlua_tcp_gc()\001 +4 0 0 50 -1 16 12 0.0000 4 195 2430 990 8295 Called just before the object\001 +4 0 0 50 -1 16 12 0.0000 4 195 840 990 8535 garbaging\001 +4 1 12 50 -1 12 9 5.5327 4 135 540 6390 4905 (list)\001 +4 0 0 50 -1 18 12 0.0000 4 195 2205 3690 4095 struct hlua_socket_com\001 +4 0 0 50 -1 16 12 0.0000 4 150 1440 3690 4320 struct task *task\001 +4 0 0 50 -1 18 12 0.0000 4 195 1200 7650 5850 struct appctx\001 +4 0 0 50 -1 18 12 0.0000 4 150 1110 7740 6120 struct \001 +4 0 0 50 -1 16 12 0.0000 4 195 1620 7740 6615 struct hlua_tcp *wr\001 +4 0 0 50 -1 16 12 0.0000 4 195 1590 7740 6390 struct hlua_tcp *rd\001 +4 0 0 50 -1 12 12 0.0000 4 165 2160 7875 9000 hlua_tcp_release()\001 +4 0 0 50 -1 16 12 0.0000 4 195 3150 7875 9195 Called when the applet is destroyed.\001 +4 0 0 50 -1 12 12 0.0000 4 165 2400 7875 8100 update_tcp_handler()\001 +4 0 0 50 -1 16 12 0.0000 4 195 2640 7875 8295 Called on each change on the \001 +4 0 0 50 -1 16 12 0.0000 4 195 1830 7875 8535 tcp connection state.\001 +4 0 0 50 -1 16 12 0.0000 4 150 1350 495 5760 struct xref *xref\001 +4 0 0 50 -1 16 12 0.0000 4 150 1350 7830 6885 struct xref *xref\001 diff --git a/doc/internals/lua_socket.pdf b/doc/internals/lua_socket.pdf index aca7ff152a4bae7721d17ebf1b64cc03b0c25e5a..e3b80ee0af7303a8e90aadd601bb11c8df8be937 100644 GIT binary patch delta 7507 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 NA#4^F1x-cl{{p^`oN)jE delta 7421 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 #include #include +#include struct appctx; @@ -73,7 +74,7 @@ struct appctx { } peers; /* used by the peers applet */ struct { int connected; - struct hlua_socket *socket; + struct xref xref; /* cross reference with the Lua object owner. */ struct list wake_on_read; struct list wake_on_write; int die; diff --git a/include/types/hlua.h b/include/types/hlua.h index 214651fe2..a0a1e2656 100644 --- a/include/types/hlua.h +++ b/include/types/hlua.h @@ -6,6 +6,8 @@ #include #include +#include + #include #include @@ -159,7 +161,7 @@ struct hlua_sleep { * SSL I/O. It uses a fake stream. */ struct hlua_socket { - struct stream *s; /* Stream used for socket I/O. */ + struct xref xref; /* cross reference with the stream used for socket I/O. */ luaL_Buffer b; /* buffer used to prepare strings. */ }; diff --git a/src/hlua.c b/src/hlua.c index 429948715..98fed3bc3 100644 --- a/src/hlua.c +++ b/src/hlua.c @@ -24,6 +24,7 @@ #include #include +#include #include #include @@ -1604,8 +1605,7 @@ static void hlua_socket_handler(struct appctx *appctx) static void hlua_socket_release(struct appctx *appctx) { /* Remove my link in the original object. */ - if (appctx->ctx.hlua_cosocket.socket) - appctx->ctx.hlua_cosocket.socket->s = NULL; + xref_disconnect(&appctx->ctx.hlua_cosocket.xref); /* Wake all the task waiting for me. */ hlua_com_wake(&appctx->ctx.hlua_cosocket.wake_on_read); @@ -1622,20 +1622,24 @@ __LJMP static int hlua_socket_gc(lua_State *L) { struct hlua_socket *socket; struct appctx *appctx; + struct xref *peer; MAY_LJMP(check_args(L, 1, "__gc")); socket = MAY_LJMP(hlua_checksocket(L, 1)); - if (!socket->s) + peer = xref_get_peer(&socket->xref); + if (!peer) { + xref_disconnect(&socket->xref); return 0; + } + appctx = container_of(peer, struct appctx, ctx.hlua_cosocket.xref); - /* Remove all reference between the Lua stack and the coroutine stream. */ - appctx = objt_appctx(socket->s->si[0].end); - socket->s = NULL; - appctx->ctx.hlua_cosocket.socket = NULL; + /* Set the flag which destroy the session. */ appctx->ctx.hlua_cosocket.die = 1; appctx_wakeup(appctx); + /* Remove all reference between the Lua stack and the coroutine stream. */ + xref_disconnect(&socket->xref); return 0; } @@ -1646,20 +1650,24 @@ __LJMP static int hlua_socket_close(lua_State *L) { struct hlua_socket *socket; struct appctx *appctx; + struct xref *peer; MAY_LJMP(check_args(L, 1, "close")); socket = MAY_LJMP(hlua_checksocket(L, 1)); - if (!socket->s) + peer = xref_get_peer(&socket->xref); + if (!peer) { + xref_disconnect(&socket->xref); return 0; + } + appctx = container_of(peer, struct appctx, ctx.hlua_cosocket.xref); - /* Close the stream and remove the associated stop task. */ - appctx = objt_appctx(socket->s->si[0].end); - appctx->ctx.hlua_cosocket.socket = NULL; - socket->s = NULL; + /* Set the flag which destroy the session. */ appctx->ctx.hlua_cosocket.die = 1; appctx_wakeup(appctx); + /* Remove all reference between the Lua stack and the coroutine stream. */ + xref_disconnect(&socket->xref); return 0; } @@ -1688,17 +1696,26 @@ __LJMP static int hlua_socket_receive_yield(struct lua_State *L, int status, lua int len2; int skip_at_end = 0; struct channel *oc; + struct stream_interface *si; + struct stream *s; + struct xref *peer; /* Check if this lua stack is schedulable. */ if (!hlua || !hlua->task) WILL_LJMP(luaL_error(L, "The 'receive' function is only allowed in " "'frontend', 'backend' or 'task'")); - /* check for connection closed. If some data where read, return it. */ - if (!socket->s) + /* check for connection break. If some data where read, return it. */ + peer = xref_get_peer(&socket->xref); + if (!peer) { + xref_disconnect(&socket->xref); goto connection_closed; + } + appctx = container_of(peer, struct appctx, ctx.hlua_cosocket.xref); + si = appctx->owner; + s = si_strm(si); - oc = &socket->s->res; + oc = &s->res; if (wanted == HLSR_READ_LINE) { /* Read line. */ nblk = bo_getline_nc(oc, &blk1, &len1, &blk2, &len2); @@ -1766,8 +1783,8 @@ __LJMP static int hlua_socket_receive_yield(struct lua_State *L, int status, lua bo_skip(oc, len + skip_at_end); /* Don't wait anything. */ - stream_int_notify(&socket->s->si[0]); - stream_int_update_applet(&socket->s->si[0]); + stream_int_notify(&s->si[0]); + stream_int_update_applet(&s->si[0]); /* If the pattern reclaim to read all the data * in the connection, got out. @@ -1794,7 +1811,7 @@ connection_closed: connection_empty: - appctx = objt_appctx(socket->s->si[0].end); + appctx = objt_appctx(s->si[0].end); if (!hlua_com_new(&hlua->com, &appctx->ctx.hlua_cosocket.wake_on_read, hlua->task)) WILL_LJMP(luaL_error(L, "out of memory")); WILL_LJMP(hlua_yieldk(L, 0, 0, hlua_socket_receive_yield, TICK_ETERNITY, 0)); @@ -1883,6 +1900,9 @@ static int hlua_socket_write_yield(struct lua_State *L,int status, lua_KContext int len; int send_len; int sent; + struct xref *peer; + struct stream_interface *si; + struct stream *s; /* Check if this lua stack is schedulable. */ if (!hlua || !hlua->task) @@ -1894,8 +1914,19 @@ static int hlua_socket_write_yield(struct lua_State *L,int status, lua_KContext buf = MAY_LJMP(luaL_checklstring(L, 2, &buf_len)); sent = MAY_LJMP(luaL_checkinteger(L, 3)); + /* check for connection break. If some data where read, return it. */ + peer = xref_get_peer(&socket->xref); + if (!peer) { + xref_disconnect(&socket->xref); + lua_pushinteger(L, -1); + return 1; + } + appctx = container_of(peer, struct appctx, ctx.hlua_cosocket.xref); + si = appctx->owner; + s = si_strm(si); + /* Check for connection close. */ - if (!socket->s || channel_output_closed(&socket->s->req)) { + if (channel_output_closed(&s->req)) { lua_pushinteger(L, -1); return 1; } @@ -1911,16 +1942,16 @@ static int hlua_socket_write_yield(struct lua_State *L,int status, lua_KContext /* Check if the buffer is avalaible because HAProxy doesn't allocate * the request buffer if its not required. */ - if (socket->s->req.buf->size == 0) { + if (s->req.buf->size == 0) { appctx = hlua->task->context; - if (!channel_alloc_buffer(&socket->s->req, &appctx->buffer_wait)) + if (!channel_alloc_buffer(&s->req, &appctx->buffer_wait)) goto hlua_socket_write_yield_return; } /* Check for avalaible space. */ - len = buffer_total_space(socket->s->req.buf); + len = buffer_total_space(s->req.buf); if (len <= 0) { - appctx = objt_appctx(socket->s->si[0].end); + appctx = objt_appctx(s->si[0].end); if (!hlua_com_new(&hlua->com, &appctx->ctx.hlua_cosocket.wake_on_write, hlua->task)) WILL_LJMP(luaL_error(L, "out of memory")); goto hlua_socket_write_yield_return; @@ -1929,7 +1960,7 @@ static int hlua_socket_write_yield(struct lua_State *L,int status, lua_KContext /* send data */ if (len < send_len) send_len = len; - len = bi_putblk(&socket->s->req, buf+sent, send_len); + len = bi_putblk(&s->req, buf+sent, send_len); /* "Not enough space" (-1), "Buffer too little to contain * the data" (-2) are not expected because the available length @@ -1938,7 +1969,7 @@ static int hlua_socket_write_yield(struct lua_State *L,int status, lua_KContext */ if (len <= 0) { if (len == -1) - socket->s->req.flags |= CF_WAKE_WRITE; + s->req.flags |= CF_WAKE_WRITE; MAY_LJMP(hlua_socket_close(L)); lua_pop(L, 1); @@ -1947,11 +1978,11 @@ static int hlua_socket_write_yield(struct lua_State *L,int status, lua_KContext } /* update buffers. */ - stream_int_notify(&socket->s->si[0]); - stream_int_update_applet(&socket->s->si[0]); + stream_int_notify(&s->si[0]); + stream_int_update_applet(&s->si[0]); - socket->s->req.rex = TICK_ETERNITY; - socket->s->res.wex = TICK_ETERNITY; + s->req.rex = TICK_ETERNITY; + s->res.wex = TICK_ETERNITY; /* Update length sent. */ lua_pop(L, 1); @@ -2096,18 +2127,27 @@ __LJMP static int hlua_socket_getpeername(struct lua_State *L) { struct hlua_socket *socket; struct connection *conn; + struct xref *peer; + struct appctx *appctx; + struct stream_interface *si; + struct stream *s; MAY_LJMP(check_args(L, 1, "getpeername")); socket = MAY_LJMP(hlua_checksocket(L, 1)); - /* Check if the tcp object is avalaible. */ - if (!socket->s) { + /* check for connection break. If some data where read, return it. */ + peer = xref_get_peer(&socket->xref); + if (!peer) { + xref_disconnect(&socket->xref); lua_pushnil(L); return 1; } + appctx = container_of(peer, struct appctx, ctx.hlua_cosocket.xref); + si = appctx->owner; + s = si_strm(si); - conn = objt_conn(socket->s->si[1].end); + conn = objt_conn(s->si[1].end); if (!conn) { lua_pushnil(L); return 1; @@ -2127,18 +2167,27 @@ static int hlua_socket_getsockname(struct lua_State *L) { struct hlua_socket *socket; struct connection *conn; + struct appctx *appctx; + struct xref *peer; + struct stream_interface *si; + struct stream *s; MAY_LJMP(check_args(L, 1, "getsockname")); socket = MAY_LJMP(hlua_checksocket(L, 1)); - /* Check if the tcp object is avalaible. */ - if (!socket->s) { + /* check for connection break. If some data where read, return it. */ + peer = xref_get_peer(&socket->xref); + if (!peer) { + xref_disconnect(&socket->xref); lua_pushnil(L); return 1; } + appctx = container_of(peer, struct appctx, ctx.hlua_cosocket.xref); + si = appctx->owner; + s = si_strm(si); - conn = objt_conn(socket->s->si[1].end); + conn = objt_conn(s->si[1].end); if (!conn) { lua_pushnil(L); return 1; @@ -2165,16 +2214,31 @@ __LJMP static int hlua_socket_connect_yield(struct lua_State *L, int status, lua { struct hlua_socket *socket = MAY_LJMP(hlua_checksocket(L, 1)); struct hlua *hlua = hlua_gethlua(L); + struct xref *peer; struct appctx *appctx; + struct stream_interface *si; + struct stream *s; + + /* check for connection break. If some data where read, return it. */ + peer = xref_get_peer(&socket->xref); + if (!peer) { + xref_disconnect(&socket->xref); + lua_pushnil(L); + lua_pushstring(L, "Can't connect"); + return 2; + } + appctx = container_of(peer, struct appctx, ctx.hlua_cosocket.xref); + si = appctx->owner; + s = si_strm(si); /* Check for connection close. */ - if (!hlua || !socket->s || channel_output_closed(&socket->s->req)) { + if (!hlua || channel_output_closed(&s->req)) { lua_pushnil(L); lua_pushstring(L, "Can't connect"); return 2; } - appctx = objt_appctx(socket->s->si[0].end); + appctx = objt_appctx(s->si[0].end); /* Check for connection established. */ if (appctx->ctx.hlua_cosocket.connected) { @@ -2199,27 +2263,37 @@ __LJMP static int hlua_socket_connect(struct lua_State *L) struct appctx *appctx; int low, high; struct sockaddr_storage *addr; + struct xref *peer; + struct stream_interface *si; + struct stream *s; if (lua_gettop(L) < 2) WILL_LJMP(luaL_error(L, "connect: need at least 2 arguments")); /* Get args. */ socket = MAY_LJMP(hlua_checksocket(L, 1)); - - /* The socket may be destroy. */ - if (!socket->s) - return 0; - ip = MAY_LJMP(luaL_checkstring(L, 2)); if (lua_gettop(L) >= 3) port = MAY_LJMP(luaL_checkinteger(L, 3)); - conn = si_alloc_conn(&socket->s->si[1]); + /* check for connection break. If some data where read, return it. */ + peer = xref_get_peer(&socket->xref); + if (!peer) { + xref_disconnect(&socket->xref); + lua_pushnil(L); + return 1; + } + appctx = container_of(peer, struct appctx, ctx.hlua_cosocket.xref); + si = appctx->owner; + s = si_strm(si); + + /* Initialise connection. */ + conn = si_alloc_conn(&s->si[1]); if (!conn) WILL_LJMP(luaL_error(L, "connect: internal error")); /* needed for the connection not to be closed */ - conn->target = socket->s->target; + conn->target = s->target; /* Parse ip address. */ addr = str2sa_range(ip, NULL, &low, &high, NULL, NULL, NULL, 0); @@ -2243,13 +2317,13 @@ __LJMP static int hlua_socket_connect(struct lua_State *L) } hlua = hlua_gethlua(L); - appctx = objt_appctx(socket->s->si[0].end); + appctx = objt_appctx(s->si[0].end); /* inform the stream that we want to be notified whenever the * connection completes. */ - si_applet_cant_get(&socket->s->si[0]); - si_applet_cant_put(&socket->s->si[0]); + si_applet_cant_get(&s->si[0]); + si_applet_cant_put(&s->si[0]); appctx_wakeup(appctx); hlua->flags |= HLUA_MUST_GC; @@ -2265,10 +2339,26 @@ __LJMP static int hlua_socket_connect(struct lua_State *L) __LJMP static int hlua_socket_connect_ssl(struct lua_State *L) { struct hlua_socket *socket; + struct xref *peer; + struct appctx *appctx; + struct stream_interface *si; + struct stream *s; MAY_LJMP(check_args(L, 3, "connect_ssl")); socket = MAY_LJMP(hlua_checksocket(L, 1)); - socket->s->target = &socket_ssl.obj_type; + + /* check for connection break. If some data where read, return it. */ + peer = xref_get_peer(&socket->xref); + if (!peer) { + xref_disconnect(&socket->xref); + lua_pushnil(L); + return 1; + } + appctx = container_of(peer, struct appctx, ctx.hlua_cosocket.xref); + si = appctx->owner; + s = si_strm(si); + + s->target = &socket_ssl.obj_type; return MAY_LJMP(hlua_socket_connect(L)); } #endif @@ -2282,16 +2372,32 @@ __LJMP static int hlua_socket_settimeout(struct lua_State *L) { struct hlua_socket *socket; int tmout; + struct xref *peer; + struct appctx *appctx; + struct stream_interface *si; + struct stream *s; MAY_LJMP(check_args(L, 2, "settimeout")); socket = MAY_LJMP(hlua_checksocket(L, 1)); tmout = MAY_LJMP(luaL_checkinteger(L, 2)) * 1000; - socket->s->req.rto = tmout; - socket->s->req.wto = tmout; - socket->s->res.rto = tmout; - socket->s->res.wto = tmout; + /* check for connection break. If some data where read, return it. */ + peer = xref_get_peer(&socket->xref); + if (!peer) { + xref_disconnect(&socket->xref); + hlua_pusherror(L, "socket: not yet initialised, you can't set timeouts."); + WILL_LJMP(lua_error(L)); + return 0; + } + appctx = container_of(peer, struct appctx, ctx.hlua_cosocket.xref); + si = appctx->owner; + s = si_strm(si); + + s->req.rto = tmout; + s->req.wto = tmout; + s->res.rto = tmout; + s->res.wto = tmout; return 0; } @@ -2332,7 +2438,6 @@ __LJMP static int hlua_socket_new(lua_State *L) goto out_fail_conf; } - appctx->ctx.hlua_cosocket.socket = socket; appctx->ctx.hlua_cosocket.connected = 0; appctx->ctx.hlua_cosocket.die = 0; LIST_INIT(&appctx->ctx.hlua_cosocket.wake_on_write); @@ -2351,8 +2456,8 @@ __LJMP static int hlua_socket_new(lua_State *L) goto out_fail_stream; } - /* Configure an empty Lua for the stream. */ - socket->s = strm; + /* Initialise cross reference between stream and Lua socket object. */ + xref_create(&socket->xref, &appctx->ctx.hlua_cosocket.xref); /* Configure "right" stream interface. this "si" is used to connect * and retrieve data from the server. The connection is initialized