VCL reference in the worker thread when the request is done and
with a cheap check reuse it for the next request handled by this
thread.
This should reduce mutex contention.
git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@1032
d4fa192b-c00b-0410-8231-
f00ffab90ce4
size_t liov;
struct acct acct;
+ struct VCL_conf *vcl;
};
struct workreq {
/* cache_vcl.c */
void VCL_Init(void);
-void VCL_Rel(struct VCL_conf *vc);
-struct VCL_conf *VCL_Get(void);
+void VCL_Refresh(struct VCL_conf **vcc);
+void VCL_Rel(struct VCL_conf **vcc);
+void VCL_Get(struct VCL_conf **vcc);
#define VCL_RET_MAC(l,u,b,n)
#define VCL_MET_MAC(l,u,b) void VCL_##l##_method(struct sess *);
vca_close_session(sp, sp->doclose);
sp->backend = NULL;
if (sp->vcl != NULL) {
- VCL_Rel(sp->vcl);
+ if (sp->wrk->vcl != NULL)
+ VCL_Rel(&sp->wrk->vcl);
+ sp->wrk->vcl = sp->vcl;
sp->vcl = NULL;
}
VSL(SLT_ReqStart, sp->fd, "%s %s %u", sp->addr, sp->port, sp->xid);
AZ(sp->vcl);
- sp->vcl = VCL_Get();
+ VCL_Refresh(&sp->wrk->vcl);
+ sp->vcl = sp->wrk->vcl;
+ sp->wrk->vcl = NULL;
AZ(sp->obj);
AZ(sp->vbc);
sp = SES_New(NULL, 0);
XXXAN(sp);
sleep(10); /* Takes time for VCL to arrive */
- sp->vcl = VCL_Get();
+ VCL_Get(&sp->vcl);
t = time(NULL);
while (1) {
LOCK(&exp_mtx);
CHECK_OBJ(o, OBJECT_MAGIC);
if (o == NULL || o->ttl > t + expearly) {
UNLOCK(&exp_mtx);
- VCL_Rel(sp->vcl);
+ VCL_Rel(&sp->vcl);
AZ(sleep(1));
- sp->vcl = VCL_Get();
+ VCL_Get(&sp->vcl);
t = time(NULL);
continue;
}
VSL_stats->n_wrk--;
UNLOCK(&tmtx);
VSL(SLT_WorkThread, 0, "%p end", w);
+ if (w->vcl != NULL)
+ VCL_Rel(&w->vcl);
close(w->pipe[0]);
close(w->pipe[1]);
return (NULL);
/*--------------------------------------------------------------------*/
-struct VCL_conf *
-VCL_Get(void)
+void
+VCL_Refresh(struct VCL_conf **vcc)
+{
+ if (*vcc == vcl_active->conf)
+ return;
+ if (*vcc != NULL)
+ VCL_Rel(vcc);
+ VCL_Get(vcc);
+}
+
+void
+VCL_Get(struct VCL_conf **vcc)
{
- struct VCL_conf *vc;
LOCK(&vcl_mtx);
AN(vcl_active);
- vc = vcl_active->conf;
- AN(vc);
- vc->busy++;
+ *vcc = vcl_active->conf;
+ AN(*vcc);
+ (*vcc)->busy++;
UNLOCK(&vcl_mtx);
- return (vc);
}
void
-VCL_Rel(struct VCL_conf *vc)
+VCL_Rel(struct VCL_conf **vcc)
{
struct vcls *vcl;
+ struct VCL_conf *vc;
+
+ vc = *vcc;
+ *vcc = NULL;
LOCK(&vcl_mtx);
assert(vc->busy > 0);