Ignore:
Timestamp:
2007-08-06 10:25:20 (7 years ago)
Author:
Poul-Henning Kamp <phk@…>
Branches:
master, 1.2, 3.0, 4.0, experimental-ims
Children:
cc2164
Parents:
c8fff9
git-author:
Poul-Henning Kamp <phk@…> (2007-08-06 10:25:20)
git-committer:
Poul-Henning Kamp <phk@…> (2007-08-06 10:25:20)
Message:

Rewrite the req.hash implmentation:

Instead of assembling the entire hash-string in the workspace, use
a scatter gather approach, hinted by the VCL compiler.

This eliminates the workspace reservation which prevented regsub() from
working in vcl_hash, and reduces the size of the necessary workspace a
fair bit as well, at the cost of a little bit of complexity in the
hash implmentations.

Closes ticket 137 and possibly 141

git-svn-id:  http://www.varnish-cache.org/svn/trunk/varnish-cache@1805 d4fa192b-c00b-0410-8231-f00ffab90ce4

File:
1 edited

Legend:

Unmodified
Added
Removed
  • bin/varnishd/cache_hash.c

    r21e4ad r93a770e  
    110110} 
    111111 
     112int 
     113HSH_Compare(struct sess *sp, const char *b, const char *e) 
     114{ 
     115        int i; 
     116        unsigned u, v; 
     117 
     118        i = sp->lhashptr - (e - b); 
     119        if (i) 
     120                return (i); 
     121        for (u = 0; u < sp->ihashptr; u += 2) { 
     122                v = sp->hashptr[u + 1] - sp->hashptr[u]; 
     123                i = memcmp(sp->hashptr[u], b, v); 
     124                if (i) 
     125                        return (i); 
     126                b += v; 
     127                i = '#' - *b++; 
     128                if (i) 
     129                        return (i); 
     130        } 
     131        assert(*b == '\0'); 
     132        b++; 
     133        assert(b == e); 
     134        return (0); 
     135} 
     136 
     137void 
     138HSH_Copy(struct sess *sp, char *b, const char *e) 
     139{ 
     140        unsigned u, v; 
     141 
     142        assert((e - b) >= sp->lhashptr); 
     143        for (u = 0; u < sp->ihashptr; u += 2) { 
     144                v = sp->hashptr[u + 1] - sp->hashptr[u]; 
     145                memcpy(b, sp->hashptr[u], v); 
     146                b += v; 
     147                *b++ = '#'; 
     148        } 
     149        *b++ = '\0'; 
     150        assert(b <= e); 
     151} 
     152 
    112153struct object * 
    113154HSH_Lookup(struct sess *sp) 
     
    134175                goto were_back; 
    135176        } 
    136 VSLR(SLT_Debug, sp->fd, sp->hash_b, sp->hash_e); 
    137  
    138         oh = hash->lookup(sp->hash_b, sp->hash_e, w->nobjhead); 
     177 
     178        oh = hash->lookup(sp, w->nobjhead); 
    139179        CHECK_OBJ_NOTNULL(oh, OBJHEAD_MAGIC); 
    140180        if (oh == w->nobjhead) 
Note: See TracChangeset for help on using the changeset viewer.