hgfs: add tree caching

This commit is contained in:
cinap_lenrek 2011-06-27 09:45:33 +00:00
parent 637a770a16
commit 2b5a7cebc2
3 changed files with 48 additions and 10 deletions

View file

@ -66,10 +66,7 @@ struct Revinfo
struct Revtree
{
Ref;
int level;
Revinfo *info;
Revnode *root;
};

View file

@ -53,6 +53,47 @@ getrevinfo(int rev)
return ri;
}
static Revtree*
getrevtree(Revtree *(*fn)(Revlog *, Revlog *, Revinfo *), Revinfo *ri)
{
static ulong gen;
static struct {
ulong g;
void *f;
Revinfo *i;
Revtree *t;
} cache[4];
Revtree *rt;
int i, j;
for(i=j=0; i<nelem(cache); i++){
if(cache[i].t == nil){
j = i;
continue;
}
if(cache[i].f == fn && cache[i].i == ri){
cache[i].g = ++gen;
rt = cache[i].t;
goto found;
}
if(cache[j].t && cache[i].g < cache[j].g)
j = i;
}
if((rt = (*fn)(&changelog, &manifest, ri)) == nil)
return nil;
closerevtree(cache[j].t);
cache[j].g = ++gen;
cache[j].f = fn;
cache[j].i = ri;
cache[j].t = rt;
found:
incref(rt);
return rt;
}
static char*
fsmkuid(char *s)
{
@ -281,6 +322,7 @@ findrev(Revlog *rl, char *name)
static char*
fswalk1(Fid *fid, char *name, Qid *qid)
{
Revtree* (*loadfn)(Revlog *, Revlog *, Revinfo *);
Revfile *rf;
Revnode *nd;
int i;
@ -329,19 +371,20 @@ fswalk1(Fid *fid, char *name, Qid *qid)
if(strcmp(name, nametab[i]) == 0)
break;
}
loadfn = nil;
switch(i){
case Qtree:
goto Notfound;
case Qfiles:
if((rf->tree = loadfilestree(&changelog, &manifest, rf->info)) == nil)
goto Notfound;
loadfn = loadfilestree;
break;
case Qchanges:
if((rf->tree = loadchangestree(&changelog, &manifest, rf->info)) == nil)
goto Notfound;
loadfn = loadchangestree;
break;
}
if(rf->tree){
if(loadfn){
if((rf->tree = getrevtree(loadfn, rf->info)) == nil)
goto Notfound;
rf->node = rf->tree->root;
rf->tree->level = i;
}

View file

@ -164,8 +164,6 @@ loadtree(Revlog *manifest, Revinfo *ri, Hashstr **ht, int nh)
memset(t, 0, sizeof(*t));
incref(t);
t->info = ri;
t->root = malloc(sizeof(Revnode));
t->root->path = 0;
t->root->name = 0;