From: Junio C Hamano Date: Mon, 25 Mar 2013 23:15:41 GMT Subject: Re: [PATCH v2 2/3] Refactor parts of in_delta_base_cache/cache_or_unpack_entry Message-ID: <7vtxnzul42.fsf@alter.siamese.dyndns.org> In-Reply-To: <987ab8138000d0aaa7d1bb6242cced1344e4d339.1364234154.git.trast@student.ethz.ch> Thomas Rast writes: > The delta base cache lookup and test were shared. Refactor them; > we'll need both parts again. Also, we'll use the clearing routine > later. > > Signed-off-by: Thomas Rast > --- Looks like a very straight-forward rewrite. The only little concern I may have is this cmp_* function tells us "I found it!" by returning true, which is counter-intuitive to the readers of the caller (not the callee). I think it makes sense to compare delta-base-cache entries only for equality, so eq-delta-base-cache-entry might be a better name for it, perhaps? > sha1_file.c | 45 ++++++++++++++++++++++++++++++++------------- > 1 file changed, 32 insertions(+), 13 deletions(-) > > diff --git a/sha1_file.c b/sha1_file.c > index 71877a7..bd054d1 100644 > --- a/sha1_file.c > +++ b/sha1_file.c > @@ -1756,32 +1756,51 @@ static unsigned long pack_entry_hash(struct packed_git *p, off_t base_offset) > return hash % MAX_DELTA_CACHE; > } > > -static int in_delta_base_cache(struct packed_git *p, off_t base_offset) > +static struct delta_base_cache_entry * > +get_delta_base_cache_entry(struct packed_git *p, off_t base_offset) > { > unsigned long hash = pack_entry_hash(p, base_offset); > - struct delta_base_cache_entry *ent = delta_base_cache + hash; > + return delta_base_cache + hash; > +} > + > +static int cmp_delta_base_cache_entry(struct delta_base_cache_entry *ent, > + struct packed_git *p, off_t base_offset) > +{ > return (ent->data && ent->p == p && ent->base_offset == base_offset); > } > > +static int in_delta_base_cache(struct packed_git *p, off_t base_offset) > +{ > + struct delta_base_cache_entry *ent; > + ent = get_delta_base_cache_entry(p, base_offset); > + return cmp_delta_base_cache_entry(ent, p, base_offset); > +} > + > +static void clear_delta_base_cache_entry(struct delta_base_cache_entry *ent) > +{ > + ent->data = NULL; > + ent->lru.next->prev = ent->lru.prev; > + ent->lru.prev->next = ent->lru.next; > + delta_base_cached -= ent->size; > +} > + > static void *cache_or_unpack_entry(struct packed_git *p, off_t base_offset, > unsigned long *base_size, enum object_type *type, int keep_cache) > { > + struct delta_base_cache_entry *ent; > void *ret; > - unsigned long hash = pack_entry_hash(p, base_offset); > - struct delta_base_cache_entry *ent = delta_base_cache + hash; > > - ret = ent->data; > - if (!ret || ent->p != p || ent->base_offset != base_offset) > + ent = get_delta_base_cache_entry(p, base_offset); > + > + if (!cmp_delta_base_cache_entry(ent, p, base_offset)) > return unpack_entry(p, base_offset, type, base_size); > > - if (!keep_cache) { > - ent->data = NULL; > - ent->lru.next->prev = ent->lru.prev; > - ent->lru.prev->next = ent->lru.next; > - delta_base_cached -= ent->size; > - } else { > + ret = ent->data; > + > + if (!keep_cache) > + clear_delta_base_cache_entry(ent); > + else > ret = xmemdupz(ent->data, ent->size); > - } > *type = ent->type; > *base_size = ent->size; > return ret;