From 2b5a7cebc2274c5780e2cf62d3e18d0171773231 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Mon, 27 Jun 2011 09:45:33 +0000 Subject: hgfs: add tree caching --- sys/src/cmd/hgfs/dat.h | 3 --- sys/src/cmd/hgfs/fs.c | 53 ++++++++++++++++++++++++++++++++++++++++++++----- sys/src/cmd/hgfs/tree.c | 2 -- 3 files changed, 48 insertions(+), 10 deletions(-) diff --git a/sys/src/cmd/hgfs/dat.h b/sys/src/cmd/hgfs/dat.h index c63065843..111275649 100644 --- a/sys/src/cmd/hgfs/dat.h +++ b/sys/src/cmd/hgfs/dat.h @@ -66,10 +66,7 @@ struct Revinfo struct Revtree { Ref; - int level; - - Revinfo *info; Revnode *root; }; diff --git a/sys/src/cmd/hgfs/fs.c b/sys/src/cmd/hgfs/fs.c index fea6d214b..0c977d2cc 100644 --- a/sys/src/cmd/hgfs/fs.c +++ b/sys/src/cmd/hgfs/fs.c @@ -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; itree = 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; } diff --git a/sys/src/cmd/hgfs/tree.c b/sys/src/cmd/hgfs/tree.c index 118c9ac5e..cf71b0c4a 100644 --- a/sys/src/cmd/hgfs/tree.c +++ b/sys/src/cmd/hgfs/tree.c @@ -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; -- cgit v1.2.3