Commit 330e79a3 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Use a pipe for synchronization instead.


git-svn-id: http://www.varnish-cache.org/svn/trunk/varnish-cache@966 d4fa192b-c00b-0410-8231-f00ffab90ce4
parent 3c56a0c8
...@@ -101,8 +101,7 @@ struct worker { ...@@ -101,8 +101,7 @@ struct worker {
time_t idle; time_t idle;
pthread_cond_t cv; int pipe[2];
pthread_mutex_t mtx;
TAILQ_ENTRY(worker) list; TAILQ_ENTRY(worker) list;
struct workreq *wrq; struct workreq *wrq;
......
...@@ -149,14 +149,14 @@ static void * ...@@ -149,14 +149,14 @@ static void *
wrk_thread(void *priv) wrk_thread(void *priv)
{ {
struct worker *w, ww; struct worker *w, ww;
char c;
(void)priv; (void)priv;
w = &ww; w = &ww;
memset(w, 0, sizeof *w); memset(w, 0, sizeof *w);
w->magic = WORKER_MAGIC; w->magic = WORKER_MAGIC;
w->idle = time(NULL); w->idle = time(NULL);
AZ(pthread_cond_init(&w->cv, NULL)); AZ(pipe(w->pipe));
AZ(pthread_mutex_init(&w->mtx, NULL));
VSL(SLT_WorkThread, 0, "%p start", w); VSL(SLT_WorkThread, 0, "%p start", w);
LOCK(&wrk_mtx); LOCK(&wrk_mtx);
...@@ -170,6 +170,7 @@ wrk_thread(void *priv) ...@@ -170,6 +170,7 @@ wrk_thread(void *priv)
if (wrk_overflow > 0) { if (wrk_overflow > 0) {
wrk_overflow--; wrk_overflow--;
w->wrq = TAILQ_FIRST(&wrk_reqhead); w->wrq = TAILQ_FIRST(&wrk_reqhead);
AN(w->wrq);
TAILQ_REMOVE(&wrk_reqhead, w->wrq, list); TAILQ_REMOVE(&wrk_reqhead, w->wrq, list);
VSL_stats->n_wrk_queue--; VSL_stats->n_wrk_queue--;
UNLOCK(&wrk_mtx); UNLOCK(&wrk_mtx);
...@@ -183,9 +184,7 @@ wrk_thread(void *priv) ...@@ -183,9 +184,7 @@ wrk_thread(void *priv)
assert(w->idle != 0); assert(w->idle != 0);
VSL_stats->n_wrk_busy--; VSL_stats->n_wrk_busy--;
UNLOCK(&wrk_mtx); UNLOCK(&wrk_mtx);
LOCK(&w->mtx); assert(1 == read(w->pipe[0], &c, 1));
AZ(pthread_cond_wait(&w->cv, &w->mtx));
UNLOCK(&w->mtx);
if (w->idle == 0) if (w->idle == 0)
break; break;
wrk_do_one(w); wrk_do_one(w);
...@@ -195,7 +194,6 @@ wrk_thread(void *priv) ...@@ -195,7 +194,6 @@ wrk_thread(void *priv)
VSL_stats->n_wrk--; VSL_stats->n_wrk--;
UNLOCK(&wrk_mtx); UNLOCK(&wrk_mtx);
VSL(SLT_WorkThread, 0, "%p end", w); VSL(SLT_WorkThread, 0, "%p end", w);
AZ(pthread_cond_destroy(&w->cv));
return (NULL); return (NULL);
} }
...@@ -219,7 +217,7 @@ WRK_QueueSession(struct sess *sp) ...@@ -219,7 +217,7 @@ WRK_QueueSession(struct sess *sp)
VSL_stats->n_wrk_busy++; VSL_stats->n_wrk_busy++;
UNLOCK(&wrk_mtx); UNLOCK(&wrk_mtx);
w->wrq = &sp->workreq; w->wrq = &sp->workreq;
AZ(pthread_cond_signal(&w->cv)); assert(1 == write(w->pipe[1], w, 1));
return; return;
} }
...@@ -277,7 +275,7 @@ wrk_reaperthread(void *priv) ...@@ -277,7 +275,7 @@ wrk_reaperthread(void *priv)
if (w == NULL) if (w == NULL)
continue; continue;
w->idle = 0; w->idle = 0;
AZ(pthread_cond_signal(&w->cv)); assert(1 == write(w->pipe[1], w, 1));
} }
INCOMPL(); INCOMPL();
} }
......
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