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, ...@@ -178,10 +178,12 @@ ved_include(struct req *preq, const char *src, const char *host,
req->transport = &VED_transport; req->transport = &VED_transport;
req->transport_priv = ecx; req->transport_priv = ecx;
CNT_Embark(wrk, req);
VCL_TaskEnter(req->vcl, req->privs);
while (1) { while (1) {
req->wrk = wrk;
ecx->woken = 0; ecx->woken = 0;
s = CNT_Request(wrk, req); s = CNT_Request(req);
if (s == REQ_FSM_DONE) if (s == REQ_FSM_DONE)
break; break;
DSL(DBG_WAITINGLIST, req->vsl->wid, DSL(DBG_WAITINGLIST, req->vsl->wid,
...@@ -193,6 +195,7 @@ ved_include(struct req *preq, const char *src, const char *host, ...@@ -193,6 +195,7 @@ ved_include(struct req *preq, const char *src, const char *host,
&ecx->preq->wrk->cond, &sp->mtx, 0); &ecx->preq->wrk->cond, &sp->mtx, 0);
Lck_Unlock(&sp->mtx); Lck_Unlock(&sp->mtx);
AZ(req->wrk); AZ(req->wrk);
CNT_Embark(wrk, req);
} }
VCL_Rel(&req->vcl); VCL_Rel(&req->vcl);
......
...@@ -1015,13 +1015,34 @@ cnt_diag(struct req *req, const char *state) ...@@ -1015,13 +1015,34 @@ cnt_diag(struct req *req, const char *state)
VSL_Flush(req->vsl, 0); 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 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; enum req_fsm_nxt nxt;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC); CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
wrk = req->wrk;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req->transport, TRANSPORT_MAGIC); CHECK_OBJ_NOTNULL(req->transport, TRANSPORT_MAGIC);
AN(req->transport->deliver); AN(req->transport->deliver);
...@@ -1035,19 +1056,9 @@ CNT_Request(struct worker *wrk, struct req *req) ...@@ -1035,19 +1056,9 @@ CNT_Request(struct worker *wrk, struct req *req)
req->req_step == R_STP_TRANSPORT); req->req_step == R_STP_TRANSPORT);
AN(req->vsl->wid & VSL_CLIENTMARKER); 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); AN(req->vcl);
if (req->req_step != R_STP_LOOKUP) CHECK_OBJ(req->privs, VRT_PRIVS_MAGIC);
VCL_TaskEnter(req->vcl, req->privs);
for (nxt = REQ_FSM_MORE; nxt == REQ_FSM_MORE; ) { for (nxt = REQ_FSM_MORE; nxt == REQ_FSM_MORE; ) {
/* /*
* This is a good place to be paranoid about the various * This is a good place to be paranoid about the various
......
...@@ -330,7 +330,8 @@ enum req_fsm_nxt { ...@@ -330,7 +330,8 @@ enum req_fsm_nxt {
REQ_FSM_DISEMBARK, 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 */ /* cache_session.c */
void SES_NewPool(struct pool *, unsigned pool_no); void SES_NewPool(struct pool *, unsigned pool_no);
......
...@@ -442,7 +442,10 @@ HTTP1_Session(struct worker *wrk, struct req *req) ...@@ -442,7 +442,10 @@ HTTP1_Session(struct worker *wrk, struct req *req)
req->task.func = http1_req; req->task.func = http1_req;
req->task.priv = req; req->task.priv = req;
wrk->stats->client_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; return;
req->task.func = NULL; req->task.func = NULL;
req->task.priv = NULL; req->task.priv = NULL;
......
...@@ -534,9 +534,12 @@ h2_do_req(struct worker *wrk, void *priv) ...@@ -534,9 +534,12 @@ h2_do_req(struct worker *wrk, void *priv)
CAST_OBJ_NOTNULL(req, priv, REQ_MAGIC); CAST_OBJ_NOTNULL(req, priv, REQ_MAGIC);
CAST_OBJ_NOTNULL(r2, req->transport_priv, H2_REQ_MAGIC); CAST_OBJ_NOTNULL(r2, req->transport_priv, H2_REQ_MAGIC);
THR_SetRequest(req); THR_SetRequest(req);
CNT_Embark(wrk, req);
if (req->req_step == R_STP_TRANSPORT)
VCL_TaskEnter(req->vcl, req->privs);
wrk->stats->client_req++; wrk->stats->client_req++;
if (CNT_Request(wrk, req) != REQ_FSM_DISEMBARK) { if (CNT_Request(req) != REQ_FSM_DISEMBARK) {
AZ(req->ws->r); AZ(req->ws->r);
h2 = r2->h2sess; h2 = r2->h2sess;
CHECK_OBJ_NOTNULL(h2, H2_SESS_MAGIC); 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