MEDIUM: lua: Refactor cosocket appctx creation

A .init callback function is defined for the update_applet applet. This
function finishes the appctx startup by calling appctx_finalize_startup()
and its handles the stream customization.
This commit is contained in:
Christopher Faulet 2022-05-12 15:31:05 +02:00
parent 69ebc3093a
commit 5f35a3e2ec

View File

@ -1986,6 +1986,33 @@ static void hlua_socket_handler(struct appctx *appctx)
cs_rx_endp_more(cs); cs_rx_endp_more(cs);
} }
static int hlua_socket_init(struct appctx *appctx)
{
struct hlua_csk_ctx *ctx = appctx->svcctx;
struct stream *s;
if (appctx_finalize_startup(appctx, socket_proxy, &BUF_NULL) == -1)
goto error;
s = appctx_strm(appctx);
/* Configure "right" conn-stream. this "si" is used to connect
* and retrieve data from the server. The connection is initialized
* with the "struct server".
*/
cs_set_state(s->csb, CS_ST_ASS);
/* Force destination server. */
s->flags |= SF_DIRECT | SF_ASSIGNED | SF_BE_ASSIGNED;
s->target = &socket_tcp->obj_type;
ctx->appctx = appctx;
return 0;
error:
return -1;
}
/* This function is called when the "struct stream" is destroyed. /* This function is called when the "struct stream" is destroyed.
* Remove the link from the object to this stream. * Remove the link from the object to this stream.
* Wake all the pending signals. * Wake all the pending signals.
@ -1995,7 +2022,7 @@ static void hlua_socket_release(struct appctx *appctx)
struct hlua_csk_ctx *ctx = appctx->svcctx; struct hlua_csk_ctx *ctx = appctx->svcctx;
struct xref *peer; struct xref *peer;
/* Remove my link in the original object. */ /* Remove my link in the original objects. */
peer = xref_get_peer_and_lock(&ctx->xref); peer = xref_get_peer_and_lock(&ctx->xref);
if (peer) if (peer)
xref_disconnect(&ctx->xref, peer); xref_disconnect(&ctx->xref, peer);
@ -2668,6 +2695,7 @@ static struct applet update_applet = {
.obj_type = OBJ_TYPE_APPLET, .obj_type = OBJ_TYPE_APPLET,
.name = "<LUA_TCP>", .name = "<LUA_TCP>",
.fct = hlua_socket_handler, .fct = hlua_socket_handler,
.init = hlua_socket_init,
.release = hlua_socket_release, .release = hlua_socket_release,
}; };
@ -2946,9 +2974,6 @@ __LJMP static int hlua_socket_new(lua_State *L)
struct hlua_socket *socket; struct hlua_socket *socket;
struct hlua_csk_ctx *ctx; struct hlua_csk_ctx *ctx;
struct appctx *appctx; struct appctx *appctx;
struct session *sess;
struct conn_stream *cs;
struct stream *s;
/* Check stack size. */ /* Check stack size. */
if (!lua_checkstack(L, 3)) { if (!lua_checkstack(L, 3)) {
@ -2979,47 +3004,23 @@ __LJMP static int hlua_socket_new(lua_State *L)
hlua_pusherror(L, "socket: out of memory"); hlua_pusherror(L, "socket: out of memory");
goto out_fail_conf; goto out_fail_conf;
} }
ctx = applet_reserve_svcctx(appctx, sizeof(*ctx)); ctx = applet_reserve_svcctx(appctx, sizeof(*ctx));
ctx->connected = 0; ctx->connected = 0;
ctx->appctx = appctx;
ctx->die = 0; ctx->die = 0;
LIST_INIT(&ctx->wake_on_write); LIST_INIT(&ctx->wake_on_write);
LIST_INIT(&ctx->wake_on_read); LIST_INIT(&ctx->wake_on_read);
/* Now create a session, task and stream for this applet */ if (appctx_init(appctx) == -1) {
sess = session_new(socket_proxy, NULL, &appctx->obj_type); hlua_pusherror(L, "socket: fail to init applet.");
if (!sess) {
hlua_pusherror(L, "socket: out of memory");
goto out_fail_appctx; goto out_fail_appctx;
} }
appctx->sess = sess;
cs = cs_new_from_endp(appctx->endp, sess, &BUF_NULL);
if (!cs) {
hlua_pusherror(L, "socket: out of memory");
goto out_fail_appctx;
}
s = DISGUISE(cs_strm(cs));
/* Initialise cross reference between stream and Lua socket object. */ /* Initialise cross reference between stream and Lua socket object. */
xref_create(&socket->xref, &ctx->xref); xref_create(&socket->xref, &ctx->xref);
/* Configure "right" conn-stream. this "si" is used to connect
* and retrieve data from the server. The connection is initialized
* with the "struct server".
*/
cs_set_state(s->csb, CS_ST_ASS);
/* Force destination server. */
s->flags |= SF_DIRECT | SF_ASSIGNED | SF_BE_ASSIGNED;
s->target = &socket_tcp->obj_type;
return 1; return 1;
out_fail_appctx: out_fail_appctx:
appctx_free(appctx); appctx_free_on_early_error(appctx);
out_fail_conf: out_fail_conf:
WILL_LJMP(lua_error(L)); WILL_LJMP(lua_error(L));
return 0; return 0;