static forceinline void applet_fl_set(struct appctx *appctx, uint on);
static forceinline void applet_fl_clr(struct appctx *appctx, uint off);
+/* macros to switch the calling context to the applet during a call. There's
+ * one with a return value for most calls, and one without for the few like
+ * fct(), shut(), or release() with no return.
+ */
+#define CALL_APPLET_WITH_RET(applet, func) EXEC_CTX_WITH_RET(EXEC_CTX_MAKE(TH_EX_CTX_APPLET, (applet)), (applet)->func)
+#define CALL_APPLET_NO_RET(applet, func) EXEC_CTX_NO_RET(EXEC_CTX_MAKE(TH_EX_CTX_APPLET, (applet)), (applet)->func)
+
static forceinline uint appctx_app_test(const struct appctx *appctx, uint test)
{
task_set_thread(appctx->t, tid);
if (appctx->applet->init)
- return appctx->applet->init(appctx);
+ return CALL_APPLET_WITH_RET(appctx->applet, init(appctx));
return 0;
}
TH_EX_CTX_FLT, /* filter whose config is in .flt_conf */
TH_EX_CTX_MUX, /* mux whose mux_ops is in .mux_ops */
TH_EX_CTX_TASK, /* task or tasklet whose function is in .task */
+ TH_EX_CTX_APPLET, /* applet whose applet is in .applet */
};
struct thread_exec_ctx {
const struct flt_conf *flt_conf; /* used with TH_EX_CTX_FLTCONF */
const struct mux_ops *mux_ops; /* used with TH_EX_CTX_MUX */
const struct task *(*task)(struct task *, void *, unsigned int); /* used with TH_EX_CTX_TASK */
+ const struct applet *applet; /* used with TH_EX_CTX_APPLET */
};
};
DECLARE_TYPED_POOL(pool_head_appctx, "appctx", struct appctx);
-
/* trace source and events */
static void applet_trace(enum trace_level level, uint64_t mask,
const struct trace_source *src,
TRACE_ENTER(APPLET_EV_RELEASE, appctx);
if (appctx->applet->release)
- appctx->applet->release(appctx);
+ CALL_APPLET_NO_RET(appctx->applet, release(appctx));
applet_fl_set(appctx, APPCTX_FL_SHUTDOWN);
b_dequeue(&appctx->buffer_wait);
if (flags & CO_RFL_BUF_FLUSH)
applet_fl_set(appctx, APPCTX_FL_FASTFWD);
- ret = appctx->applet->rcv_buf(appctx, buf, count, flags);
+ ret = CALL_APPLET_WITH_RET(appctx->applet, rcv_buf(appctx, buf, count, flags));
if (ret)
applet_fl_clr(appctx, APPCTX_FL_OUTBLK_FULL);
goto end;
}
- ret = appctx->applet->snd_buf(appctx, buf, count, flags);
+ ret = CALL_APPLET_WITH_RET(appctx->applet, snd_buf(appctx, buf, count, flags));
if (applet_fl_test(appctx, (APPCTX_FL_ERROR|APPCTX_FL_ERR_PENDING)))
se_report_term_evt(appctx->sedesc, se_tevt_type_snd_err);
}
b_add(sdo->iobuf.buf, sdo->iobuf.offset);
- ret = appctx->applet->fastfwd(appctx, sdo->iobuf.buf, len, 0);
+ ret = CALL_APPLET_WITH_RET(appctx->applet, fastfwd(appctx, sdo->iobuf.buf, len, 0));
b_sub(sdo->iobuf.buf, sdo->iobuf.offset);
sdo->iobuf.data += ret;
* already called)
*/
if (!se_fl_test(app->sedesc, SE_FL_SHR) || !se_fl_test(app->sedesc, SE_FL_SHW))
- app->applet->fct(app);
+ CALL_APPLET_NO_RET(app->applet, fct(app));
TRACE_POINT(APPLET_EV_PROCESS, app);
* already called)
*/
if (!applet_fl_test(app, APPCTX_FL_SHUTDOWN))
- app->applet->fct(app);
+ CALL_APPLET_NO_RET(app->applet, fct(app));
TRACE_POINT(APPLET_EV_PROCESS, app);