]> err.no Git - varnish/commitdiff
Preallocate a srcaddr per workerthread to speed up locked section.
authorphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Sat, 16 Sep 2006 21:35:44 +0000 (21:35 +0000)
committerphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Sat, 16 Sep 2006 21:35:44 +0000 (21:35 +0000)
Remember to free preallocated storage in workerthread.

git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@1039 d4fa192b-c00b-0410-8231-f00ffab90ce4

varnish-cache/bin/varnishd/cache.h
varnish-cache/bin/varnishd/cache_pool.c
varnish-cache/bin/varnishd/cache_session.c

index a581386c499b3e8d6e7d10918883523262b3f63a..a4a3a190bce26cf263db50959b8a09e8a53c6f84 100644 (file)
@@ -113,6 +113,7 @@ struct worker {
        size_t                  liov;
 
        struct VCL_conf         *vcl;
+       struct srcaddr          *srcaddr;
 };
 
 struct workreq {
index 84b89ffe99c0f6d48e2ab703faf8135447aebe3f..47ef6942357a95c7f43124fe9d9d368e3048f54c 100644 (file)
@@ -222,6 +222,12 @@ wrk_thread(void *priv)
                VCL_Rel(&w->vcl);
        close(w->pipe[0]);
        close(w->pipe[1]);
+       if (w->srcaddr != NULL)
+               free(w->srcaddr);
+       if (w->nobjhead != NULL)
+               free(w->nobjhead);
+       if (w->nobj!= NULL)
+               free(w->nobj);
        return (NULL);
 }
 
index 6b4be7022fb9a6721345ffd7405d261f4356cbfb..bb05578642484ab3c17ee9b04fc6c1c8d6730726 100644 (file)
@@ -105,6 +105,10 @@ SES_RefSrcAddr(struct sess *sp)
        ch = &srchash[v];
        CHECK_OBJ(ch, SRCADDRHEAD_MAGIC);
        now = sp->t_open.tv_sec;
+       if (sp->wrk->srcaddr == NULL) {
+               sp->wrk->srcaddr = calloc(sizeof *sp->wrk->srcaddr, 1);
+               XXXAN(sp->wrk->srcaddr);
+       }
 
        LOCK(&ch->mtx);
        c3 = NULL;
@@ -117,45 +121,38 @@ SES_RefSrcAddr(struct sess *sp)
                        sp->srcaddr = c;
                        TAILQ_REMOVE(&ch->head, c, list);
                        TAILQ_INSERT_TAIL(&ch->head, c, list);
-                       if (0 && c3 != NULL) {
+                       if (c3 != NULL) {
                                TAILQ_REMOVE(&ch->head, c3, list);
                                VSL_stats->n_srcaddr--;
-                               free(c3);
                        }
                        UNLOCK(&ch->mtx);
+                       if (c3 != NULL)
+                               free(c3);
                        return;
                }
                if (c->nref > 0 || c->ttl > now)
                        continue;
-               if (c3 == NULL) {
+               if (c3 == NULL)
                        c3 = c;
-                       continue;
-               }
-               TAILQ_REMOVE(&ch->head, c, list);
-               free(c);
-               VSL_stats->n_srcaddr--;
        }
        if (c3 == NULL) {
-               c3 = malloc(sizeof *c3);
-               XXXAN(c3);
-               if (c3 != NULL)
-                       VSL_stats->n_srcaddr++;
+               c3 = sp->wrk->srcaddr;
+               sp->wrk->srcaddr = NULL;
+               VSL_stats->n_srcaddr++;
        } else
                TAILQ_REMOVE(&ch->head, c3, list);
        AN(c3);
-       if (c3 != NULL) {
-               memset(c3, 0, sizeof *c3);
-               strcpy(c3->addr, sp->addr);
-               c3->magic = SRCADDR_MAGIC;
-               c3->hash = u;
-               c3->acct.first = now;
-               c3->ttl = now + params->srcaddr_ttl;
-               c3->nref = 1;
-               c3->sah = ch;
-               VSL_stats->n_srcaddr_act++;
-               TAILQ_INSERT_TAIL(&ch->head, c3, list);
-               sp->srcaddr = c3;
-       }
+       memset(c3, 0, sizeof *c3);
+       c3->magic = SRCADDR_MAGIC;
+       strcpy(c3->addr, sp->addr);
+       c3->hash = u;
+       c3->acct.first = now;
+       c3->ttl = now + params->srcaddr_ttl;
+       c3->nref = 1;
+       c3->sah = ch;
+       VSL_stats->n_srcaddr_act++;
+       TAILQ_INSERT_TAIL(&ch->head, c3, list);
+       sp->srcaddr = c3;
        UNLOCK(&ch->mtx);
 }