MEDIUM: applet: make the applet not depend on a stream interface anymore

Now that applet's functions only take an appctx in argument, not a
stream interface. This slightly simplifies the code and will be needed
to take the appctx out of the stream interface.
This commit is contained in:
Willy Tarreau 2015-04-13 12:05:19 +02:00
parent 19c8161b3d
commit 00a37f0029
5 changed files with 29 additions and 45 deletions

View File

@ -179,7 +179,7 @@ static inline void si_release_endpoint(struct stream_interface *si)
} }
else if ((appctx = objt_appctx(si->end))) { else if ((appctx = objt_appctx(si->end))) {
if (appctx->applet->release) if (appctx->applet->release)
appctx->applet->release(si); appctx->applet->release(appctx);
appctx_free(appctx); /* we share the connection pool */ appctx_free(appctx); /* we share the connection pool */
} }
si->end = NULL; si->end = NULL;
@ -243,27 +243,16 @@ static inline struct appctx *si_appctx(struct stream_interface *si)
return objt_appctx(si->end); return objt_appctx(si->end);
} }
/* returns a pointer to the applet being run in the SI or NULL if none */
static inline const struct si_applet *si_applet(struct stream_interface *si)
{
const struct appctx *appctx;
appctx = si_appctx(si);
if (appctx)
return appctx->applet;
return NULL;
}
/* Call the applet's main function when an appctx is attached to the stream /* Call the applet's main function when an appctx is attached to the stream
* interface. Returns zero if no call was made, or non-zero if a call was made. * interface. Returns zero if no call was made, or non-zero if a call was made.
*/ */
static inline int si_applet_call(struct stream_interface *si) static inline int si_applet_call(struct stream_interface *si)
{ {
const struct si_applet *applet; struct appctx *appctx;
applet = si_applet(si); appctx = si_appctx(si);
if (applet) { if (appctx) {
applet->fct(si); appctx->applet->fct(appctx);
return 1; return 1;
} }
return 0; return 0;
@ -272,11 +261,11 @@ static inline int si_applet_call(struct stream_interface *si)
/* call the applet's release function if any. Needs to be called upon close() */ /* call the applet's release function if any. Needs to be called upon close() */
static inline void si_applet_release(struct stream_interface *si) static inline void si_applet_release(struct stream_interface *si)
{ {
const struct si_applet *applet; struct appctx *appctx;
applet = si_applet(si); appctx = si_appctx(si);
if (applet && applet->release) if (appctx && appctx->applet->release)
applet->release(si); appctx->applet->release(appctx);
} }
/* Try to allocate a new connection and assign it to the interface. If /* Try to allocate a new connection and assign it to the interface. If

View File

@ -103,13 +103,15 @@ struct stream_interface {
int conn_retries; /* number of connect retries left */ int conn_retries; /* number of connect retries left */
}; };
struct appctx;
/* An applet designed to run in a stream interface */ /* An applet designed to run in a stream interface */
struct si_applet { struct si_applet {
enum obj_type obj_type; /* object type = OBJ_TYPE_APPLET */ enum obj_type obj_type; /* object type = OBJ_TYPE_APPLET */
/* 3 unused bytes here */ /* 3 unused bytes here */
char *name; /* applet's name to report in logs */ char *name; /* applet's name to report in logs */
void (*fct)(struct stream_interface *); /* internal I/O handler, may never be NULL */ void (*fct)(struct appctx *); /* internal I/O handler, may never be NULL */
void (*release)(struct stream_interface *); /* callback to release resources, may be NULL */ void (*release)(struct appctx *); /* callback to release resources, may be NULL */
}; };
/* operations available on a stream-interface */ /* operations available on a stream-interface */

View File

@ -133,7 +133,7 @@ static int stats_dump_stat_to_buffer(struct stream_interface *si, struct uri_aut
static int stats_pats_list(struct stream_interface *si); static int stats_pats_list(struct stream_interface *si);
static int stats_pat_list(struct stream_interface *si); static int stats_pat_list(struct stream_interface *si);
static int stats_map_lookup(struct stream_interface *si); static int stats_map_lookup(struct stream_interface *si);
static void cli_release_handler(struct stream_interface *si); static void cli_release_handler(struct appctx *appctx);
/* /*
* cli_io_handler() * cli_io_handler()
@ -2217,9 +2217,9 @@ static int stats_sock_parse_request(struct stream_interface *si, char *line)
* STAT_CLI_* constants. appctx->st1 is used to indicate whether prompt is enabled * STAT_CLI_* constants. appctx->st1 is used to indicate whether prompt is enabled
* or not. * or not.
*/ */
static void cli_io_handler(struct stream_interface *si) static void cli_io_handler(struct appctx *appctx)
{ {
struct appctx *appctx = __objt_appctx(si->end); struct stream_interface *si = appctx->owner;
struct channel *req = si_oc(si); struct channel *req = si_oc(si);
struct channel *res = si_ic(si); struct channel *res = si_ic(si);
int reql; int reql;
@ -2315,7 +2315,7 @@ static void cli_io_handler(struct stream_interface *si)
} }
else { /* output functions: first check if the output buffer is closed then abort */ else { /* output functions: first check if the output buffer is closed then abort */
if (res->flags & (CF_SHUTR_NOW|CF_SHUTR)) { if (res->flags & (CF_SHUTR_NOW|CF_SHUTR)) {
cli_release_handler(si); cli_release_handler(appctx);
appctx->st0 = STAT_CLI_END; appctx->st0 = STAT_CLI_END;
continue; continue;
} }
@ -2373,7 +2373,7 @@ static void cli_io_handler(struct stream_interface *si)
appctx->st0 = STAT_CLI_PROMPT; appctx->st0 = STAT_CLI_PROMPT;
break; break;
default: /* abnormal state */ default: /* abnormal state */
cli_release_handler(si); cli_release_handler(appctx);
appctx->st0 = STAT_CLI_PROMPT; appctx->st0 = STAT_CLI_PROMPT;
break; break;
} }
@ -4854,9 +4854,9 @@ static int stats_send_http_redirect(struct stream_interface *si)
* appctx->st0 contains the operation in progress (dump, done). The handler * appctx->st0 contains the operation in progress (dump, done). The handler
* automatically unregisters itself once transfer is complete. * automatically unregisters itself once transfer is complete.
*/ */
static void http_stats_io_handler(struct stream_interface *si) static void http_stats_io_handler(struct appctx *appctx)
{ {
struct appctx *appctx = __objt_appctx(si->end); struct stream_interface *si = appctx->owner;
struct stream *s = si_strm(si); struct stream *s = si_strm(si);
struct channel *req = si_oc(si); struct channel *req = si_oc(si);
struct channel *res = si_ic(si); struct channel *res = si_ic(si);
@ -5799,10 +5799,8 @@ static int stats_dump_sess_to_buffer(struct stream_interface *si)
* external abort, we won't call the i/o handler anymore so we may need to * external abort, we won't call the i/o handler anymore so we may need to
* remove back references to the stream currently being dumped. * remove back references to the stream currently being dumped.
*/ */
static void cli_release_handler(struct stream_interface *si) static void cli_release_handler(struct appctx *appctx)
{ {
struct appctx *appctx = __objt_appctx(si->end);
if (appctx->st0 == STAT_CLI_O_SESS && appctx->st2 == STAT_ST_LIST) { if (appctx->st0 == STAT_CLI_O_SESS && appctx->st2 == STAT_ST_LIST) {
if (!LIST_ISEMPTY(&appctx->ctx.sess.bref.users)) if (!LIST_ISEMPTY(&appctx->ctx.sess.bref.users))
LIST_DEL(&appctx->ctx.sess.bref.users); LIST_DEL(&appctx->ctx.sess.bref.users);

View File

@ -1429,9 +1429,9 @@ __LJMP static struct hlua_socket *hlua_checksocket(lua_State *L, int ud)
* connection. It is used for notify space avalaible to send or data * connection. It is used for notify space avalaible to send or data
* received. * received.
*/ */
static void hlua_socket_handler(struct stream_interface *si) static void hlua_socket_handler(struct appctx *appctx)
{ {
struct appctx *appctx = objt_appctx(si->end); struct stream_interface *si = appctx->owner;
struct connection *c = objt_conn(si_opposite(si)->end); struct connection *c = objt_conn(si_opposite(si)->end);
/* Wakeup the main stream if the client connection is closed. */ /* Wakeup the main stream if the client connection is closed. */
@ -1467,10 +1467,8 @@ static void hlua_socket_handler(struct stream_interface *si)
* 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.
*/ */
static void hlua_socket_release(struct stream_interface *si) static void hlua_socket_release(struct appctx *appctx)
{ {
struct appctx *appctx = objt_appctx(si->end);
/* Remove my link in the original object. */ /* Remove my link in the original object. */
if (appctx->ctx.hlua.socket) if (appctx->ctx.hlua.socket)
appctx->ctx.hlua.socket->s = NULL; appctx->ctx.hlua.socket->s = NULL;

View File

@ -178,10 +178,10 @@ static int peer_prepare_datamsg(struct stksess *ts, struct peer_session *ps, cha
/* /*
* Callback to release a session with a peer * Callback to release a session with a peer
*/ */
static void peer_session_release(struct stream_interface *si) static void peer_session_release(struct appctx *appctx)
{ {
struct stream_interface *si = appctx->owner;
struct stream *s = si_strm(si); struct stream *s = si_strm(si);
struct appctx *appctx = objt_appctx(si->end);
struct peer_session *ps = (struct peer_session *)appctx->ctx.peers.ptr; struct peer_session *ps = (struct peer_session *)appctx->ctx.peers.ptr;
/* appctx->ctx.peers.ptr is not a peer session */ /* appctx->ctx.peers.ptr is not a peer session */
@ -212,11 +212,11 @@ static void peer_session_release(struct stream_interface *si)
/* /*
* IO Handler to handle message exchance with a peer * IO Handler to handle message exchance with a peer
*/ */
static void peer_io_handler(struct stream_interface *si) static void peer_io_handler(struct appctx *appctx)
{ {
struct stream_interface *si = appctx->owner;
struct stream *s = si_strm(si); struct stream *s = si_strm(si);
struct peers *curpeers = (struct peers *)strm_fe(s)->parent; struct peers *curpeers = (struct peers *)strm_fe(s)->parent;
struct appctx *appctx = objt_appctx(si->end);
int reql = 0; int reql = 0;
int repl = 0; int repl = 0;
@ -1066,7 +1066,6 @@ static struct si_applet peer_applet = {
*/ */
static void peer_session_forceshutdown(struct stream * stream) static void peer_session_forceshutdown(struct stream * stream)
{ {
struct stream_interface *oldsi = NULL;
struct appctx *appctx = NULL; struct appctx *appctx = NULL;
int i; int i;
@ -1076,8 +1075,6 @@ static void peer_session_forceshutdown(struct stream * stream)
continue; continue;
if (appctx->applet != &peer_applet) if (appctx->applet != &peer_applet)
continue; continue;
oldsi = &stream->si[i];
break; break;
} }
@ -1085,7 +1082,7 @@ static void peer_session_forceshutdown(struct stream * stream)
return; return;
/* call release to reinit resync states if needed */ /* call release to reinit resync states if needed */
peer_session_release(oldsi); peer_session_release(appctx);
appctx->st0 = PEER_SESS_ST_END; appctx->st0 = PEER_SESS_ST_END;
appctx->ctx.peers.ptr = NULL; appctx->ctx.peers.ptr = NULL;
task_wakeup(stream->task, TASK_WOKEN_MSG); task_wakeup(stream->task, TASK_WOKEN_MSG);