Skip to content

Commit

Permalink
name-hash.c: remove unreferenced directory entries
Browse files Browse the repository at this point in the history
The new hashmap implementation supports remove, so remove and free
directory entries that are no longer referenced by active cache entries.

Signed-off-by: Karsten Blees <blees@dcon.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Karsten Blees authored and Junio C Hamano committed Nov 18, 2013
1 parent e05881a commit 1c8cca1
Showing 1 changed file with 8 additions and 7 deletions.
15 changes: 8 additions & 7 deletions name-hash.c
Original file line number Diff line number Diff line change
Expand Up @@ -86,15 +86,16 @@ static void add_dir_entry(struct index_state *istate, struct cache_entry *ce)
static void remove_dir_entry(struct index_state *istate, struct cache_entry *ce)
{
/*
* Release reference to the directory entry (and parents if 0).
*
* Note: we do not remove / free the entry because there's no
* hash.[ch]::remove_hash and dir->next may point to other entries
* that are still valid, so we must not free the memory.
* Release reference to the directory entry. If 0, remove and continue
* with parent directory.
*/
struct dir_entry *dir = hash_dir_entry(istate, ce, ce_namelen(ce));
while (dir && dir->nr && !(--dir->nr))
dir = dir->parent;
while (dir && !(--dir->nr)) {
struct dir_entry *parent = dir->parent;
hashmap_remove(&istate->dir_hash, dir, NULL);
free(dir);
dir = parent;
}
}

static void hash_index_entry(struct index_state *istate, struct cache_entry *ce)
Expand Down

0 comments on commit 1c8cca1

Please sign in to comment.