]> err.no Git - varnish/commitdiff
When we know that an object will not make it into the hash
authorphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Sat, 28 Feb 2009 19:00:00 +0000 (19:00 +0000)
committerphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Sat, 28 Feb 2009 19:00:00 +0000 (19:00 +0000)
table permanently, use malloc(3) as backing store.

This affects mainly pass'ed requests.

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

varnish-cache/bin/varnishd/cache_center.c
varnish-cache/bin/varnishd/cache_hash.c
varnish-cache/bin/varnishd/hash_slinger.h

index b5ebbb487f1c03f761bc6c11a40398cbd975f056..27ed592369265fb6a329fc7c7c89b5fc94d08536 100644 (file)
@@ -314,7 +314,7 @@ cnt_error(struct sess *sp)
        w = sp->wrk;
        if (sp->obj == NULL) {
                HSH_Prealloc(sp);
-               sp->obj = HSH_NewObject(sp);
+               sp->obj = HSH_NewObject(sp, 1);
                sp->obj->xid = sp->xid;
                sp->obj->entered = sp->t_req;
        } else {
@@ -682,7 +682,7 @@ cnt_lookup(struct sess *sp)
                VSL_stats->cache_miss++;
 
                AZ(oc->obj);
-               o = HSH_NewObject(sp);
+               o = HSH_NewObject(sp, 0);
 
                o->objhead = oh;
                o->objcore = oc;
@@ -819,7 +819,7 @@ cnt_pass(struct sess *sp)
        assert(sp->handling == VCL_RET_PASS);
        sp->acct_req.pass++;
        HSH_Prealloc(sp);
-       sp->obj = HSH_NewObject(sp);
+       sp->obj = HSH_NewObject(sp, 1);
        sp->sendbody = 1;
        sp->step = STP_FETCH;
        return (0);
index fc1d3629dc2b4aa295531a0c6bbf4aaca681e70b..f891eb641553300ce023002d6bb9457c41747db2 100644 (file)
@@ -80,24 +80,35 @@ HSH_Grace(double g)
 }
 
 struct object *
-HSH_NewObject(struct sess *sp)
+HSH_NewObject(struct sess *sp, int transient)
 {
        struct object *o;
        struct storage *st;
-
-       st = STV_alloc(sp, params->obj_workspace);
-       XXXAN(st);
-       assert(st->space > sizeof *o);
-       o = (void *)st->ptr; /* XXX: align ? */
-       st->len = sizeof *o;
-       memset(o, 0, sizeof *o);
-       o->objstore = st;
-       WS_Init(o->ws_o, "obj",
-           st->ptr + st->len, st->space - st->len);
-       st->len = st->space;
+       void *p;
+
+       if (transient) {
+               p = malloc(sizeof *o + params->obj_workspace);
+               XXXAN(p);
+               o = p;
+               p = o + 1;
+               memset(o, 0, sizeof *o);
+               o->magic = OBJECT_MAGIC;
+               WS_Init(o->ws_o, "obj", p, params->obj_workspace);
+       } else {
+               st = STV_alloc(sp, params->obj_workspace);
+               XXXAN(st);
+               assert(st->space > sizeof *o);
+               o = (void *)st->ptr; /* XXX: align ? */
+               st->len = sizeof *o;
+               memset(o, 0, sizeof *o);
+               o->magic = OBJECT_MAGIC;
+               o->objstore = st;
+               WS_Init(o->ws_o, "obj",
+                   st->ptr + st->len, st->space - st->len);
+               st->len = st->space;
+       }
        WS_Assert(o->ws_o);
        http_Setup(o->http, o->ws_o);
-       o->magic = OBJECT_MAGIC;
        o->http->magic = HTTP_MAGIC;
        o->refcnt = 1;
        o->grace = NAN;
@@ -510,7 +521,10 @@ HSH_Deref(const struct worker *w, struct object **oo)
 
        ESI_Destroy(o);
        HSH_Freestore(o);
-       STV_free(o->objstore);
+       if (o->objstore != NULL)
+               STV_free(o->objstore);
+       else
+               FREE_OBJ(o);
        w->stats->n_object--;
 
        if (oh == NULL) {
index e86345704343d7ac8437c2684ab738dfba72cd87..9b834f198c58363acf67a28699846fe83dd34e87 100644 (file)
@@ -50,7 +50,7 @@ struct hash_slinger {
 };
 
 /* cache_hash.c */
-struct object *HSH_NewObject(struct sess *sp);
+struct object *HSH_NewObject(struct sess *sp, int transient);
 void HSH_Prealloc(const struct sess *sp);
 void HSH_Cleanup(struct worker *w);
 void HSH_Freestore(struct object *o);