Commit fbc14334 authored by Dridi Boukelmoune's avatar Dridi Boukelmoune

Move the embark step outside of CNT_Request

And make the caller responsible for formally entering the task.
parent 6972c55b
......@@ -178,10 +178,12 @@ ved_include(struct req *preq, const char *src, const char *host,
req->transport = &VED_transport;
req->transport_priv = ecx;
CNT_Embark(wrk, req);
VCL_TaskEnter(req->vcl, req->privs);
while (1) {
req->wrk = wrk;
ecx->woken = 0;
s = CNT_Request(wrk, req);
s = CNT_Request(req);
if (s == REQ_FSM_DONE)
break;
DSL(DBG_WAITINGLIST, req->vsl->wid,
......@@ -193,6 +195,7 @@ ved_include(struct req *preq, const char *src, const char *host,
&ecx->preq->wrk->cond, &sp->mtx, 0);
Lck_Unlock(&sp->mtx);
AZ(req->wrk);
CNT_Embark(wrk, req);
}
VCL_Rel(&req->vcl);
......
......@@ -1015,13 +1015,34 @@ cnt_diag(struct req *req, const char *state)
VSL_Flush(req->vsl, 0);
}
void
CNT_Embark(struct worker *wrk, struct req *req)
{
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
/* wrk can have changed for restarts */
req->vfc->wrk = req->wrk = wrk;
wrk->vsl = req->vsl;
if (req->req_step == R_STP_TRANSPORT && req->vcl == NULL) {
VCL_Refresh(&wrk->vcl);
req->vcl = wrk->vcl;
wrk->vcl = NULL;
}
AN(req->vcl);
}
enum req_fsm_nxt
CNT_Request(struct worker *wrk, struct req *req)
CNT_Request(struct req *req)
{
struct worker *wrk;
enum req_fsm_nxt nxt;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
wrk = req->wrk;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req->transport, TRANSPORT_MAGIC);
AN(req->transport->deliver);
......@@ -1035,19 +1056,9 @@ CNT_Request(struct worker *wrk, struct req *req)
req->req_step == R_STP_TRANSPORT);
AN(req->vsl->wid & VSL_CLIENTMARKER);
/* wrk can have changed for restarts */
req->vfc->wrk = req->wrk = wrk;
wrk->vsl = req->vsl;
if (req->req_step == R_STP_TRANSPORT && req->vcl == NULL) {
AZ(req->vcl);
VCL_Refresh(&wrk->vcl);
req->vcl = wrk->vcl;
wrk->vcl = NULL;
}
AN(req->vcl);
if (req->req_step != R_STP_LOOKUP)
VCL_TaskEnter(req->vcl, req->privs);
CHECK_OBJ(req->privs, VRT_PRIVS_MAGIC);
for (nxt = REQ_FSM_MORE; nxt == REQ_FSM_MORE; ) {
/*
* This is a good place to be paranoid about the various
......
......@@ -330,7 +330,8 @@ enum req_fsm_nxt {
REQ_FSM_DISEMBARK,
};
enum req_fsm_nxt CNT_Request(struct worker *, struct req *);
void CNT_Embark(struct worker *, struct req *);
enum req_fsm_nxt CNT_Request(struct req *);
/* cache_session.c */
void SES_NewPool(struct pool *, unsigned pool_no);
......
......@@ -442,7 +442,10 @@ HTTP1_Session(struct worker *wrk, struct req *req)
req->task.func = http1_req;
req->task.priv = req;
wrk->stats->client_req++;
if (CNT_Request(wrk, req) == REQ_FSM_DISEMBARK)
CNT_Embark(wrk, req);
if (req->req_step == R_STP_TRANSPORT)
VCL_TaskEnter(req->vcl, req->privs);
if (CNT_Request(req) == REQ_FSM_DISEMBARK)
return;
req->task.func = NULL;
req->task.priv = NULL;
......
......@@ -534,9 +534,12 @@ h2_do_req(struct worker *wrk, void *priv)
CAST_OBJ_NOTNULL(req, priv, REQ_MAGIC);
CAST_OBJ_NOTNULL(r2, req->transport_priv, H2_REQ_MAGIC);
THR_SetRequest(req);
CNT_Embark(wrk, req);
if (req->req_step == R_STP_TRANSPORT)
VCL_TaskEnter(req->vcl, req->privs);
wrk->stats->client_req++;
if (CNT_Request(wrk, req) != REQ_FSM_DISEMBARK) {
if (CNT_Request(req) != REQ_FSM_DISEMBARK) {
AZ(req->ws->r);
h2 = r2->h2sess;
CHECK_OBJ_NOTNULL(h2, H2_SESS_MAGIC);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment