Commit c360e47d authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Use a private cond-var for each worker thread, instead of pipe(2)-pair, it is cheaper.


git-svn-id: http://www.varnish-cache.org/svn/trunk/varnish-cache@2605 d4fa192b-c00b-0410-8231-f00ffab90ce4
parent 3c2ba8cd
...@@ -174,7 +174,7 @@ struct worker { ...@@ -174,7 +174,7 @@ struct worker {
double used; double used;
int pipe[2]; pthread_cond_t cond;
VTAILQ_ENTRY(worker) list; VTAILQ_ENTRY(worker) list;
struct workreq *wrq; struct workreq *wrq;
......
...@@ -203,7 +203,6 @@ wrk_thread(void *priv) ...@@ -203,7 +203,6 @@ wrk_thread(void *priv)
{ {
struct worker *w, ww; struct worker *w, ww;
struct wq *qp; struct wq *qp;
char c;
unsigned char wlog[8192]; /* XXX: size */ unsigned char wlog[8192]; /* XXX: size */
THR_Name("cache-worker"); THR_Name("cache-worker");
...@@ -214,7 +213,7 @@ wrk_thread(void *priv) ...@@ -214,7 +213,7 @@ wrk_thread(void *priv)
w->used = TIM_real(); w->used = TIM_real();
w->wlb = w->wlp = wlog; w->wlb = w->wlp = wlog;
w->wle = wlog + sizeof wlog; w->wle = wlog + sizeof wlog;
AZ(pipe(w->pipe)); AZ(pthread_cond_init(&w->cond, NULL));
VSL(SLT_WorkThread, 0, "%p start", w); VSL(SLT_WorkThread, 0, "%p start", w);
LOCK(&tmtx); LOCK(&tmtx);
...@@ -240,8 +239,8 @@ wrk_thread(void *priv) ...@@ -240,8 +239,8 @@ wrk_thread(void *priv)
if (w->wrq == NULL) { if (w->wrq == NULL) {
LOCK(&qp->mtx); LOCK(&qp->mtx);
VTAILQ_INSERT_HEAD(&qp->idle, w, list); VTAILQ_INSERT_HEAD(&qp->idle, w, list);
AZ(pthread_cond_wait(&w->cond, &qp->mtx));
UNLOCK(&qp->mtx); UNLOCK(&qp->mtx);
assert(1 == read(w->pipe[0], &c, 1));
} }
if (w->wrq == NULL) if (w->wrq == NULL)
break; break;
...@@ -256,8 +255,7 @@ wrk_thread(void *priv) ...@@ -256,8 +255,7 @@ wrk_thread(void *priv)
VSL(SLT_WorkThread, 0, "%p end", w); VSL(SLT_WorkThread, 0, "%p end", w);
if (w->vcl != NULL) if (w->vcl != NULL)
VCL_Rel(&w->vcl); VCL_Rel(&w->vcl);
AZ(close(w->pipe[0])); AZ(pthread_cond_destroy(&w->cond));
AZ(close(w->pipe[1]));
if (w->srcaddr != NULL) if (w->srcaddr != NULL)
free(w->srcaddr); free(w->srcaddr);
if (w->nobjhead != NULL) { if (w->nobjhead != NULL) {
...@@ -295,7 +293,7 @@ WRK_QueueSession(struct sess *sp) ...@@ -295,7 +293,7 @@ WRK_QueueSession(struct sess *sp)
VTAILQ_REMOVE(&qp->idle, w, list); VTAILQ_REMOVE(&qp->idle, w, list);
UNLOCK(&qp->mtx); UNLOCK(&qp->mtx);
w->wrq = &sp->workreq; w->wrq = &sp->workreq;
assert(1 == write(w->pipe[1], w, 1)); AZ(pthread_cond_signal(&w->cond));
return; return;
} }
...@@ -423,7 +421,7 @@ wrk_reaperthread(void *priv) ...@@ -423,7 +421,7 @@ wrk_reaperthread(void *priv)
if (w == NULL) if (w == NULL)
continue; continue;
AZ(w->wrq); AZ(w->wrq);
assert(1 == write(w->pipe[1], w, 1)); AZ(pthread_cond_signal(&w->cond));
} }
} }
} }
......
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